summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chapter07/src/main/java/com/seaofnodes/simple/node/RegionNode.java1
-rw-r--r--chapter08/src/main/java/com/seaofnodes/simple/node/AddNode.java5
-rw-r--r--chapter08/src/main/java/com/seaofnodes/simple/node/LoopNode.java6
-rw-r--r--chapter08/src/main/java/com/seaofnodes/simple/node/Node.java11
-rw-r--r--chapter08/src/test/java/com/seaofnodes/simple/Chapter08Test.java7
5 files changed, 28 insertions, 2 deletions
diff --git a/chapter07/src/main/java/com/seaofnodes/simple/node/RegionNode.java b/chapter07/src/main/java/com/seaofnodes/simple/node/RegionNode.java
index 00c010b2..768c9558 100644
--- a/chapter07/src/main/java/com/seaofnodes/simple/node/RegionNode.java
+++ b/chapter07/src/main/java/com/seaofnodes/simple/node/RegionNode.java
@@ -3,7 +3,6 @@ package com.seaofnodes.simple.node;
import com.seaofnodes.simple.Utils;
import com.seaofnodes.simple.type.Type;
-import java.util.Collection;
import java.util.BitSet;
public class RegionNode extends Node {
diff --git a/chapter08/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter08/src/main/java/com/seaofnodes/simple/node/AddNode.java
index d23fa7c5..5878f340 100644
--- a/chapter08/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter08/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -69,6 +69,11 @@ public class AddNode extends Node {
return spline_cmp(lhs,rhs) ? swap12() : phiCon(this,true);
// Now we only see (add add non)
+
+ // Dead data cycle; comes about from dead infinite loops. Do nothing,
+ // the loop will peep as dead after a bit.
+ if( lhs.in(1) == lhs )
+ return null;
// Do we have (x + con1) + con2?
// Replace with (x + (con1+con2) which then fold the constants
diff --git a/chapter08/src/main/java/com/seaofnodes/simple/node/LoopNode.java b/chapter08/src/main/java/com/seaofnodes/simple/node/LoopNode.java
index 0ed32464..0b84f897 100644
--- a/chapter08/src/main/java/com/seaofnodes/simple/node/LoopNode.java
+++ b/chapter08/src/main/java/com/seaofnodes/simple/node/LoopNode.java
@@ -15,6 +15,12 @@ public class LoopNode extends RegionNode {
public String label() { return "Loop"; }
@Override
+ public Type compute() {
+ if( inProgress() ) return Type.CONTROL;
+ return entry()._type;
+ }
+
+ @Override
public Node idealize() {
return inProgress() ? null : super.idealize();
}
diff --git a/chapter08/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter08/src/main/java/com/seaofnodes/simple/node/Node.java
index bc772fb5..22b6f264 100644
--- a/chapter08/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter08/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -1,5 +1,6 @@
package com.seaofnodes.simple.node;
+import com.seaofnodes.simple.IRPrinter;
import com.seaofnodes.simple.Utils;
import com.seaofnodes.simple.type.Type;
@@ -100,6 +101,7 @@ public abstract class Node {
public final String print() {
return _print0(new StringBuilder(), new BitSet()).toString();
}
+
// This is the common print: check for repeats, check for DEAD and print
// "DEAD" else call the per-Node print1.
final StringBuilder _print0(StringBuilder sb, BitSet visited) {
@@ -138,6 +140,10 @@ public abstract class Node {
sb.append("\n");
}
+ public final String p(int depth) {
+ return IRPrinter.prettyPrint(this,depth);
+ }
+
public boolean isMultiHead() { return false; }
public boolean isMultiTail() { return false; }
@@ -441,7 +447,10 @@ public abstract class Node {
* Used to allow repeating tests in the same JVM. This just resets the
* Node unique id generator, and is done as part of making a new Parser.
*/
- public static void reset() { UNIQUE_ID = 1; _disablePeephole=false; }
+ public static void reset() {
+ UNIQUE_ID = 1;
+ _disablePeephole=false;
+ }
/**
* Debugging utility to find a Node by index
diff --git a/chapter08/src/test/java/com/seaofnodes/simple/Chapter08Test.java b/chapter08/src/test/java/com/seaofnodes/simple/Chapter08Test.java
index 16f7e324..057742c5 100644
--- a/chapter08/src/test/java/com/seaofnodes/simple/Chapter08Test.java
+++ b/chapter08/src/test/java/com/seaofnodes/simple/Chapter08Test.java
@@ -139,6 +139,13 @@ return arg;
}
@Test
+ public void testChapter8Regress2() {
+ Parser parser = new Parser("if(1) return 0; else while(arg>--arg) arg=arg+1; return 0;");
+ StopNode stop = parser.parse(true);
+ assertEquals("Stop[ return 0; return 0; ]", stop.toString());
+ }
+
+ @Test
public void testChapter8BreakOutsideLoop() {
try {
new Parser("""