summaryrefslogtreecommitdiff
path: root/chapter22/src
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-05-08 15:55:17 -0700
committerCliff Click <cliffc@acm.org>2025-05-08 15:55:17 -0700
commit6851144b727ac7e98600e2a4d70d5476cf74484e (patch)
tree2b030b327be50fbbdcac1ba38afc2c141f6b2e4d /chapter22/src
parent30c60eeea76687bcf267937e50cc0cc944f420c1 (diff)
downloadSimple-6851144b727ac7e98600e2a4d70d5476cf74484e.tar.gz
Simple-6851144b727ac7e98600e2a4d70d5476cf74484e.zip
fix idom when mid inlining
Finish refactor CallEndNode and CallEndMach
Diffstat (limited to 'chapter22/src')
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java6
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java4
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/CallEndNode.java34
-rw-r--r--chapter22/src/test/java/com/seaofnodes/simple/progs/jig.smp29
4 files changed, 32 insertions, 41 deletions
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java b/chapter22/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
index 874f850b..adb71413 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
@@ -461,8 +461,10 @@ public class CodeGen {
String printCFG() {
if( _cfg==null ) return "no CFG";
SB sb = new SB();
- for( CFGNode cfg : _cfg )
- IRPrinter.printLine(cfg,sb);
+ for( CFGNode cfg : _cfg ) {
+ sb.fix(8,""+cfg._idepth);
+ IRPrinter.printLine( cfg, sb );
+ }
return sb.toString();
}
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java b/chapter22/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java
index f68caf91..68b55f6f 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java
@@ -163,7 +163,7 @@ public class RegAlloc {
}
// Cache reg masks for New and Call
for( CFGNode bb : _code._cfg ) {
- if( bb instanceof CallEndNode cend ) cend.cacheRegs(_code);
+ if( bb instanceof CallEndMach cend ) cend.cacheRegs(_code);
for( Node n : bb._outputs )
if( n instanceof NewNode nnn ) nnn.cacheRegs(_code);
}
@@ -565,7 +565,7 @@ public class RegAlloc {
if( bb instanceof ReturnNode ret )
ret.fun().computeFrameAdjust(_code,maxReg);
// Raise frame size by max stack args passed, even if ignored
- if( bb instanceof CallEndNode cend )
+ if( bb instanceof CallEndMach cend )
maxReg = Math.max(maxReg,cend._xslot);
for( int j=0; j<bb.nOuts(); j++ ) {
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/CallEndNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
index 7a331deb..cf3f337c 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
@@ -22,6 +22,11 @@ public class CallEndNode extends CFGNode implements MultiNode {
public CallNode call() { return (CallNode)in(0); }
+ @Override public CFGNode idom(Node dep) {
+ // Folding the idom is the one inlining Return
+ return _folding ? cfg(1) : super.idom(dep);
+ }
+
@Override
public StringBuilder _print1(StringBuilder sb, BitSet visited) {
sb.append("cend( ");
@@ -101,33 +106,4 @@ public class CallEndNode extends CFGNode implements MultiNode {
return _folding ? in(1).in(idx) : null;
}
- // ------------
- // MachNode specifics, shared across all CPUs
- public int _xslot;
- private RegMask _retMask;
- private RegMask _kills;
- public void cacheRegs(CodeGen code) {
- // Return mask depends on TFP (either GPR or FPR)
- _retMask = code._mach.retMask(call().tfp());
- // Kill mask is all caller-saves, and any mirror stack slots for args
- // in registers.
- RegMaskRW kills = code._callerSave.copy();
- // Start of stack slots
- int maxReg = code._mach.regs().length;
- // Incoming function arg slots, all low numbered in the RA
- int fslot = fun()._maxArgSlot;
- // Killed slots for this calls outgoing args
- int xslot = code._mach.maxArgSlot(call().tfp());
- _xslot = (maxReg+fslot)+xslot;
- for( int i=0; i<xslot; i++ )
- kills.set((maxReg+fslot)+i);
- _kills = kills;
- }
- public String op() { return "cend"; }
- public RegMask regmap(int i) { return null; }
- public RegMask outregmap() { return null; }
- public RegMask outregmap(int idx) { return idx==2 ? _retMask : null; }
- public RegMask killmap() { return _kills; }
- public void encoding( Encoding enc ) { }
- public void asm(CodeGen code, SB sb) { }
}
diff --git a/chapter22/src/test/java/com/seaofnodes/simple/progs/jig.smp b/chapter22/src/test/java/com/seaofnodes/simple/progs/jig.smp
index ae0b57aa..0f28dfce 100644
--- a/chapter22/src/test/java/com/seaofnodes/simple/progs/jig.smp
+++ b/chapter22/src/test/java/com/seaofnodes/simple/progs/jig.smp
@@ -1,10 +1,23 @@
// -*- mode: java; -*-
-//7599136877341746241
-//========= Reduced =========
-struct s0 {
- Zvbjf? Ia;
- i32 v0;
+val _exit = { u8[~] msg ->
+ sys.io.p(msg);
+ sys.libc._exit(1);
+};
+
+struct Scan {
+ int !x;
+ u8[~] buf;
+};
+
+
+// Read from stdin a line of the form "[ 4, 3, 2, 1]" and print it sorted.
+val main = { ->
+ Scan !s = new Scan{ buf = sys.io.stdin(); };
+ var junk = new u8[1];
+ while( s.x < s.buf# ) {
+ sys.io.p("scan ");
+ junk[0] = s.buf[s.x++];
+ sys.io.p(junk);
+ };
+ return 0;
};
-s0 !Z1_=new s0;
-while(new s0.v0) {
- Z1_.Ia=Z1_.Ia;