summaryrefslogtreecommitdiff
path: root/chapter21/src
diff options
context:
space:
mode:
Diffstat (limited to 'chapter21/src')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java1
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/LoopNode.java10
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java6
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/print/IRPrinter.java1
-rw-r--r--chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java2
8 files changed, 18 insertions, 8 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java b/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java
index 335715c6..8c894f8a 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java
@@ -250,6 +250,7 @@ public class Encoding {
_rpo_cfg(f,visit,rpo);
}
}
+ assert rpo._len>0 || bb instanceof ReturnNode;
rpo.add(bb);
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java b/chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
index 40bb626d..c81eb9b5 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
@@ -56,7 +56,7 @@ public abstract class GlobalCodeMotion {
FunNode fun = null;
boolean done=true;
for( Node use : con.outs() ) {
- FunNode fun2 = use.cfg0().fun();
+ FunNode fun2 = use instanceof ReturnNode ret ? ret.fun() : use.cfg0().fun();
if( fun==null || fun==fun2 ) fun=fun2;
else { done=false; break; }
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java
index f198e65c..0b97c574 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java
@@ -108,7 +108,7 @@ public abstract class CFGNode extends Node {
LoopTree _ltree;
public int _pre; // Pre-order numbers for loop tree finding
- private static class LoopTree {
+ static class LoopTree {
LoopTree _par;
final LoopNode _head;
int _depth;
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/LoopNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/LoopNode.java
index 787b43d2..3a57fde7 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/LoopNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/LoopNode.java
@@ -40,7 +40,7 @@ public class LoopNode extends RegionNode {
while( x != this ) {
if( x instanceof CProjNode exit && exit.in(0) instanceof IfNode iff ) {
CFGNode other = iff.cproj(1-exit._idx);
- if( other!=null && other.loopDepth() < loopDepth() )
+ if( other!=null && other._ltree != _ltree && nested(_ltree,other._ltree) )
return stop; // Found an exit, not an infinite loop
}
x = x.idom();
@@ -86,4 +86,12 @@ public class LoopNode extends RegionNode {
return stop;
}
+
+ private static boolean nested(LoopTree inner, LoopTree outer) {
+ for( ; inner!=null; inner = inner._par )
+ if( inner == outer )
+ return true;
+ return false;
+ }
+
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
index f0b7d49e..6fa76ef8 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
@@ -29,7 +29,7 @@ public class ReturnNode extends CFGNode {
public Node mem () { return in(1); }
public Node expr() { return in(2); }
public Node rpc () { return in(3); }
- public FunNode fun() { return _fun; }
+ @Override public FunNode fun() { return _fun; }
@Override
public String label() { return "Return"; }
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java b/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java
index d9b0ec36..b39e2705 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java
@@ -71,7 +71,7 @@ public abstract class ASMPrinter {
static private final int opWidth = 5;
static private final int argWidth = 30;
static int doBlock(int iadr, SB sb, CodeGen code, FunNode fun, int cfgidx) {
- final int encWidth = code._mach.defaultOpSize()*2;
+ final int encWidth = code._mach==null ? 2 : code._mach.defaultOpSize()*2;
CFGNode bb = code._cfg.at(cfgidx);
if( bb != fun && !(bb instanceof IfNode) && !(bb instanceof CallEndNode) && !(bb instanceof CallNode) && !(bb instanceof CProjNode && bb.in(0) instanceof CallEndNode ))
sb.p(label(bb)).p(":").nl();
@@ -110,12 +110,12 @@ public abstract class ASMPrinter {
}
static int doInst( int iadr, SB sb, CodeGen code, int cfgidx, Node n, boolean postAlloc, boolean postEncode ) {
- if( n instanceof CProjNode ) return iadr;
+ if( n==null || n instanceof CProjNode ) return iadr;
if( postAlloc && n instanceof CalleeSaveNode ) return iadr;
if( postEncode && n instanceof ProjNode ) return iadr;
if( n instanceof MemMergeNode ) return iadr;
if( n.getClass() == ConstantNode.class ) return iadr; // Default placeholders
- final int dopz = code._mach.defaultOpSize();
+ final int dopz = code._mach==null ? 2 : code._mach.defaultOpSize();
final int encWidth = dopz*2;
// All blocks ending in a Region will need to either fall into or jump
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/print/IRPrinter.java b/chapter21/src/main/java/com/seaofnodes/simple/print/IRPrinter.java
index c91f844b..b171e9f7 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/print/IRPrinter.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/print/IRPrinter.java
@@ -16,6 +16,7 @@ public abstract class IRPrinter {
// NNID NNAME DDEF DDEF [[ UUSE UUSE ]] TYPE
// 1234 sssss 1234 1234 1234 1234 1234 1234 tttttt
public static SB printLine( Node n, SB sb ) {
+ if( n==null ) return sb;
sb.p("%4d %-7.7s ".formatted(n._nid,n.label()));
if( n._inputs==null )
return sb.p("DEAD\n");
diff --git a/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java b/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java
index 6f800608..617284ca 100644
--- a/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java
+++ b/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java
@@ -15,7 +15,7 @@ public class Chapter21Test {
@Test
public void testJig() {
CodeGen code = new CodeGen("return 0;");
- code.parse().opto().typeCheck();
+ code.parse().opto().typeCheck().GCM().localSched();
assertEquals("return 0;", code._stop.toString());
assertEquals("0", Eval2.eval(code, 2));
}