summaryrefslogtreecommitdiff
path: root/chapter16/src
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-10-18 16:47:55 -0700
committerCliff Click <cliffc@acm.org>2024-10-21 08:52:01 -0700
commite9d9542d246a8e91a62ba9a82b9899959fd386a8 (patch)
treeeca33d540aae88e9a9fffece27def6d957683199 /chapter16/src
parent10db4b4946b917d9383db0464c50a49acb7d6baf (diff)
downloadSimple-e9d9542d246a8e91a62ba9a82b9899959fd386a8.tar.gz
Simple-e9d9542d246a8e91a62ba9a82b9899959fd386a8.zip
Bunch of fuzzer fixes
Mostly minor progress. Lost? shl/shr/sar high-type fixes. Turn off some printing crept back in
Diffstat (limited to 'chapter16/src')
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java10
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/RegionNode.java6
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/SarNode.java7
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/ShlNode.java7
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/ShrNode.java7
-rw-r--r--chapter16/src/test/java/com/seaofnodes/simple/Chapter08Test.java2
-rw-r--r--chapter16/src/test/java/com/seaofnodes/simple/Chapter10Test.java2
-rw-r--r--chapter16/src/test/java/com/seaofnodes/simple/Chapter11Test.java21
-rw-r--r--chapter16/src/test/java/com/seaofnodes/simple/Chapter15Test.java22
10 files changed, 68 insertions, 18 deletions
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java b/chapter16/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
index 35dc19ab..fb6477d3 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
@@ -69,6 +69,10 @@ public abstract class GlobalCodeMotion {
cfg.loopDepth();
for( Node n : cfg._inputs )
_schedEarly(n,visit);
+ if( cfg instanceof RegionNode )
+ for( Node phi : cfg._outputs )
+ if( phi instanceof PhiNode )
+ _schedEarly(phi,visit);
}
}
@@ -91,7 +95,7 @@ public abstract class GlobalCodeMotion {
// a data-only loop, eventually attempting relying on some pre-visited-
// not-post-visited data op with no scheduled control.
for( Node def : n._inputs )
- if( def!=null && !def.isPinned() )
+ if( def!=null && !(def instanceof PhiNode) )
_schedEarly(def,visit);
// If not-pinned (e.g. constants, projections, phi) and not-CFG
if( !n.isPinned() ) {
@@ -103,10 +107,6 @@ public abstract class GlobalCodeMotion {
early = n.in(i).cfg0(); // Latest/deepest input
n.setDef(0,early); // First place this can go
}
- // Also the pinned inputs we skipped earlier
- for( Node def : n._inputs )
- if( def!=null && def.isPinned() )
- _schedEarly(def,visit);
}
// ------------------------------------------------------------------------
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/MulNode.java
index f231a97b..b5ef91e9 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -26,6 +26,8 @@ public class MulNode extends Node {
return TypeInteger.TOP;
if( t1 instanceof TypeInteger i1 &&
t2 instanceof TypeInteger i2 ) {
+ if( i1==TypeInteger.ZERO || i2==TypeInteger.ZERO)
+ return TypeInteger.ZERO;
if (i1.isConstant() && i2.isConstant())
return TypeInteger.constant(i1.value()*i2.value());
}
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/RegionNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/RegionNode.java
index 68f8cbe6..941de76b 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/RegionNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/RegionNode.java
@@ -102,7 +102,7 @@ public class RegionNode extends CFGNode {
// A walk that can be cutoff early
private static final BitSet VISIT = new BitSet();
- private static boolean walk( IfNode iff, CProjNode cproj, Node n ) {
+ private boolean walk( IfNode iff, CProjNode cproj, Node n ) {
if( VISIT.get(n._nid) ) return false;
VISIT.set(n._nid);
if( n instanceof CFGNode ) return false;
@@ -110,7 +110,7 @@ public class RegionNode extends CFGNode {
return false;
boolean progress = false;
Node pred = iff.pred();
- if( pred._type.isConstant() ) return false; // This will collapse the IF already
+ if( pred._type.isHighOrConst() ) return false; // This will collapse the IF already
for( int i=1; i<n.nIns(); i++ ) {
// Using a tested value
if( n.in(i) == pred && !(n instanceof CastNode) ) {
@@ -122,7 +122,7 @@ public class RegionNode extends CFGNode {
n.setDef( i, cast );
IterPeeps.add(n);
progress = true;
- }
+ } else pred.addDep( this );
}
if( n.in(i)!=null )
progress |= walk(iff,cproj,n.in(i));
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/SarNode.java
index b46a7ba7..5dc26ad3 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -21,8 +21,11 @@ public class SarNode extends Node {
@Override
public Type compute() {
- if (in(1)._type instanceof TypeInteger i0 &&
- in(2)._type instanceof TypeInteger i1) {
+ Type t1 = in(1)._type, t2 = in(2)._type;
+ if( t1.isHigh() || t2.isHigh() )
+ return TypeInteger.TOP;
+ if (t1 instanceof TypeInteger i0 &&
+ t2 instanceof TypeInteger i1) {
if( i0 == TypeInteger.ZERO )
return TypeInteger.ZERO;
if( i0.isConstant() && i1.isConstant() )
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 6ad81b5c..888f02c6 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -21,8 +21,11 @@ public class ShlNode extends Node {
@Override
public Type compute() {
- if (in(1)._type instanceof TypeInteger i0 &&
- in(2)._type instanceof TypeInteger i1 ) {
+ Type t1 = in(1)._type, t2 = in(2)._type;
+ if( t1.isHigh() || t2.isHigh() )
+ return TypeInteger.TOP;
+ if (t1 instanceof TypeInteger i0 &&
+ t2 instanceof TypeInteger i1 ) {
if( i0 == TypeInteger.ZERO )
return TypeInteger.ZERO;
if( i0.isConstant() && i1.isConstant() )
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 856c2114..22eb45a0 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -21,8 +21,11 @@ public class ShrNode extends Node {
@Override
public Type compute() {
- if (in(1)._type instanceof TypeInteger i0 &&
- in(2)._type instanceof TypeInteger i1 ) {
+ Type t1 = in(1)._type, t2 = in(2)._type;
+ if( t1.isHigh() || t2.isHigh() )
+ return TypeInteger.TOP;
+ if (t1 instanceof TypeInteger i0 &&
+ t2 instanceof TypeInteger i1 ) {
if( i0 == TypeInteger.ZERO )
return TypeInteger.ZERO;
if( i0.isConstant() && i1.isConstant() )
diff --git a/chapter16/src/test/java/com/seaofnodes/simple/Chapter08Test.java b/chapter16/src/test/java/com/seaofnodes/simple/Chapter08Test.java
index 8117b2d6..c199b78c 100644
--- a/chapter16/src/test/java/com/seaofnodes/simple/Chapter08Test.java
+++ b/chapter16/src/test/java/com/seaofnodes/simple/Chapter08Test.java
@@ -22,7 +22,7 @@ while(arg < 10) {
}
return arg;
""");
- StopNode stop = parser.parse().iterate(true);
+ StopNode stop = parser.parse().iterate();
assertEquals("return Phi(Region45,Phi(Region32,Phi(Loop10,arg,(Phi_arg+1)),Add),Add);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof RegionNode);
Assert.assertEquals(5L, Evaluator.evaluate(stop, 1));
diff --git a/chapter16/src/test/java/com/seaofnodes/simple/Chapter10Test.java b/chapter16/src/test/java/com/seaofnodes/simple/Chapter10Test.java
index 10817e04..a31dfab3 100644
--- a/chapter16/src/test/java/com/seaofnodes/simple/Chapter10Test.java
+++ b/chapter16/src/test/java/com/seaofnodes/simple/Chapter10Test.java
@@ -102,7 +102,7 @@ while (arg) {
}
return bar.a;
""");
- StopNode stop = parser.parse().iterate(true);
+ StopNode stop = parser.parse().iterate();
assertEquals("return Phi(Loop16,0,(Phi_a+2));", stop.toString());
}
diff --git a/chapter16/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter16/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index d6278b76..d6b7bb00 100644
--- a/chapter16/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter16/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; ]", stop.toString());
+ assertEquals("Stop[ return 9; return 0; return 0; ]", stop.toString());
}
@@ -437,7 +437,7 @@ while( -arg )
while(1)
arg = arg+ptr.v;
""");
- StopNode stop = parser.parse().iterate(true);
+ StopNode stop = parser.parse().iterate();
assertEquals("Stop[ return 0; return 0; ]", stop.toString());
}
@@ -533,4 +533,21 @@ return 0;
assertEquals("return 0;", stop.toString());
}
+ @Test
+ public void testLoopCarriedDep() {
+ Parser parser = new Parser(
+"""
+u32 v0=0;
+{
+ int v1=0;
+ while(v1) {
+ v1=1>>>v0!=0;
+ v0=v1/0;
+ }
+}
+""");
+ StopNode stop = parser.parse().iterate();
+ assertEquals("return 0;", stop.toString());
+ }
+
}
diff --git a/chapter16/src/test/java/com/seaofnodes/simple/Chapter15Test.java b/chapter16/src/test/java/com/seaofnodes/simple/Chapter15Test.java
index 55486124..d2d60b34 100644
--- a/chapter16/src/test/java/com/seaofnodes/simple/Chapter15Test.java
+++ b/chapter16/src/test/java/com/seaofnodes/simple/Chapter15Test.java
@@ -366,4 +366,26 @@ while(0<--1>>>---(v7*0==v8)) {}
}
+ @Test
+ public void testProgress2() {
+ Parser parser = new Parser(
+"""
+if(1) {}
+else {
+ while(arg>>>0&0>>>0) {}
+ byte v3=0>>>0;
+ while(0) {}
+ int v7=0>>>0;
+ while(v7<0>>>0) {
+ while(0+v7<=0) if(1) arg=-12;
+ if(arg) {
+ v3=arg+v3+0;
+ arg=0;
+ }
+ }
+}
+""");
+ StopNode stop = parser.parse().iterate();
+ assertEquals("return 0;", stop.toString());
+ }
}