From a996996a1ad776089a4cb9cbf7744f5f4e8dde6d Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Wed, 30 Sep 2026 16:41:07 -0700 Subject: Forward port mem stuff to ch21 Also a minor reg-alloc improvement for BrainFuck, ported up to ch25 --- .../main/java/com/seaofnodes/simple/Parser.java | 105 +++++---- .../com/seaofnodes/simple/codegen/CodeGen.java | 2 +- .../simple/codegen/GlobalCodeMotion.java | 55 +++-- .../com/seaofnodes/simple/codegen/RegAlloc.java | 16 +- .../com/seaofnodes/simple/node/BulkMemPhiNode.java | 240 +++++++++++++++++++++ .../java/com/seaofnodes/simple/node/LoadNode.java | 194 +++++++++-------- .../java/com/seaofnodes/simple/node/LoopNode.java | 11 +- .../com/seaofnodes/simple/node/MemMergeNode.java | 198 ++++++----------- .../java/com/seaofnodes/simple/node/MemOpNode.java | 35 +++ .../com/seaofnodes/simple/node/MemPhiNode.java | 44 ++++ .../java/com/seaofnodes/simple/node/NewNode.java | 61 ++---- .../main/java/com/seaofnodes/simple/node/Node.java | 13 +- .../java/com/seaofnodes/simple/node/PhiNode.java | 91 +++++--- .../com/seaofnodes/simple/node/RegionNode.java | 2 +- .../com/seaofnodes/simple/node/ReturnNode.java | 12 +- .../java/com/seaofnodes/simple/node/ScopeNode.java | 75 ++++--- .../java/com/seaofnodes/simple/node/StartNode.java | 11 +- .../java/com/seaofnodes/simple/node/StoreNode.java | 28 +-- .../com/seaofnodes/simple/node/cpus/arm/arm.java | 2 + .../seaofnodes/simple/node/cpus/riscv/riscv.java | 2 + .../simple/node/cpus/x86_64_v2/LoadX86.java | 5 + .../simple/node/cpus/x86_64_v2/x86_64_v2.java | 7 +- .../com/seaofnodes/simple/print/IRPrinter.java | 165 ++++++++++++++ .../simple/print/SimpleGraphAdapter.java | 2 +- 24 files changed, 911 insertions(+), 465 deletions(-) create mode 100644 chapter21/src/main/java/com/seaofnodes/simple/node/BulkMemPhiNode.java create mode 100644 chapter21/src/main/java/com/seaofnodes/simple/node/MemPhiNode.java (limited to 'chapter21/src/main') diff --git a/chapter21/src/main/java/com/seaofnodes/simple/Parser.java b/chapter21/src/main/java/com/seaofnodes/simple/Parser.java index fb108447..3b502c44 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/Parser.java @@ -138,7 +138,7 @@ public class Parser { _scope.define(ScopeNode.ARG0, TypeInteger.BOT, false, null, _lexer); ctrl(XCTRL); - _scope.mem(new MemMergeNode(false)); + _scope.mem(con(TypeMem.BOT)); // Parse whole program, as-if function header "{ int arg -> body }" parseFunctionBody(_code._main,loc(),"arg"); @@ -196,7 +196,7 @@ public class Parser { // Build a multi-exit return point for all function returns RegionNode r = new RegionNode((Lexer)null,null,null).init(); assert r.inProgress(); - PhiNode rmem = new PhiNode(ScopeNode.MEM0,TypeMem.BOT,r,null).init(); + PhiNode rmem = new BulkMemPhiNode(ScopeNode.MEM0,r,null).init(); PhiNode rrez = new PhiNode(ScopeNode.ARG0,Type.BOTTOM,r,null).init(); ReturnNode ret = new ReturnNode(r, rmem, rrez, rpc, fun).init(); fun.setRet(ret); @@ -208,11 +208,8 @@ public class Parser { // external calls. _scope.push(ScopeNode.Kind.Function); ctrl(fun); // Scope control from function - // Private mem alias tracking per function - MemMergeNode mem = new MemMergeNode(true); - mem.addDef(null); // Alias#0 - mem.addDef(new ParmNode(ScopeNode.MEM0,1,TypeMem.BOT,fun,con(TypeMem.BOT)).peephole()); // All aliases - _scope.mem(mem); + // Unknown callers supply whole memory; field aliases are discovered lazily. + _scope.mem(new ParmNode(ScopeNode.MEM0,1,TypeMem.BOT,fun,con(TypeMem.BOT)).peephole()); // All args, "as-if" called externally for( int i=0; i