diff options
| author | Cliff Click <cliffc@acm.org> | 2023-10-27 16:49:37 -0700 |
|---|---|---|
| committer | Dibyendu Majumdar <dibyendumajumdar@users.noreply.github.com> | 2023-11-01 18:56:50 +0000 |
| commit | 9be4a28daa683d6fad406dfb12000f509a2e7896 (patch) | |
| tree | a61c0642ed67fd1d9ed8f5c0d9032f59a9508be6 /chapter05/src | |
| parent | bb76f85f0e2d1f2c47443143e0b96d608be7820d (diff) | |
| download | Simple-9be4a28daa683d6fad406dfb12000f509a2e7896.tar.gz Simple-9be4a28daa683d6fad406dfb12000f509a2e7896.zip | |
Some initial Ch 5 cleanup
Drop Control interface, not flexible enough. Use isCFG() call, overloaded in child classes. Projections have a more complex test.
Missing some printouts in Bool children, If, Region, Phi.
IfNode type is a tuple. Region is TypeControl.
Diffstat (limited to 'chapter05/src')
14 files changed, 42 insertions, 37 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}); } diff --git a/chapter05/src/test/java/com/seaofnodes/simple/Chapter05Test.java b/chapter05/src/test/java/com/seaofnodes/simple/Chapter05Test.java index 858e2470..0604e9c6 100644 --- a/chapter05/src/test/java/com/seaofnodes/simple/Chapter05Test.java +++ b/chapter05/src/test/java/com/seaofnodes/simple/Chapter05Test.java @@ -15,7 +15,7 @@ public class Chapter05Test { @Test public void testChapter5IfStmt() { - Parser parser = new Parser("int a = 1; if (arg == 1) a = arg+2; else a = arg-3; return a;", TypeInteger.BOT); + Parser parser = new Parser("int a = 1; if (arg == 1) a = arg+2; else a = arg-3; return a; #showGraph;", TypeInteger.BOT); ReturnNode ret = parser.parse(); } |
