From 10db4b4946b917d9383db0464c50a49acb7d6baf Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Fri, 18 Oct 2024 15:41:32 -0700 Subject: 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 --- .../src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java | 6 +++++- chapter16/src/main/java/com/seaofnodes/simple/Parser.java | 4 ++-- chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java | 7 +++++-- chapter16/src/main/java/com/seaofnodes/simple/node/CastNode.java | 3 +-- chapter16/src/main/java/com/seaofnodes/simple/node/NotNode.java | 2 +- chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java | 7 +++++-- chapter16/src/main/java/com/seaofnodes/simple/node/RegionNode.java | 1 + chapter16/src/main/java/com/seaofnodes/simple/node/ScopeNode.java | 2 +- chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java | 7 +++++-- .../src/main/java/com/seaofnodes/simple/type/TypeInteger.java | 2 +- 10 files changed, 27 insertions(+), 14 deletions(-) (limited to 'chapter16/src/main/java/com/seaofnodes') 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 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 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