| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
| |
Lest an int-only op, having lifted result types to int, get a zero-fold (e.g. X^0) to their mode-not-set input and have types fall.
Handle idepth-cache overflow
|
| |
|
|
|
| |
Fix keep/unkeep balance.
Always fuzz small.
|
| | |
|
| |
|
|
|
|
| |
Missing Arith mode picks high or low according to pre/post Opto
FunPtr improves sig return based on Opto return type.
Minus with missing mode is optimistic, same as Arith
|
| |
|
|
|
|
|
| |
IterPeeps cnt does not reset.
Faster schedulableIses, reuses ID Map.
Test in Iter work if not GVN table
ScheduableUses peeks through folding/dead Call/Fun
|
| |
|
|
|
|
|
|
| |
Robust assert about all data ops are schedulable.
Utiltiies for several places domionator-like stuff is used.
Removing a Phi with matching null/not-null values is now more robust; removes a major source if scheduling misalignment.
Big comments about what gets covered by a null check, or not.
Permanent list of fuzzer seeds that used to fail
|
| | |
|
| |
|
|
| |
Allowed only if the replacement does not fall, will be lifted by OR to an TypeInteger
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
FunNodes never GVN.
|
| | |
|
| |
|
|
| |
A lot of tests become asserts; general cleanup in MemOps and PhiOps
|
| |\ |
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The node recap tables in chapters 4 and 5 classify `Proj` as "Data", but
`ProjNode.isCFG()` has returned true for control projections since chapter 4:
ch4: return _idx==0;
ch5+: return _idx==0 || ctrl() instanceof IfNode;
So `Proj#0` off `Start` is a control node, and from chapter 5 both projections
off an `If` are too -- which is exactly why the dominator walk in
`IfNode.compute()` can step through them.
Change the Type column to "Data / Control" and add a note under each table
pointing at `isCFG()`. Table alignment is unchanged: "Data / Control" is the
same width as "Abstract class".
Docs-only change.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The three comment lines above `AddNode.phiCon(this, ...)` in BoolNode were
copy-pasted from MulNode and never adapted: they use `*` as the operator and
describe the rotated shape `(x * (phi cons)) * con`.
For BoolNode neither is right. The operator is a compare, and in chapters
6-9 `rotate` is hard-coded `false`, so the rotated shape is never matched;
the shapes actually handled are `(phi cons) cmp con` and
`(phi cons) cmp (phi cons)`.
Reword the comment accordingly, and in chapters 6-9 add a line noting why
rotate is off. Chapters 10-25 pass `this instanceof EQ`, so no such claim is
made there.
Comment-only change; no code is touched.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The add canonicalization builds a left-leaning chain of AddNodes -- the
"spine" -- with off-spine operands hanging off each in(2). The comparator
and its comments were spelled "spline" (a curve / mechanical part), which
was already inconsistent with the goal comment in the same method:
// Goal: a left-spine set of adds, with constants on the rhs
Chapters 9 and later already use "spine" / "spine_cmp"; this brings the
earlier chapters in line.
Comment and private-method-name only, no behavior change.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
|
| |/ |
|
| | |
|
| | |
|
| |
|
|
| |
Clarify several TODO's as "Should not reach here"
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
commit a00bfc643e834498b020eb47ee37da4a17cf6e39
Author: Cliff Click <cliffc@acm.org>
Date: Thu Aug 20 12:27:52 2026 -0700
Add a emacs Simple.el mode
commit b5b399e16038d20ba6928aa329268b229b90e2f7
Author: Cliff Click <cliffc@acm.org>
Date: Thu Aug 20 11:37:17 2026 -0700
Tone down expensive asserts
Put the expensive asserts on a log-scale flag, run them only once every 2^N attempts
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
commit c05d7df4f9c90984d2c04126772be3fee1d81fd1
Author: Cliff Click <cliffc@acm.org>
Date: Thu Aug 20 10:52:58 2026 -0700
Fix local frefs, deferred inlining, and sys FileIO support
- Defer non-trivial inlining out of CallEnd idealization and run it from IterPeeps after normal peepholes reach a fixed point.
- Keep forward refs local to their lexical scope, promote them outward on scope pop, and track created FRefNodes directly for dependency discovery.
- Preserve loop scope shape when frefs are first seen inside loop bodies.
- Treat frefs as final constants from creation and force lazy self lookups before implicit calls.
- Reset imported pointer/struct types conservatively for post-parse Iter.
- Pin Start-owned global machine value chains and clone global constants per function during GCM.
- Improve late ASM printing before encoding and namespace constant-pool symbols.
- Add optional regalloc function-local edge verifier and improve empty-mask splitting for multi-def/fixed-register LRGs.
- Add sys array compare, safer array copy bounds, libc open/creat/close/unlink bindings, aryu8.str0, and higher-level sys.io file operations.
- Add docs/examples/FileIO.smp and a Chapter25 FileIO test.
- Update spill/code-size goldens after the allocator and scheduling changes.
commit ef5316979732ac118612d310b75923c8f59ecdc1
Author: Cliff Click <cliffc@acm.org>
Date: Fri Aug 14 16:29:56 2026 -0700
Dijkstra uses bitset.
TestC.exec for repeated test runs with different stdins.
Support &= and |= op-update forms.
commit 728a527587f19bb49860f02ae5ac5968ab01ae33
Author: Cliff Click <cliffc@acm.org>
Date: Fri Aug 14 12:13:28 2026 -0700
Fix live demo
commit e4c069b9ef2cbfafe28d8edfcbff55396cde085e
Author: Cliff Click <cliffc@acm.org>
Date: Fri Aug 14 09:52:24 2026 -0700
Update Dijkstra.smp
commit b8015739b4056e3f7a715a030e846a441021a9f1
Author: Cliff Click <cliffc@acm.org>
Date: Fri Aug 14 09:41:17 2026 -0700
Better looking Dijkstra
commit 7cce587804c6169b24829e0b5bdc10be94357a31
Author: Cliff Click <cliffc@acm.org>
Date: Fri Aug 14 09:33:33 2026 -0700
Fix CmpMemX86 encoding
Use sys.aryu8 for number printing
commit 310b5d8c9978a3b09622a4b89dac97f0e5e6f3fb
Author: Cliff Click <cliffc@acm.org>
Date: Fri Aug 14 09:04:58 2026 -0700
Progress dijlstra
Fix NotX86 encoding. Allow Not-sinking through Phis; the Nots both take Scalar and might take different types (ptr vs int). Better guard installing during && || opers.
Drop the csv parse flavor in sys lib.
commit 5917d5322521dd5e762c4698d34e5d7ac9b3a37f
Author: Cliff Click <cliffc@acm.org>
Date: Thu Aug 13 14:44:12 2026 -0700
missed
commit da35ad4d8a330559a21c04ae6326536e0fd62c48
Author: Cliff Click <cliffc@acm.org>
Date: Thu Aug 13 14:43:42 2026 -0700
Major cleanup of allocation
All the graph-gen is moved to the <ctor> declaration and not at the alloc site.
commit c4223216099ccbc526d282bb263972532d48c5b2
Author: Cliff Click <cliffc@acm.org>
Date: Thu Aug 13 13:26:01 2026 -0700
Some work from Dykstra (more coming)
commit a03bc567f61dc7e4355e453ee4be16ac2528d1ab
Author: Cliff Click <cliffc@acm.org>
Date: Thu Aug 13 09:32:55 2026 -0700
Spill correctness and improvements
Had the callee-save pick-risky backwards vs cloneables.
commit 2d306e4430225f916cb7fb999f4926e52f6fb70a
Author: Cliff Click <cliffc@acm.org>
Date: Wed Aug 12 19:40:04 2026 -0700
Tighter parser handling of missing fields
Bug fix add libc.errno, read can return -1, sys.ary exists
commit b7eeefda4cafa1e86153170dca6f13d45ef63f69
Author: Cliff Click <cliffc@acm.org>
Date: Wed Aug 12 16:22:48 2026 -0700
Printer improvements
commit 8b9112226f1d2d1c843b080eecefe0d5ddc1f8cf
Author: Cliff Click <cliffc@acm.org>
Date: Wed Aug 12 15:30:46 2026 -0700
Remove GLB
commit ae566f5c610b9c30831906d3f024901d8930a227
Author: Cliff Click <cliffc@acm.org>
Date: Wed Aug 12 14:38:51 2026 -0700
Add Capitalize example
Rename Ary to ary.
Fix bug || carrying state along.
Fix bug load-array removing control.
Add sys.char tolower/upper
|
| |
|
|
| |
Beef up BubbleSort error handling
|
| |
|
|
|
| |
Allow setting random seeds to not fail tests due to e.g. spill-counts or exact graph shapes.
A few missing addDeps or stalling-for-constants fixed.
|
| | |
|
| |
|
|
|
| |
Add a explicit "emit_main" flag in case you use no_run.
Fix a make parallel bug
|
| |
|
|
| |
A little less aggressive FunPtr trimming before Opto
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Introduce Chapter 25 with separately compiled Simple modules, serialized IR,
cross-compilation-unit linking, and native system-library integration. This
also completes a broad parser and type-system cleanup needed to make graph
construction independent of incomplete parse-time type information.
Separate compilation and linking
- Add compilation-unit Start/Stop nodes and track functions, classes, aliases,
and global indices across compilation-unit boundaries.
- Serialize canonical types and ideal graph nodes into ELF objects, including
dependency metadata, relocations, global/local bitset remapping, and dense
memory-alias information.
- Load dependent objects on demand, recursively resolve source and object
paths, relink calls and function pointers, and preserve external C symbols.
- Distinguish the post-optimization ownership hook from unknown callers so
private call graphs can remain precise while public functions remain
externally callable.
- Add command-line and build support for compiling modules and the reusable
`sys` object library.
Parser, constructors, and SSA
- Replace inline constructor expansion with a hidden default `<init>` followed
by an explicit user constructor declared as `new Type = { ... }`.
- Keep the default constructor private, pass private object memory through
constructor calls, and require user constructors to initialize non-default
fields before the object escapes.
- Track possibly-uninitialized fields in parser `Var` state and diagnose early
reads without encoding parser-only constraints in Load and Store nodes.
- Make ordinary parser memory bulk and recover precise alias slices in the
optimizer using `MemMerge`, `MemPhi`, and `BulkMemPhi` nodes.
- Remove parser-supplied type constraints from Loads and ordinary Phis, defer
integer/float arithmetic selection, and keep call shape driven by syntax
instead of provisional inferred types.
- Preserve chained field declarations as static parser information when flow
types are not yet available, including postfix field updates through calls.
Types, functions, and escape analysis
- Add `TypeScalar` as the common lattice family for integer, float, memory
pointer, and function-pointer values, with scalar TOP/BOT values for generic
Loads, Stores, parameters, and invalid intermediate expressions.
- Represent unresolved struct definitions directly with the `TypeStruct`
forward-reference flag while retaining the separate open-structure concept;
close and canonicalize recursive structures without side maps.
- Add explicit `FunPtrNode` references so constant function pointers retain a
graph edge to their Return, and keep referenced functions alive until Opto
proves the pointer dead.
- Refine public-function and class-initializer escape handling, including
public-only fallback escape sets and monotone compilation-unit summaries.
- Add guards, proof casts, read-only propagation, pointer-to-integer conversion
for non-null FFI arguments, and consistent deep mutability checks at calls.
Optimization and code generation
- Make weak and unresolved graph inputs compute conservatively and monotonically
throughout iterative peepholes and SCCP.
- Preserve independent memory slices when sharpening Stores, retain control on
conditional Stores, and freeze Store widths from their target field types.
- Extend serialization for new node kinds, scalar types, Store modes, function
pointers, and memory partitions, preserving serialize/deserialize bijection.
- Complete native selection and encoding support across x86-64, RISC-V, and
ARM, including FFI pointer conversion and missing integer operations.
- Fix x86 immediate multiply REX encoding and assorted scheduling, register
allocation, spilling, relocation, and constant-pool issues exposed by the
larger linked graphs.
System library, tests, and documentation
- Compile and link the Simple `sys` library, including libc bindings, I/O,
scanners, strings, vectors, array helpers, and executable entry points.
- Add Chapter 25 module, serialization, constructor, forward-reference,
postfix-update, system, Hello World, and Bubble Sort coverage; update golden
graphs and spill expectations for the new IR shape.
- Add module and type-system documentation, parser-simplification design notes,
grammar updates, examples, diagrams, and graph visualization assets.
The resulting compiler passes the raw Chapter 1-24 suite and the Chapter 25
system and separate-compilation tests, including a freshly rebuilt `sys.o` and
the native Bubble Sort example.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
| |
Co-authored-by: tejasae-afk <tejasae-afk@users.noreply.github.com>
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
| |
"first-class" should be written together
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* merge fixup
* More x86,risc,arm call convention fixes
Collect callee and caller save masks (inverts of each other, except for spills).
Reorg layout to be closer to each other; remove dead mask definitions; add final keyword
* lui fix up with 32 bit immediates
* Callee-save registers
Callee-save registers and masks and inserting LRGs for same and spilling and picking good spills. Insert CalleeSaveNodes and edges to RetXXXs and RegMasks for those edges.
Iterators for regmask.
Better printing post-allocation
* RegMask supports 128 bits
All regs available arm, risc.
MergeSort compiles & runs
* added flags splitting
* Fix risc5 compares
No flags on risc5.
Branch takes 2 inputs (one can be imm12).
Float compare only sets a GPR to 0/1.
Bool has a isFloat
Common risc5 imm-form handling
* extend test cases
* imm encoding, flags fixed
* grep for Todo: relocs
* float riscv fixed
* flags for set
* lui fix for small bits [0, 12]
* arm init
* arm last touches
* fmov still needs fix
* minor fixes
* minor fixes(2)
* got rid of unnecessary stuff
* create ch21
* remove encodings from chapter20 dir
* 1/2 pass cleaning up ARM encoding API
* ARM encoding compiles
* Risc R_TYPE and I_TYPE
* Progress RISC encodings
Missing lots of stuff still
* progress risc encoding
* risc encodings compile
* Update README.md
* Fold up redundant OP/OP-FP risc5 encoding
* x86 mem opcodes first cut
break out MemOp encodings into parts; change x86 indirectAdr to use Encoding class, remove redundant asserts & code
* x86 mem op encodings
* x86 reg+imm forms
* most reg-reg forms
* More x86 encodings
* Last few encodings
* switch to binary literals over decimals for opcodes
* logical immediates fixed, bitwise ops imm forms
* tfp and setArm fixed
* PC relative float for riscv
* readme init
* Merged pr/169
* Fixed the array1 test encodings
Clean up branch invert logic during BB layout
Cleanup branch target printing for RISC,ARM
ImmRISC ops mask imm12 to 12 bits
Fix NewRISC; hardcode RPC as part of call
Fix RISC inverting branchs >,>=
* floatarm encoding
* tfparm and intarm
* uncontional jump encoding for arm and riscv
* smarter IntARM, Intx86 does not always include rex.
* REX after PREFIX
* fixup load and store indirect
* updated rex prefix, if its 0x40 then its not needed
* Rex fix for floats, got rid of unnecessary stuff.
* rename to camel case, better param name
* add test export
* merged
* store opt
* store and load optimised forms handled
* tfp patch
* Store/load float arm/riscv/x64
* got rid of debug print
* splits for x86, riscv and arm
* readme fixups
* fix global symbol numbering for constants
* fix TFP pathc on arm and riscv, keep symbols in good order.
* fix opcode for store and loads, memOpRisc for Store and splitting
* replace hard coded opcodes with major opcodes
* replace hard coded opcodes with major opcodes
* add asserts and fix reg numbering
* add asserts and fix reg numbering
* minor updates
* revert changes
* remove constant pool from encoder TODO: add flag for JIT
* extend test cases
* minor fixes
* minor fixes
* update float test case
* stringHash fix on x64
* remove conditional ConstantPool write
* brainfuck minor fixes
* minor arm fixes
* split fix
* brainfuck and fib
* brain fuck
* arg_count, person
* add ignore
* typo
* riscv test sieve attempt
* minor changes
* riscv5 emulator additions
* arm eval setup
* Update riscv.java
* arm eval basics
* delta fixes
* arm fixes
* testfib arm
* arg_count
* small update for test newton
* small update for test newton
* testNewton runs on x64, riscv and arm
* arm additions
* arm pc eval fix
* arm workings
* debugging
* Progress sieve on ARM
Most ops need WMASK as the output, to exclude RSP.
calloc sentinal changes to multiple of 4
NewArm needs to set arg X0 to #1; arg X1 is length.
Fix EvalARM calling calloc & not advancing PC.
Fix EvalARM using ints vs longs.
Fix EvalARM missing AndI encoding.
* Fix some arm encoding
Fix some OBOB in R5 calloc encoding.
Sort EvalArm by major opcodes.
Add ASL. Remove leading switch. Fix OBOB in calloc.
Fix shift in ld/st with reg+offset
* arm sieve test
* test person push
* brainFuck arm
* "and" "or" syntactic sugar
* update encoding
* ch23 `and` `or`
* hack parse trinary for and, or
* close
* fixed or issue
* Update CallEndNode.java
* fix type issue
* fixed
* Adjust parseTrinary precedence vs && ||
* Fix arm simulation return
* Formatting
* Formatting
* simplify rn to be always 0.
* ch24 init
* stacked rel
* stack init
* stack rel
* remove parenthesis
* got rid of old test case
* update
* upgrade eval
* arm encoding bugs
encodeing cset had a shift wrong
eval missed using 0 for r31
* remove debug prints
* force main to encode first
* fix for missing main
* got rid of debug prints
* backwards with ch23
* simple new test cases
* update test cases
* enable old test
* got rid of own test case
* fix test11
* inline Api
* inline x86_64
* inline test cases
* fix stacked_r_5
* got rid of redundant rdid -1 set
* Several new fuzzer addDeps/keep bugs.
Fix risc/arm spill code values for passing 20 args.
* Update README
Move ch23_ch24 branch into ROADMAP
* Create TypeAnalysis.md
* Update TypeAnalysis.md
* Update TypeAnalysis.md
* More lattices for main
* Update TypeAnalysis.md
* Update TypeAnalysis.md
* TypeAnalysis continued
* fix typos
* pointers
* typo fix in reader
* Update TypeAnalysis.md
* sccp first attempt
* test
* init
* still debug
* Update TypeAnalysis.md
* more examples
* More docs
* Update TypeAnalysis.md
* widen phi nodes in loops
* extra debug stuff for opto
* Work in progress opto pass
* Progress on opto
* opto missing deps
ConFldOff needs String.equals in `eq`
Fix monotonic xfer functions in
- CallENd, CProj, Load, Arith
Mostly if either TOP or BOT inputs, the output is the matching TOP or BOT
* push mid-progress
* progress sccp
* Make all the default parser integer types pre-widen
Function sigs to calls allow wide ints
* progress sccp
* Update TypeInteger.java
* progress SCCP
* Progress SCCP
* Progress SCCP
A series of minor fixes, generally making transfer functions monotonic, or p[reserving sanity for error test cases.
* Progress on opto
Most tests pass, a few failures remain.
Split Opto code into a seperate file.
Improve `compute` precision in several places showing up during opto.
bugfix: "split-thru-phis" on Parms changes calling conventions. Not ready for that yet.
* most tests pass
Handle non-default main.
Simplify trivial inlining cutout test.
ParmNode excludes most Phi opts
Region idom excludes dead paths
RPC now interns
* Fix arm NOT encoding
* all tests pass
Float math handles high types monotonically
Minus node does not reset int widen.
Phi widen handles non-int mintype
Dead returns do not error complain.
Better handling default vs dead main
* If NewNode is high, produce high results
* BrainFuck uses a string
* README
* Update README.md
* Typos from copilot review
* monotonic fix MinusF
* Update TypeAnalysis.md
* Update TypeInteger.java
---------
Co-authored-by: Hadházy Tamás <helsgithub15@gmail.com>
Co-authored-by: Tamás Hadházy <85063808+Hels15@users.noreply.github.com>
|
| | |
|
| | |
|
| | |
|
| | |
|