diff options
Diffstat (limited to 'chapter25')
6 files changed, 23 insertions, 7 deletions
diff --git a/chapter25/pom.xml b/chapter25/pom.xml index 7a2b2b78..ab9f2ea5 100644 --- a/chapter25/pom.xml +++ b/chapter25/pom.xml @@ -8,9 +8,9 @@ <artifactId>simple</artifactId> <version>1.0</version> </parent> - <artifactId>chapter23</artifactId> + <artifactId>chapter25</artifactId> <packaging>jar</packaging> - <name>Chapter 23</name> + <name>Chapter 25</name> <properties> <simple.graph.directory>${project.basedir}/../graph</simple.graph.directory> </properties> diff --git a/chapter25/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java b/chapter25/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java index 87aa96c4..0f38d3ff 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java @@ -558,10 +558,15 @@ public class CodeGen { min instanceof CFGNode mincfg && ncfg.idepth() < mincfg.idepth())) ) min = n; + if( _obs != null ) _obs.error(min, min.err().getMessage()); throw min.err(); } - if( unresolved != null ) - throw Parser.error("Unknown struct type '"+unresolved+"'",null); + if( unresolved != null ) { + var err = Parser.error("Unknown struct type '"+unresolved+"'",null); + if( _obs != null ) _obs.error(null, err.getMessage()); + throw err; + } + if( _obs != null ) _obs.phase("TypeCheck"); return this; } diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/CallEndNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/CallEndNode.java index abf80288..3c6506b9 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/node/CallEndNode.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/node/CallEndNode.java @@ -56,7 +56,7 @@ public class CallEndNode extends CFGNode implements MultiNode { @Override public boolean blockHead() { return true; } public CallNode call() { return (CallNode)in(0); } - boolean folding() { return _folding; } + public boolean folding() { return _folding; } @Override public CFGNode idom(Node dep) { // Folding the idom is the one inlining Return diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/FunNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/FunNode.java index ddd637c9..19b459df 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/node/FunNode.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/node/FunNode.java @@ -15,6 +15,7 @@ public class FunNode extends RegionNode { // When set true, this Call/CallEnd/Fun/Return is being trivially inlined public boolean _folding; + public boolean folding() { return _folding; } private TypeFunPtr _sig; // Initial signature private ReturnNode _ret; // Return pointer diff --git a/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java b/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java index f3619bb5..6c4e7e31 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java @@ -44,7 +44,17 @@ public class SimpleGraphAdapter extends GraphAdapter<Node> { ? new Projection(n.nIns() == 0 ? 0 : ref(n.in(0)), p.idx()) : null; String label = n.label(); return new GraphSnapshot.Node(n._nid, label == null ? n.getClass().getSimpleName() : label, - n._type == null ? null : n._type.toString(), kind(n), edges(n), proj); + n._type == null ? null : n._type.toString(), kind(n), edges(n), proj, folding(n)); + } + + private boolean folding(Node n) { + if( n instanceof FunNode fun ) return fun.folding(); + if( n instanceof ReturnNode ret ) return ret.fun().folding(); + if( n instanceof CallEndNode cend ) return cend.folding(); + if( n instanceof CallNode ) + for( int i=0; i<n.nOuts(); i++ ) + if( n.out(i) instanceof CallEndNode cend && cend.folding() ) return true; + return false; } private Kind kind(Node n) { diff --git a/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java b/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java index 0e5281fb..bf8403e1 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java @@ -17,7 +17,7 @@ public class SimpleGraphObserver extends GraphCapture<Node> { @Override protected void compile(String src) { _code = new CodeGen(src); _code._obs = this; - _code.parse().opto(); + _code.parse().opto().typeCheck(); } @Override protected String phase() { return _code._phase.name(); } @Override protected int pos() { return _code._phase == CodeGen.Phase.Parse ? _code.P.pos() : -1; } |
