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. --- .../src/main/java/com/seaofnodes/simple/Parser.java | 3 ++- .../java/com/seaofnodes/simple/node/CallEndNode.java | 9 +++++---- .../main/java/com/seaofnodes/simple/node/IfNode.java | 2 +- .../main/java/com/seaofnodes/simple/node/LoopNode.java | 14 +++++++++++++- .../java/com/seaofnodes/simple/node/RegionNode.java | 2 +- .../java/com/seaofnodes/simple/node/ReturnNode.java | 6 ++++-- .../java/com/seaofnodes/simple/type/TypeFunPtr.java | 9 +++++---- .../java/com/seaofnodes/simple/type/TypeMemPtr.java | 7 ++----- .../test/java/com/seaofnodes/simple/Chapter18Test.java | 18 +++++++++++++++++- 9 files changed, 50 insertions(+), 20 deletions(-) (limited to 'chapter18') 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 x*x; } : { int x -> x+x; }; return fcn(3); """); code.parse().opto(); - assertEquals("Stop[ return Phi(Region,{ int -> int #1},{ int -> int #2})( 3); return (Parm_x($fun,int)*x); return (Parm_x($fun,int)*2); ]", code._stop.toString()); + assertEquals("Stop[ return Phi(Region,{ int -> int #1},{ int -> int #2})( 3); return (Parm_x($fun,int,3)*x); return (Parm_x($fun,int,3)*2); ]", code._stop.toString()); assertEquals("6", Eval2.eval(code, 0)); assertEquals("9", Eval2.eval(code, 1)); } @@ -180,6 +180,22 @@ for(;;) { } + @Test + public void testFcn9() { + CodeGen code = new CodeGen( +""" +{int -> int}? i2i = null; +for(;;) { + if (i2i) return i2i(arg); + var x = {int i-> return i;}; + arg = x(3); +} +"""); + code.parse().opto().typeCheck().GCM().localSched(); + assertEquals("Stop[ ]", code._stop.toString()); + assertEquals("0", Eval2.eval(code, 0)); + } + // Function break @Test public void testErr1() { -- cgit v1.2.3