summaryrefslogtreecommitdiff
path: root/chapter23/src/main/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-07-03 14:14:43 -0700
committerCliff Click <cliffc@acm.org>2026-07-03 14:14:43 -0700
commitaa31b718eb0643bd0aaec3487384c396f9ebe975 (patch)
tree532a2fa1b499bce5f66e57e5496bc31991d3be0b /chapter23/src/main/java/com/seaofnodes
parent5b04bd29ca5dbbaf55786c03ef0d38b41eef579b (diff)
downloadSimple-aa31b718eb0643bd0aaec3487384c396f9ebe975.tar.gz
Simple-aa31b718eb0643bd0aaec3487384c396f9ebe975.zip
Series of minor fixes
Diffstat (limited to 'chapter23/src/main/java/com/seaofnodes')
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/Parser.java9
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java2
2 files changed, 8 insertions, 3 deletions
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/Parser.java b/chapter23/src/main/java/com/seaofnodes/simple/Parser.java
index ffd4bfe9..8a6b1967 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/Parser.java
@@ -245,8 +245,13 @@ public class Parser {
last = parseStatement();
// Last expression is the return except for the top-level main
- if( ctrl()._type==Type.CONTROL && fun.sig() != _code._main )
- fun.addReturn(ctrl(), _scope.mem().merge(), last);
+ if( ctrl()._type==Type.CONTROL )
+ if( fun.sig() != _code._main )
+ fun.addReturn(ctrl(), _scope.mem().merge(), last);
+ else {
+ fun.setDef(1,XCTRL); // Kill default main
+ _code.addAll(fun._outputs);
+ }
// Pop off the inProgress node on the multi-exit Region merge
assert r.inProgress();
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java b/chapter23/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
index 520a18a3..d9c7a6ad 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
@@ -36,7 +36,7 @@ public abstract class GlobalCodeMotion {
return; // Been there, done that
if( def instanceof ReturnNode && use instanceof CallEndNode )
return;
- assert !( def instanceof CallNode && use instanceof FunNode );
+ assert !( def instanceof CallNode && use instanceof FunNode ); // All calls unwired now
visit.set(cfg._nid);
for( Node useuse : cfg._outputs )
_rpo_cfg(cfg,useuse,visit,rpo);