summaryrefslogtreecommitdiff
path: root/src/main/java/com/seaofnodes/simple/print
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/seaofnodes/simple/print')
-rw-r--r--src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java14
-rw-r--r--src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java4
2 files changed, 13 insertions, 5 deletions
diff --git a/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java b/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
index df46cc6b..5e21c852 100644
--- a/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
+++ b/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
@@ -5,9 +5,10 @@ import com.seaofnodes.graph.GraphSnapshot;
import com.seaofnodes.graph.GraphSnapshot.*;
import com.seaofnodes.simple.node.*;
import com.seaofnodes.simple.node.Node;
+import com.seaofnodes.simple.type.TypeMem;
import java.util.ArrayList;
-/** Chapter 9's view of the IR; browser, transport and layout are shared. */
+/** Chapter 10's view of the IR; browser, transport and layout are shared. */
public class SimpleGraphAdapter extends GraphAdapter<Node> {
@Override protected boolean dead(Node n) { return n.isDead(); }
@Override protected int id(Node n) { return n._nid; }
@@ -42,15 +43,20 @@ public class SimpleGraphAdapter extends GraphAdapter<Node> {
if( n instanceof LoopNode ) return Kind.LOOP;
if( n instanceof RegionNode ) return Kind.REGION;
if( n instanceof PhiNode ) return Kind.PHI;
- return n.isCFG() ? Kind.CTRL : Kind.DATA;
+ return n.isCFG() ? Kind.CTRL : isMem(n) ? Kind.MEM : Kind.DATA;
}
private Role role(Node n, int i) {
if( n instanceof ScopeNode || n instanceof ConstantNode ) return Role.ASSOC;
- if( n instanceof PhiNode ) return i == 0 ? Role.ASSOC : Role.DATA;
- if( n instanceof ProjNode ) return n.isCFG() ? Role.CTRL : Role.DATA;
+ if( n instanceof PhiNode ) return i == 0 ? Role.ASSOC : isMem(n) ? Role.MEM : Role.DATA;
+ if( n instanceof ProjNode ) return n.isCFG() ? Role.CTRL : isMem(n) ? Role.MEM : Role.DATA;
if( n instanceof RegionNode && i == 0 ) return Role.ASSOC;
if( i == 0 || n instanceof RegionNode || n instanceof StopNode ) return Role.CTRL;
+ if( i == 1 && n instanceof MemOpNode || i == 2 && n instanceof ReturnNode ) return Role.MEM;
+ Node def = n.in(i);
+ if( def != null && isMem(def) ) return Role.MEM;
return Role.DATA;
}
+
+ private boolean isMem(Node n) { return n.isMem() || n._type instanceof TypeMem; }
}
diff --git a/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java b/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java
index 2c6c90ca..1980659e 100644
--- a/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java
+++ b/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java
@@ -7,7 +7,7 @@ import com.seaofnodes.simple.node.Node;
import java.util.ArrayList;
import java.io.IOException;
-/** Chapter 9's compilation context; capture and event bookkeeping are shared. */
+/** Chapter 10's compilation context; capture and event bookkeeping are shared. */
public class SimpleGraphObserver extends GraphCapture<Node> {
private Parser _parser;
private Node _ret;
@@ -25,6 +25,8 @@ public class SimpleGraphObserver extends GraphCapture<Node> {
_phase = "Iter";
com.seaofnodes.simple.IterPeeps.iterate(_parser.STOP);
phase(_phase);
+ _phase = "TypeCheck";
+ _parser.STOP.typeCheck();
}
@Override protected String phase() { return _phase; }
@Override protected int pos() { return "Parse".equals(_phase) ? _parser.pos() : -1; }