summaryrefslogtreecommitdiff
path: root/chapter25/src/main/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-11 19:47:39 -0700
committerCliff Click <cliffc@acm.org>2026-09-11 19:47:39 -0700
commit385db70abc590215a6af0ef53cbb9eefc5405759 (patch)
treec7881cc793f7f4f4d19ead2846635d13bbff553f /chapter25/src/main/java/com/seaofnodes
parentcab27a1f349f60eb8ee5bd97ac7fde5cd4547265 (diff)
downloadSimple-385db70abc590215a6af0ef53cbb9eefc5405759.tar.gz
Simple-385db70abc590215a6af0ef53cbb9eefc5405759.zip
More robust on broken inputs
Diffstat (limited to 'chapter25/src/main/java/com/seaofnodes')
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/codegen/Opto.java9
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/ArithNode.java4
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/BoolNode.java4
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/CallNode.java11
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
5 files changed, 24 insertions, 6 deletions
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/codegen/Opto.java b/chapter25/src/main/java/com/seaofnodes/simple/codegen/Opto.java
index 690ae3ad..6e00d02c 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/codegen/Opto.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/codegen/Opto.java
@@ -304,7 +304,11 @@ abstract public class Opto {
int mode = 0;
for( int i=1; i<n.nIns(); i++ )
mode |= numericEvidence(n.in(i),visited);
- assert mode != 0;
+ // A closed recursive numeric component can have no remaining
+ // concrete evidence after SCCP, e.g. dead all-integer loops.
+ // With no float evidence, settle to integer.
+ if( mode == 0 )
+ mode = 1;
if( mode != 0 ) {
// If both evidence, FP wins
modeNode.setMode((byte)((mode&2)==2 ? 2 : 1)).init();
@@ -330,8 +334,9 @@ abstract public class Opto {
int evidence = 0;
assert !(n instanceof ConvertNode); // No test case
- assert !(n instanceof ModeNode);
switch( n ) {
+ case ModeNode modeNode when modeNode.mode() != 0 -> { return modeNode.mode(); }
+ case ModeNode modeNode -> {}
case PhiNode phi -> {}
case ReturnNode ret -> {}
case ProjNode proj when proj.in(0) instanceof CallEndNode cend -> {
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/ArithNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/ArithNode.java
index 8c21aef7..995b4743 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/ArithNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/ArithNode.java
@@ -57,6 +57,8 @@ public abstract class ArithNode extends Node implements ModeNode {
Type bad = null;
for( int i=1; i<n.nIns(); i++ ) {
Type t = n.in(i)._type;
+ if( t==null )
+ return null;
if( t.isHigh() )
return null;
// A weak input is not evidence of a bad mode while the graph is
@@ -97,6 +99,8 @@ public abstract class ArithNode extends Node implements ModeNode {
@Override
public final Type compute() {
Type t1 = in(1)._type, t2 = in(2)._type;
+ if( t1==null || t2==null )
+ return Type.TOP;
if( t1.isHigh() || t2.isHigh() )
return _mode==0 ? Type.TOP :
_mode==1 ? TypeInteger.TOP :
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/BoolNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/BoolNode.java
index ef71983e..ac3b0bc0 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/BoolNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/BoolNode.java
@@ -37,6 +37,8 @@ abstract public class BoolNode extends Node implements ModeNode {
public TypeInteger compute() {
Type t1 = in(1)._type;
Type t2 = in(2)._type;
+ if( t1==null || t2==null )
+ return BOOL;
// Exactly equals?
if( t1.isHigh() || t2.isHigh() )
return (TypeInteger)BOOL.dual();
@@ -79,6 +81,8 @@ abstract public class BoolNode extends Node implements ModeNode {
return this instanceof LT ? CodeGen.CODE.ZERO : ConstantNode.make(TRUE);
// Can we decide int vs flt?
Type t1 = in(1)._type, t2 = in(2)._type;
+ if( t1==null || t2==null )
+ return null;
if( _mode==0 ) {
byte mode = ArithNode.mode(t1,t2);
if( mode!=0 ) return setMode(mode).init();
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/CallNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/CallNode.java
index 90d7e379..9ce97ac6 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/CallNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/CallNode.java
@@ -153,11 +153,14 @@ public class CallNode extends CFGNode {
fun.delDef(path);
CodeGen.CODE.add(fun);
CallEndNode cend = cend();
- ReturnNode ret = fun.ret().keep();
- cend.delDef(cend._inputs.find(ret));
- CodeGen.CODE.add(cend);
+ ReturnNode ret = fun.ret();
+ if( cend != null ) {
+ ret.keep();
+ cend.delDef(cend._inputs.find(ret));
+ CodeGen.CODE.add(cend);
+ ret.unkeep();
+ }
assert !linked(fun);
- ret.unkeep();
}
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index 6101fba2..642fc2b2 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -37,6 +37,8 @@ public class MinusNode extends Node implements ModeNode {
@Override
public Type compute() {
Type t = in(1)._type;
+ if( t==null )
+ return Type.TOP;
if( t.isHigh() )
return _mode==0 ? Type.TOP :
_mode==1 ? TypeInteger.TOP :