From 9be4a28daa683d6fad406dfb12000f509a2e7896 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Fri, 27 Oct 2023 16:49:37 -0700 Subject: 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. --- .../main/java/com/seaofnodes/simple/GraphVisualizer.java | 10 +++------- chapter05/src/main/java/com/seaofnodes/simple/Parser.java | 4 ++-- .../src/main/java/com/seaofnodes/simple/node/BoolNode.java | 2 +- .../src/main/java/com/seaofnodes/simple/node/Control.java | 9 --------- .../src/main/java/com/seaofnodes/simple/node/IfNode.java | 13 +++++++------ .../src/main/java/com/seaofnodes/simple/node/Node.java | 3 ++- .../src/main/java/com/seaofnodes/simple/node/PhiNode.java | 5 +++++ .../src/main/java/com/seaofnodes/simple/node/ProjNode.java | 4 +++- .../main/java/com/seaofnodes/simple/node/RegionNode.java | 10 ++++++---- .../main/java/com/seaofnodes/simple/node/ReturnNode.java | 3 ++- .../src/main/java/com/seaofnodes/simple/node/StartNode.java | 6 ++++-- .../src/main/java/com/seaofnodes/simple/node/StopNode.java | 4 +++- .../src/main/java/com/seaofnodes/simple/type/TypeTuple.java | 4 +++- 13 files changed, 41 insertions(+), 36 deletions(-) delete mode 100644 chapter05/src/main/java/com/seaofnodes/simple/node/Control.java (limited to 'chapter05/src/main/java') 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"); } sb.append("").append(proj.label()).append(""); } } @@ -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 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; *

* 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}); } -- cgit v1.2.3