summaryrefslogtreecommitdiff
path: root/chapter16/src/main/java/com
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/main/java/com
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/main/java/com')
-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
6 files changed, 25 insertions, 14 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() )