diff options
| author | Cliff Click <cliffc@acm.org> | 2026-07-03 14:14:43 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-07-03 14:14:43 -0700 |
| commit | aa31b718eb0643bd0aaec3487384c396f9ebe975 (patch) | |
| tree | 532a2fa1b499bce5f66e57e5496bc31991d3be0b /chapter23/src/main/java | |
| parent | 5b04bd29ca5dbbaf55786c03ef0d38b41eef579b (diff) | |
| download | Simple-aa31b718eb0643bd0aaec3487384c396f9ebe975.tar.gz Simple-aa31b718eb0643bd0aaec3487384c396f9ebe975.zip | |
Series of minor fixes
Diffstat (limited to 'chapter23/src/main/java')
| -rw-r--r-- | chapter23/src/main/java/com/seaofnodes/simple/Parser.java | 9 | ||||
| -rw-r--r-- | chapter23/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java | 2 |
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); |
