diff options
| author | Cliff Click <cliffc@acm.org> | 2024-11-13 13:55:56 -0800 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2024-11-23 09:03:20 -0800 |
| commit | 01afee4d48b05dee7686090716e23d467fae9838 (patch) | |
| tree | d3798fe25c299033a27addc2d091c7d9b6450342 | |
| parent | 68cd11f31dd4ba7f089d1a15de5a36ec67043da6 (diff) | |
| download | Simple-01afee4d48b05dee7686090716e23d467fae9838.tar.gz Simple-01afee4d48b05dee7686090716e23d467fae9838.zip | |
Minor inf loop fix
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()); |
