summaryrefslogtreecommitdiff
path: root/chapter21/src/main/java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-04-02 11:32:42 -0700
committerCliff Click <cliffc@acm.org>2025-04-02 11:32:42 -0700
commit9452d347d07ff38f6897be0ff8e9a50b7b43ddc3 (patch)
tree419ec157334776d2436819a202e81f3ab0b7e626 /chapter21/src/main/java
parent4cd6517df6f9fbf77215525cf0b736ab4f90b143 (diff)
downloadSimple-9452d347d07ff38f6897be0ff8e9a50b7b43ddc3.tar.gz
Simple-9452d347d07ff38f6897be0ff8e9a50b7b43ddc3.zip
Stronger inf loop assert
Handle returning value after inf loop. Loop nesting check does not use depth until after loop tree is built. ASMPrint can be called no machine.
Diffstat (limited to 'chapter21/src/main/java')
-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
7 files changed, 17 insertions, 7 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");