summaryrefslogtreecommitdiff
path: root/chapter23/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'chapter23/src/main/java/com')
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java7
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/CallEndNode.java1
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/FunNode.java1
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java12
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java2
5 files changed, 20 insertions, 3 deletions
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java b/chapter23/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
index ca0e1110..adfefae5 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
@@ -242,10 +242,15 @@ public class CodeGen {
_phase = Phase.TypeCheck;
long t0 = System.currentTimeMillis();
- Parser.ParseException err = _stop.walk( Node::err );
+ Parser.ParseException err = _stop.walk(n -> {
+ Parser.ParseException msg = n.err();
+ if( msg != null && _obs != null ) _obs.error(n, msg.getMessage());
+ return msg;
+ });
_tTypeCheck = (int)(System.currentTimeMillis() - t0);
if( err != null )
throw err;
+ if( _obs != null ) _obs.phase("TypeCheck");
return this;
}
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/CallEndNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
index d95af697..1b702bee 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
@@ -12,6 +12,7 @@ public class CallEndNode extends CFGNode implements MultiNode {
// When set true, this Call/CallEnd/Fun/Return is being trivially inlined
private boolean _folding;
+ public boolean folding() { return _folding; }
public final TypeRPC _rpc;
public CallEndNode(CallNode call) { super(new Node[]{call}); _rpc = TypeRPC.constant(_nid); }
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/FunNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/FunNode.java
index 3ef486f8..88f5dc18 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/FunNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/FunNode.java
@@ -16,6 +16,7 @@ public class FunNode extends RegionNode {
// When set true, this Call/CallEnd/Fun/Return is being trivially inlined
boolean _folding;
+ public boolean folding() { return _folding; }
private TypeFunPtr _sig; // Initial signature
private ReturnNode _ret; // Return pointer
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java b/chapter23/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
index daae6fb6..7f7107ec 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
@@ -36,7 +36,17 @@ public class SimpleGraphAdapter extends GraphAdapter<Node> {
: n instanceof CProjNode p ? new Projection(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/chapter23/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java b/chapter23/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java
index 44e76493..8877b310 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java
+++ b/chapter23/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; }