summaryrefslogtreecommitdiff
path: root/chapter05/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'chapter05/src/main/java/com')
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java10
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/Parser.java4
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/BoolNode.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/Control.java9
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/IfNode.java13
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/Node.java3
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/PhiNode.java5
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/ProjNode.java4
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/RegionNode.java10
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/ReturnNode.java3
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/StartNode.java6
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/StopNode.java4
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/type/TypeTuple.java4
13 files changed, 41 insertions, 36 deletions
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java b/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java
index eaeb8095..3470a49a 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java
@@ -71,7 +71,7 @@ public class GraphVisualizer {
sb.append("\t\t\t\t<TR>");
}
sb.append("<TD PORT=\"p").append(proj._idx).append("\"");
- if( proj._idx==0 ) sb.append(" BGCOLOR=\"yellow\"");
+ if( proj.isCFG() ) sb.append(" BGCOLOR=\"yellow\"");
sb.append(">").append(proj.label()).append("</TD>");
}
}
@@ -86,7 +86,7 @@ public class GraphVisualizer {
} else {
// control nodes have box shape
// other nodes are ellipses, i.e. default shape
- if( n instanceof Control )
+ if( n.isCFG() )
sb.append("shape=box style=filled fillcolor=yellow ");
sb.append("label=\"").append(lab).append("\" ");
}
@@ -120,10 +120,6 @@ public class GraphVisualizer {
private String makeScopeName(int level) { return "scope" + level; }
private String makePortName(String scopeName, String varName) { return scopeName + "_" + varName; }
- private boolean isControlEdge(Node def) {
- return def._type instanceof TypeControl;
- }
-
// Walk the node edges
private void nodeEdges(StringBuilder sb, Collection<Node> all) {
for( Node n : all ) {
@@ -137,7 +133,7 @@ public class GraphVisualizer {
sb.append(mname).append(":p").append(proj._idx);
} else sb.append(def.uniqueName());
// Control edges are colored red
- if( isControlEdge(def) )
+ if( def.isCFG() )
sb.append(" [color=red]");
sb.append(";\n");
}
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/Parser.java b/chapter05/src/main/java/com/seaofnodes/simple/Parser.java
index 331916fb..e5d2901e 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/Parser.java
@@ -112,8 +112,8 @@ public class Parser {
// IfNode takes current control and predicate
IfNode ifNode = new IfNode(_scope.lookup("$ctrl"), pred);
// Setup projection nodes
- ProjNode ifT = new ProjNode(ifNode, 0, "ifT");
- ProjNode ifF = new ProjNode(ifNode, 1, "ifF");
+ ProjNode ifT = new ProjNode(ifNode, 0, "True");
+ ProjNode ifF = new ProjNode(ifNode, 1, "False");
// In if true branch, the ifT proj node becomes the ctrl
// But first clone the scope and set it as current
ScopeNode savedScope = _scope;
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/BoolNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/BoolNode.java
index b0e0bf42..250231f9 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/BoolNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/BoolNode.java
@@ -13,7 +13,7 @@ abstract public class BoolNode extends Node {
abstract String op(); // String opcode name
@Override
- public String label() { return op(); }
+ public String label() { return getClass().getSimpleName(); }
@Override
StringBuilder _print1(StringBuilder sb) {
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/Control.java b/chapter05/src/main/java/com/seaofnodes/simple/node/Control.java
deleted file mode 100644
index 48cf2b7a..00000000
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/Control.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.seaofnodes.simple.node;
-
-
-/**
- * Control interface is a marker interface to be implemented
- * by Control nodes.
- */
-public interface Control {
-}
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/IfNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/IfNode.java
index 460054ec..feb4f245 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/IfNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/IfNode.java
@@ -1,7 +1,7 @@
package com.seaofnodes.simple.node;
import com.seaofnodes.simple.type.Type;
-import com.seaofnodes.simple.type.TypeBot;
+import com.seaofnodes.simple.type.TypeTuple;
public class IfNode extends MultiNode {
@@ -10,18 +10,19 @@ public class IfNode extends MultiNode {
}
@Override
- public String label() {
- return "If";
- }
+ public String label() { return "If"; }
@Override
StringBuilder _print1(StringBuilder sb) {
- return sb;
+ sb.append("if( ");
+ return in(1)._print0(sb).append(" )");
}
+ @Override public boolean isCFG() { return true; }
+
@Override
public Type compute() {
- return TypeBot.BOTTOM;
+ return TypeTuple.IF;
}
@Override
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter05/src/main/java/com/seaofnodes/simple/node/Node.java
index 65ebef5b..2cafb1fa 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -113,13 +113,14 @@ public abstract class Node {
public boolean isUnused() { return nOuts() == 0; }
+ public boolean isCFG() { return false; }
+
/**
* We allow disabling peephole opt so that we can observe the
* full graph, vs the optimized graph.
*/
public static boolean _disablePeephole = false;
-
/**
* Try to peephole at this node and return a better replacement Node if
* possible. We compute a {@link Type} and then check and replace:
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/PhiNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/PhiNode.java
index 25308724..5e979cfd 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/PhiNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/PhiNode.java
@@ -16,6 +16,11 @@ public class PhiNode extends Node {
@Override
StringBuilder _print1(StringBuilder sb) {
+ sb.append("Phi(");
+ for( Node in : _inputs )
+ in._print0(sb).append(",");
+ sb.setLength(sb.length()-1);
+ sb.append(")");
return sb;
}
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/ProjNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/ProjNode.java
index be37c514..c9b1ec07 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/ProjNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/ProjNode.java
@@ -22,7 +22,9 @@ public class ProjNode extends Node {
public String label() { return _label; }
@Override
- StringBuilder _print1(StringBuilder sb) { return sb.append("Proj_" +_nid); }
+ StringBuilder _print1(StringBuilder sb) { return sb.append(_label).append(_nid); }
+
+ @Override public boolean isCFG() { return _idx==0 || ctrl() instanceof IfNode; }
public MultiNode ctrl() { return (MultiNode)in(0); }
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/RegionNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/RegionNode.java
index 96840ae5..d29cbd57 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/RegionNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/RegionNode.java
@@ -1,9 +1,9 @@
package com.seaofnodes.simple.node;
import com.seaofnodes.simple.type.Type;
-import com.seaofnodes.simple.type.TypeBot;
+import com.seaofnodes.simple.type.TypeControl;
-public class RegionNode extends Node implements Control {
+public class RegionNode extends Node {
public RegionNode(Node... inputs) {
super(inputs);
}
@@ -15,12 +15,14 @@ public class RegionNode extends Node implements Control {
@Override
StringBuilder _print1(StringBuilder sb) {
- return sb;
+ return sb.append("Region").append(_nid);
}
+ @Override public boolean isCFG() { return true; }
+
@Override
public Type compute() {
- return TypeBot.BOTTOM;
+ return TypeControl.CONTROL;
}
@Override
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/ReturnNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
index c94115bb..681bd175 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
@@ -12,7 +12,7 @@ import com.seaofnodes.simple.type.TypeBot;
* <p>
* The Return's output is the value from the data node.
*/
-public class ReturnNode extends Node implements Control {
+public class ReturnNode extends Node {
public ReturnNode(Node ctrl, Node data) {
super(ctrl, data);
@@ -29,6 +29,7 @@ public class ReturnNode extends Node implements Control {
return expr()._print0(sb.append("return ")).append(";");
}
+ @Override public boolean isCFG() { return true; }
@Override
public Type compute() {
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/StartNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/StartNode.java
index 583cf054..91573de8 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/StartNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/StartNode.java
@@ -11,7 +11,7 @@ import com.seaofnodes.simple.type.TypeTuple;
* will require Projections to extract the values. We discuss this in detail
* in Chapter 9: Functions and Calls.
*/
-public class StartNode extends MultiNode implements Control {
+public class StartNode extends MultiNode {
final TypeTuple _args;
@@ -27,7 +27,9 @@ public class StartNode extends MultiNode implements Control {
StringBuilder _print1(StringBuilder sb) {
return sb.append(label());
}
-
+
+ @Override public boolean isCFG() { return true; }
+
@Override
public TypeTuple compute() { return _args; }
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/StopNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/StopNode.java
index b710e160..b0c851a2 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/StopNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/StopNode.java
@@ -3,7 +3,7 @@ package com.seaofnodes.simple.node;
import com.seaofnodes.simple.type.Type;
import com.seaofnodes.simple.type.TypeBot;
-public class StopNode extends Node implements Control {
+public class StopNode extends Node {
public StopNode(Node... inputs) {
super(inputs);
}
@@ -18,6 +18,8 @@ public class StopNode extends Node implements Control {
return sb;
}
+ @Override public boolean isCFG() { return true; }
+
@Override
public Type compute() {
return TypeBot.BOTTOM;
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/type/TypeTuple.java b/chapter05/src/main/java/com/seaofnodes/simple/type/TypeTuple.java
index ef87a415..4d7a79bc 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/type/TypeTuple.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/type/TypeTuple.java
@@ -1,7 +1,7 @@
package com.seaofnodes.simple.type;
public class TypeTuple extends Type {
-
+
public final Type[] _types;
public TypeTuple(Type[] _types) {
@@ -17,4 +17,6 @@ public class TypeTuple extends Type {
public StringBuilder _print(StringBuilder sb) {
return sb;
}
+
+ public static final TypeTuple IF = new TypeTuple(new Type[]{TypeControl.CONTROL,TypeControl.CONTROL});
}