summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chapter17/src/main/java/com/seaofnodes/simple/node/LoopNode.java7
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter11Test.java2
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java12
3 files changed, 6 insertions, 15 deletions
diff --git a/chapter17/src/main/java/com/seaofnodes/simple/node/LoopNode.java b/chapter17/src/main/java/com/seaofnodes/simple/node/LoopNode.java
index 22862cb9..27134420 100644
--- a/chapter17/src/main/java/com/seaofnodes/simple/node/LoopNode.java
+++ b/chapter17/src/main/java/com/seaofnodes/simple/node/LoopNode.java
@@ -34,7 +34,7 @@ public class LoopNode extends RegionNode {
@Override public int loopDepth() {
if( _loopDepth!=0 ) return _loopDepth; // Was already set
- _loopDepth = entry()._loopDepth+1; // Entry depth plus one
+ _loopDepth = entry().loopDepth()+1; // Entry depth plus one
// One-time tag loop exits
for( CFGNode idom = back(); idom!=this; idom = idom.idom() ) {
// Walk idom in loop, setting depth
@@ -61,8 +61,9 @@ public class LoopNode extends RegionNode {
CFGNode x = back();
while( x != this ) {
if( x instanceof CProjNode exit && exit.in(0) instanceof IfNode iff ) {
- Node other = iff.cproj(1-exit._idx);
- if( !(other.out(0) instanceof LoopNode loop) || loop.entry()==exit )
+ CFGNode other = iff.cproj(1-exit._idx);
+ //if( !(other.out(0) instanceof LoopNode loop) || loop.entry()==exit )
+ if( other.loopDepth() < loopDepth() )
return; // Found an exit, not an infinite loop
}
x = x.idom();
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index 79c0622c..5127b250 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -292,7 +292,7 @@ else {
}
""");
StopNode stop = parser.parse().iterate();
- assertEquals("Stop[ return 9; return 0; return 0; return 0; return 0; return 0; return 0; return 0; ]", stop.toString());
+ assertEquals("Stop[ return 9; return 0; return 0; return 0; return 0; return 0; return 0; ]", stop.toString());
}
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java
index 7de7d514..b1f7eb43 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java
@@ -12,17 +12,7 @@ public class Chapter17Test {
@Test
public void testJig() {
Parser parser = new Parser("""
-i32 v0=0;
-if(1<<arg) return 0&0;
- int v1=0;
- while(0<<0!=1) {
- v1=v0;
- while(0<--v0)
- if(1&v0) continue;
- else arg=0;
- if(v1) continue;
- arg=0;
- }
+return 3.14;
""");
StopNode stop = parser.parse().iterate();
assertEquals("return 3.14;", stop.toString());