From 3a3d469154846b648b09c708bfe3e8c16a203654 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Mon, 13 Jan 2025 15:09:59 -0800 Subject: Some dead inf call bug fixes More comments about meeting nil above the center line falls - but does not (can not) dual. This implies have TFPs with *no* allowed functions that are below centerline; if allowed null then its basically an alternate null. If not allowed null and not allowed any functions, its basically a high value (not executable). IfNode folds. Do not remove a dead infinite loop - it needs to remain as a CFG sink. --- chapter18/src/main/java/com/seaofnodes/simple/Parser.java | 3 ++- .../main/java/com/seaofnodes/simple/node/CallEndNode.java | 9 +++++---- .../src/main/java/com/seaofnodes/simple/node/IfNode.java | 2 +- .../src/main/java/com/seaofnodes/simple/node/LoopNode.java | 14 +++++++++++++- .../main/java/com/seaofnodes/simple/node/RegionNode.java | 2 +- .../main/java/com/seaofnodes/simple/node/ReturnNode.java | 6 ++++-- .../main/java/com/seaofnodes/simple/type/TypeFunPtr.java | 9 +++++---- .../main/java/com/seaofnodes/simple/type/TypeMemPtr.java | 7 ++----- 8 files changed, 33 insertions(+), 19 deletions(-) (limited to 'chapter18/src/main/java') diff --git a/chapter18/src/main/java/com/seaofnodes/simple/Parser.java b/chapter18/src/main/java/com/seaofnodes/simple/Parser.java index 649145fd..8f0cf493 100644 --- a/chapter18/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter18/src/main/java/com/seaofnodes/simple/Parser.java @@ -708,7 +708,8 @@ public class Parser { if( inferType ) { if( expr._type==Type.NIL ) throw error("a not-null/non-zero expression"); - t = expr._type.glb(); + t = expr._type; + if( !xfinal ) t = t.glb(); // Widen if not final } if( t instanceof TypeFunPtr && expr._type instanceof TypeFunPtr tfp && tfp.isConstant() ) tfp.setName(name); diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/CallEndNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/CallEndNode.java index c9ea2f1f..48edc0eb 100644 --- a/chapter18/src/main/java/com/seaofnodes/simple/node/CallEndNode.java +++ b/chapter18/src/main/java/com/seaofnodes/simple/node/CallEndNode.java @@ -26,8 +26,7 @@ public class CallEndNode extends CFGNode implements MultiNode { @Override StringBuilder _print1(StringBuilder sb, BitSet visited) { sb.append("cend( "); - if( call()==null ) sb.append("---, "); - else sb.append("Call, "); + sb.append( in(0) instanceof CallNode ? "Call, " : "----, "); for( int i=1; i