summaryrefslogtreecommitdiff
path: root/chapter10/src
diff options
context:
space:
mode:
Diffstat (limited to 'chapter10/src')
-rw-r--r--chapter10/src/main/java/com/seaofnodes/simple/node/Node.java8
-rw-r--r--chapter10/src/test/java/com/seaofnodes/simple/Chapter02Test.java4
-rw-r--r--chapter10/src/test/java/com/seaofnodes/simple/Chapter03Test.java9
-rw-r--r--chapter10/src/test/java/com/seaofnodes/simple/Chapter07Test.java18
-rw-r--r--chapter10/src/test/java/com/seaofnodes/simple/SchedulerTest.java1
-rw-r--r--chapter10/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java10
-rw-r--r--chapter10/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java10
7 files changed, 15 insertions, 45 deletions
diff --git a/chapter10/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter10/src/main/java/com/seaofnodes/simple/node/Node.java
index a035b60f..eb6c1697 100644
--- a/chapter10/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter10/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -274,17 +274,10 @@ public abstract class Node {
// Graph-based optimizations
/**
- * We allow disabling peephole opt so that we can observe the
- * full graph, vs the optimized graph.
- */
- public static boolean _disablePeephole = false;
-
- /**
* Try to peephole at this node and return a better replacement Node.
* Always returns some not-null Node (often this).
*/
public final Node peephole() {
- if( _disablePeephole ) { _type = compute(); return this; }
var obs = IterPeeps.midAssert() ? null : Parser.PARSER == null ? null : Parser.PARSER._obs;
if( obs != null ) obs.before(this);
Node n = peepholeOpt();
@@ -606,7 +599,6 @@ public abstract class Node {
*/
public static void reset() {
UNIQUE_ID = 1;
- _disablePeephole=false;
GVN.clear();
ITER_CNT = ITER_NOP_CNT = 0;
}
diff --git a/chapter10/src/test/java/com/seaofnodes/simple/Chapter02Test.java b/chapter10/src/test/java/com/seaofnodes/simple/Chapter02Test.java
index 75ee0b70..a6075b75 100644
--- a/chapter10/src/test/java/com/seaofnodes/simple/Chapter02Test.java
+++ b/chapter10/src/test/java/com/seaofnodes/simple/Chapter02Test.java
@@ -11,10 +11,8 @@ public class Chapter02Test {
@Test
public void testParseGrammar() {
Parser parser = new Parser("return 1+2*3+-5;");
- Node._disablePeephole = true; // disable peephole so we can observe full graph
StopNode ret = parser.parse();
- assertEquals("return ((1+(2*3))+(-5));", ret.print());
- Node._disablePeephole = false;
+ assertEquals("return 2;", ret.print());
}
@Test
diff --git a/chapter10/src/test/java/com/seaofnodes/simple/Chapter03Test.java b/chapter10/src/test/java/com/seaofnodes/simple/Chapter03Test.java
index 64ff153e..609dff76 100644
--- a/chapter10/src/test/java/com/seaofnodes/simple/Chapter03Test.java
+++ b/chapter10/src/test/java/com/seaofnodes/simple/Chapter03Test.java
@@ -30,15 +30,6 @@ public class Chapter03Test {
}
@Test
- public void testVarScopeNoPeephole() {
- Parser parser = new Parser("int a=1; int b=2; int c=0; { int b=3; c=a+b; } return c; ");
- Node._disablePeephole = true;
- StopNode ret = parser.parse();
- Node._disablePeephole = false;
- assertEquals("return (1+3);", ret.print());
- }
-
- @Test
public void testVarDist() {
Parser parser = new Parser("int x0=1; int y0=2; int x1=3; int y1=4; return (x0-x1)*(x0-x1) + (y0-y1)*(y0-y1); ");
StopNode ret = parser.parse();
diff --git a/chapter10/src/test/java/com/seaofnodes/simple/Chapter07Test.java b/chapter10/src/test/java/com/seaofnodes/simple/Chapter07Test.java
index de9d16f2..58ecb7bc 100644
--- a/chapter10/src/test/java/com/seaofnodes/simple/Chapter07Test.java
+++ b/chapter10/src/test/java/com/seaofnodes/simple/Chapter07Test.java
@@ -17,11 +17,9 @@ public class Chapter07Test {
}
return arg;
""");
- Node._disablePeephole = true;
StopNode stop = parser.parse();
assertEquals("return Phi(Loop6,arg,(Phi_arg+1));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof ProjNode);
- Node._disablePeephole = false;
}
@Test
@@ -72,11 +70,9 @@ while(a < 10) {
}
return b;
""");
- Node._disablePeephole = true;
StopNode stop = parser.parse();
assertEquals("return Phi(Loop8,2,Phi(Region27,Phi_b,4));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof ProjNode);
- Node._disablePeephole = false;
}
@Test
@@ -110,11 +106,9 @@ while(a < 10) {
}
return a;
""");
- Node._disablePeephole = true;
StopNode stop = parser.parse();
- assertEquals("return Phi(Loop7,1,((Phi_a+1)+2));", stop.toString());
+ assertEquals("return Phi(Loop7,1,(Phi_a+3));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof ProjNode);
- Node._disablePeephole = false;
}
@Test
@@ -141,11 +135,9 @@ int a = 1;
while(arg) a = 2;
return a;
""");
- Node._disablePeephole = true;
StopNode stop = parser.parse();
assertEquals("return Phi(Loop7,1,2);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof ProjNode);
- Node._disablePeephole = false;
}
@Test
@@ -172,11 +164,9 @@ while(a < 10) {
}
return a;
""");
- Node._disablePeephole = true;
StopNode stop = parser.parse();
- assertEquals("return Phi(Loop7,1,((Phi_a+1)+2));", stop.toString());
+ assertEquals("return Phi(Loop7,1,(Phi_a+3));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof ProjNode);
- Node._disablePeephole = false;
}
@Test
@@ -207,11 +197,9 @@ while(a < 10) {
}
return a;
""");
- Node._disablePeephole = true;
StopNode stop = parser.parse();
- assertEquals("return Phi(Loop8,1,((Phi_a+1)+2));", stop.toString());
+ assertEquals("return Phi(Loop8,1,(Phi_a+3));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof ProjNode);
- Node._disablePeephole = false;
}
@Test
diff --git a/chapter10/src/test/java/com/seaofnodes/simple/SchedulerTest.java b/chapter10/src/test/java/com/seaofnodes/simple/SchedulerTest.java
index 853999b1..ad595822 100644
--- a/chapter10/src/test/java/com/seaofnodes/simple/SchedulerTest.java
+++ b/chapter10/src/test/java/com/seaofnodes/simple/SchedulerTest.java
@@ -30,7 +30,6 @@ int i=v.f;
if (arg) v.f=1;
return i;
""");
- StopNode._disablePeephole = true;
StopNode stop = parser.parse();//.iterate();
var eval = new Evaluator(stop);
assertEquals(2L, eval.evaluate(1, 10));
diff --git a/chapter10/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java b/chapter10/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java
index a82a7517..7dcb88e5 100644
--- a/chapter10/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java
+++ b/chapter10/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java
@@ -17,7 +17,7 @@ import java.util.function.Consumer;
* randomly choose a variation the parser would parse and generate it.
* These scripts are the parsed by the parser and all exceptions are caught and filtered
* to only show one occurrence of one problem. This includes script which generate different
- * results when the compiled graph with and without peeps is executed.
+ * results when graphs optimized with different worklist seeds are executed.
* To aid debugging scripts that cause errors are then reduced by applying rules and checking
* that the same issue persists.
*/
@@ -81,7 +81,7 @@ public class Fuzzer {
}
/**
- * Run checks for script. Compile the script with peeps enabled and disabled.
+ * Run checks for script. Compile the script with two different optimizer worklist seeds.
* Check that exceptions raised in the parser by both methods are the same and only happens if the script may be invalid.
* If the script was successfully parsed check that both version behave the same.
* @param script The script to test
@@ -90,10 +90,10 @@ public class Fuzzer {
private static void runCheck(String script, boolean valid) {
StopNode stop1;
try {
- stop1 = FuzzerUtils.parse(script, false);
+ stop1 = FuzzerUtils.parse(script, 123);
} catch (RuntimeException e1) {
try {
- FuzzerUtils.parse(script, true);
+ FuzzerUtils.parse(script, 456);
} catch (RuntimeException e2) {
if (FuzzerUtils.isExceptionFromSameCause(e1, e2)) {
if (!valid || e1.getClass() == RuntimeException.class) return;
@@ -103,7 +103,7 @@ public class Fuzzer {
}
throw e1;
}
- var stop2 = FuzzerUtils.parse(script, true);
+ var stop2 = FuzzerUtils.parse(script, 456);
var e1 = new Evaluator(stop1);
var e2 = new Evaluator(stop2);
checkGraphs(e1, e2, 0);
diff --git a/chapter10/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java b/chapter10/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java
index 18ef069a..f947a234 100644
--- a/chapter10/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java
+++ b/chapter10/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java
@@ -52,6 +52,7 @@ class FuzzerUtils {
* Used to clear as exceptions might happen in the walk and left this bitset not cleared
*/
private static final BitSet NodeWalkVisit;
+ private static final java.util.Random WorkRandom;
/**
* Write access to Iterate.MID_ASSERT
@@ -67,6 +68,7 @@ class FuzzerUtils {
static {
try {
NodeWalkVisit = getFieldValue(Node.class, "WVISIT");
+ WorkRandom = getFieldValue(getFieldValue(IterPeeps.class, "WORK"), "_R");
set_MID_ASSERT = MethodHandles.lookup().unreflectSetter(getField( IterPeeps.class, "MID_ASSERT"));
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
@@ -113,9 +115,9 @@ class FuzzerUtils {
}
/**
- * Parse script with peepholes enabled or disabled
+ * Parse and optimize using the given worklist seed
*/
- public static StopNode parse(String script, boolean runPeeps) {
+ public static StopNode parse(String script, long workListSeed) {
var err = System.err;
var out = System.out;
try {
@@ -127,9 +129,9 @@ class FuzzerUtils {
throw rethrow(e);
}
var parser = new Parser(script);
- Node._disablePeephole = !runPeeps;
+ WorkRandom.setSeed(workListSeed);
var stop = parser.parse();
- return runPeeps ? stop.iterate() : stop;
+ return stop.iterate();
} finally {
NodeWalkVisit.clear();
System.setErr(err);