summaryrefslogtreecommitdiff
path: root/chapter16/src/main/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-10-18 15:41:32 -0700
committerCliff Click <cliffc@acm.org>2024-10-21 08:52:01 -0700
commit10db4b4946b917d9383db0464c50a49acb7d6baf (patch)
tree763406852d733e7c011a8529cf2e5407876218b8 /chapter16/src/main/java/com/seaofnodes
parentc4c8ee708c6948dcfa41be61eb96e744d5c6d3f8 (diff)
downloadSimple-10db4b4946b917d9383db0464c50a49acb7d6baf.tar.gz
Simple-10db4b4946b917d9383db0464c50a49acb7d6baf.zip
fuzzer bug fixes
ignore temps made during constructing and/or/xor honor TypeInteger.TOP; TypeInteger.nonZero works with zero NotNode keeps precision. Scope lazy phis of narrow ints auto-widen
Diffstat (limited to 'chapter16/src/main/java/com/seaofnodes')
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java6
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/Parser.java4
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java7
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/CastNode.java3
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/NotNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java7
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/RegionNode.java1
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/ScopeNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java7
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/type/TypeInteger.java2
10 files changed, 27 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 d2bbdc1e..35dc19ab 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
@@ -91,7 +91,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 )
+ if( def!=null && !def.isPinned() )
_schedEarly(def,visit);
// If not-pinned (e.g. constants, projections, phi) and not-CFG
if( !n.isPinned() ) {
@@ -103,6 +103,10 @@ 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/Parser.java b/chapter16/src/main/java/com/seaofnodes/simple/Parser.java
index c77792de..626f7749 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/Parser.java
@@ -524,7 +524,7 @@ public class Parser {
}
TypeStruct ts = s._ts = TypeStruct.make(typeName, fs);
TYPES.put(typeName, TypeMemPtr.make(ts));
- INITS.put(typeName,(StructNode)s.peephole().keep());
+ INITS.put(typeName,s.peephole().keep());
// Done with struct/block scope
require("}");
require(";");
@@ -786,7 +786,6 @@ public class Parser {
boolean hasConstructor = match("{");
Ary<Node> init=s._inputs; int idx=0;
if( hasConstructor ) {
- init = _scope._inputs;
idx = _scope.nIns();
// Push a scope, and pre-assign all struct fields.
_scope.push();
@@ -795,6 +794,7 @@ public class Parser {
// Parse the constructor body
parseBlock();
require("}");
+ init = _scope._inputs;
}
// Check that all fields are initialized
for( int i=idx; i<init.size(); i++ )
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java
index 7e4b898b..17a4e0ca 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java
@@ -21,8 +21,11 @@ public class AndNode 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.isConstant() && i1.isConstant() )
return TypeInteger.constant(i0.value()&i1.value());
// Sharpen allowed bits if either value is narrowed
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/CastNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/CastNode.java
index fbf0e518..462d6cba 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/CastNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/CastNode.java
@@ -21,8 +21,7 @@ public class CastNode extends Node {
@Override
public String uniqueName() { return "Cast_" + _nid; }
- @Override
- public boolean isPinned() { return true; }
+ @Override public boolean isPinned() { return true; }
@Override
StringBuilder _print1(StringBuilder sb, BitSet visited) {
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/NotNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/NotNode.java
index b3c77c45..ffd3e01e 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/NotNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/NotNode.java
@@ -22,7 +22,7 @@ public class NotNode extends Node {
Type t0 = in(1)._type;
if( t0.isHigh() ) return TypeInteger.BOOL.dual();
switch( t0 ) {
- case TypeInteger i0: return i0._max < 0 || i0._min > 0 ? TypeInteger.FALSE : (i0==TypeInteger.ZERO ? TypeInteger.TRUE : TypeInteger.BOT);
+ case TypeInteger i0: return i0._max < 0 || i0._min > 0 ? TypeInteger.FALSE : (i0==TypeInteger.ZERO ? TypeInteger.TRUE : TypeInteger.BOOL);
case TypeFloat i0: return i0.isConstant() ? TypeInteger.constant(i0.value()==0 ? 1 : 0) : i0;
case TypeMemPtr p0:
// top->top, bot->bot, null->1, *void->0, not-null ptr->0, ptr/nil->bot
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 1b32d4fb..b572346f 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -21,8 +21,11 @@ public class OrNode 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.isConstant() && i1.isConstant() )
return TypeInteger.constant(i0.value()|i1.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 09a32c95..68f8cbe6 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/RegionNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/RegionNode.java
@@ -110,6 +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
for( int i=1; i<n.nIns(); i++ ) {
// Using a tested value
if( n.in(i) == pred && !(n instanceof CastNode) ) {
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/ScopeNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
index 388a2760..9f6ed6e3 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
@@ -151,7 +151,7 @@ public class ScopeNode extends ScopeMinNode {
// Set real Phi in the loop head
// The phi takes its one input (no backedge yet) from a recursive
// lookup, which might have insert a Phi in every loop nest.
- : loop.setDef(v._idx,new PhiNode(v._name, v._type, loop.ctrl(), loop.in(loop._update(v,null)._idx),null).peephole());
+ : loop.setDef(v._idx,new PhiNode(v._name, v._type instanceof TypeMemPtr ? v._type : v._type.glb(), loop.ctrl(), loop.in(loop._update(v,null)._idx),null).peephole());
setDef(v._idx,old);
}
if( st!=null ) setDef(v._idx,st); // Set new value
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java
index 30a88dca..191933f9 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -21,8 +21,11 @@ public class XorNode 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.isConstant() && i1.isConstant() )
return TypeInteger.constant(i0.value()^i1.value());
}
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/type/TypeInteger.java b/chapter16/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
index 042b4ba8..b475055d 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
@@ -117,7 +117,7 @@ public class TypeInteger extends Type {
@Override public TypeInteger makeInit() { return ZERO; }
@Override public TypeInteger nonZero() {
if( isHigh() ) return this;
- if( _min==0 ) return make(1,_max); // specifically good on BOOL
+ if( _min==0 ) return make(1,Math.max(_max,1)); // specifically good on BOOL
if( _max==0 ) return make(_min,-1);
return this;
}