diff options
| author | Cliff Click <cliffc@acm.org> | 2025-03-16 10:41:20 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-03-16 10:41:20 -0700 |
| commit | d15e43400bb7c7d0d27257d4c907206257c912b3 (patch) | |
| tree | 248ddae12f000c2e715ff7cf4e08f121fb92a9b2 | |
| parent | 30cea7d810dd9460fa7bd40d1dfb1393c71a0ee9 (diff) | |
| download | Simple-d15e43400bb7c7d0d27257d4c907206257c912b3.tar.gz Simple-d15e43400bb7c7d0d27257d4c907206257c912b3.zip | |
Unconditional jumps
49 files changed, 122 insertions, 77 deletions
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/CFGNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/CFGNode.java index c5cd95f0..37d08fb0 100644 --- a/chapter20/src/main/java/com/seaofnodes/simple/node/CFGNode.java +++ b/chapter20/src/main/java/com/seaofnodes/simple/node/CFGNode.java @@ -170,12 +170,11 @@ public abstract class CFGNode extends Node { return pre; } - boolean skip(CFGNode usecfg) { + private boolean skip(CFGNode usecfg) { // Only walk control users that are alive. // Do not walk from a Call to linked Fun's. return usecfg instanceof XCtrlNode || (this instanceof CallNode && usecfg instanceof FunNode) || (this instanceof ReturnNode && usecfg instanceof CallEndNode); } - } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java b/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java index ccb68fee..d004bb31 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java @@ -50,7 +50,7 @@ public class Encoding { return _code._regAlloc.regnum(n); } - public void add1( int op ) { _bits.write(op); } + public Encoding add1( int op ) { _bits.write(op); return this; } // Little endian write of a 32b opcode public void add4( int op ) { @@ -85,7 +85,7 @@ public class Encoding { assert t.isConstant(); // TODO: } - public void jump( IfNode jmp, CProjNode target ) { + public void jump( CFGNode jmp, CFGNode target ) { // TDOO: also support 1-byte offset and short jump and compressing the binary // TODO: record and patch } @@ -124,12 +124,20 @@ public class Encoding { // minimizes actual branches, takes advantage of fall-through edges, and // tries to help simple branch predictions: back branches are predicted // taken, forward not-taken. - private static void _rpo_cfg(CFGNode bb, BitSet visit, Ary<CFGNode> rpo) { + private void _rpo_cfg(CFGNode bb, BitSet visit, Ary<CFGNode> rpo) { if( visit.get(bb._nid) ) return; visit.set(bb._nid); if( bb.nOuts()==0 ) return; // StopNode if( !(bb instanceof IfNode iff) ) { CFGNode next = bb instanceof ReturnNode ? (CFGNode)bb.out(bb.nOuts()-1) : bb.uctrl(); + // If the *next* BB has already been visited, we require an + // unconditional backwards jump here + if( visit.get(next._nid) ) { + CFGNode jmp = _code._mach.jump(); + jmp.setDefX(0,bb); + next.setDef(next._inputs.find(bb),jmp); + rpo.add(jmp); + } _rpo_cfg(next,visit,rpo); } else { boolean invert = false; diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/AddFNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/AddFNode.java index 7d4e2910..792da62e 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/AddFNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/AddFNode.java @@ -13,7 +13,7 @@ public class AddFNode extends Node { @Override public String glabel() { return "+"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("("), visited); in(2)._print0(sb.append("+"), visited); return sb.append(")"); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java index bc65e79a..01d31aa2 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java @@ -15,7 +15,7 @@ public class AddNode extends Node { @Override public String glabel() { return "+"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("("), visited); in(2)._print0(sb.append("+"), visited); return sb.append(")"); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/BoolNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/BoolNode.java index e6b87ce8..f5f6a1de 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/BoolNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/BoolNode.java @@ -21,7 +21,7 @@ abstract public class BoolNode extends Node { public String glabel() { return op(); } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("("), visited); in(2)._print0(sb.append(op()), visited); return sb.append(")"); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java index 86d4a52b..5c44f49f 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java @@ -170,7 +170,7 @@ public abstract class CFGNode extends Node { return pre; } - boolean skip(CFGNode usecfg) { + private boolean skip(CFGNode usecfg) { // Only walk control users that are alive. // Do not walk from a Call to linked Fun's. return usecfg instanceof XCtrlNode || @@ -178,4 +178,8 @@ public abstract class CFGNode extends Node { (this instanceof ReturnNode && usecfg instanceof CallEndNode); } + + public String label( CFGNode target ) { + return (target instanceof LoopNode ? "LOOP" : "L")+target._nid; + } } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CProjNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CProjNode.java index f0a8e78a..d95ea227 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/CProjNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CProjNode.java @@ -24,7 +24,7 @@ public class CProjNode extends CFGNode { @Override public String label() { return _label; } - @Override StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(_label); } + @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(_label); } @Override public boolean blockHead() { return true; } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CallEndNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CallEndNode.java index 03a4462d..c98b2ff9 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/CallEndNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CallEndNode.java @@ -23,7 +23,7 @@ public class CallEndNode extends CFGNode implements MultiNode { public CallNode call() { return (CallNode)in(0); } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { sb.append("cend( "); sb.append( in(0) instanceof CallNode ? "Call, " : "----, "); for( int i=1; i<nIns()-1; i++ ) diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CallNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CallNode.java index c9bbcc52..f8f34422 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/CallNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CallNode.java @@ -21,7 +21,7 @@ public class CallNode extends CFGNode { @Override public String label() { return "Call"; } - @Override StringBuilder _print1(StringBuilder sb, BitSet visited) { + @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) { String fname = name(); if( fname == null ) fptr()._print0(sb,visited); else sb.append(fname); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CastNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CastNode.java index 5a92802c..939a5c97 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/CastNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CastNode.java @@ -31,7 +31,7 @@ public class CastNode extends Node { @Override public boolean isConst() { return true; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { return in(1)._print0(sb.append(label()), visited); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ConstantNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ConstantNode.java index 699ee76f..27d6f39e 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/ConstantNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ConstantNode.java @@ -42,7 +42,7 @@ public class ConstantNode extends Node { public String uniqueName() { return "Con_" + _nid; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { if( _con instanceof TypeFunPtr tfp && tfp.isConstant() ) { FunNode fun = CodeGen.CODE.link(tfp); if( fun._name != null ) diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CtrlNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CtrlNode.java index 61d9c310..eda7d684 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/CtrlNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CtrlNode.java @@ -8,7 +8,7 @@ import java.util.BitSet; public class CtrlNode extends CFGNode { public CtrlNode() { super(CodeGen.CODE._start); } @Override public String label() { return "Ctrl"; } - @Override StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append("Cctrl"); } + @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append("Cctrl"); } @Override public boolean isConst() { return true; } @Override public Type compute() { return Type.CONTROL; } @Override public Node idealize() { return null; } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/DivFNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/DivFNode.java index a6e459c9..633f3224 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/DivFNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/DivFNode.java @@ -13,7 +13,7 @@ public class DivFNode extends Node { @Override public String glabel() { return "/"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("("), visited); in(2)._print0(sb.append("/"), visited); return sb.append(")"); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java index 0d5ed297..41518311 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java @@ -12,7 +12,7 @@ public class DivNode extends Node { @Override public String glabel() { return "//"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("("), visited); in(2)._print0(sb.append("/"), visited); return sb.append(")"); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/FRefNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/FRefNode.java index f0c4045d..e9df25f9 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/FRefNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/FRefNode.java @@ -19,7 +19,7 @@ public class FRefNode extends ConstantNode { @Override public String uniqueName() { return "FRef_" + _nid; } - @Override StringBuilder _print1(StringBuilder sb, BitSet visited) { + @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append("FRef_").append(_n); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java index b70a938d..e5174823 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java @@ -29,7 +29,7 @@ public class LoadNode extends MemOpNode { @Override public String glabel() { return "." +_name; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(".").append(_name); } + public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(".").append(_name); } @Override public Type compute() { diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/LogicalNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/LogicalNode.java index 8c3452bf..e8552789 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/LogicalNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/LogicalNode.java @@ -13,7 +13,7 @@ public abstract class LogicalNode extends Node { abstract String op(); @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("("), visited); in(2)._print0(sb.append(op()), visited); return sb.append(")"); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java index 1495a703..5729aea2 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java @@ -30,7 +30,7 @@ public class MemMergeNode extends Node { @Override public boolean isMem() { return true; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { sb.append(_inProgress ? "Merge[" : "MEM[ "); for( int j=2; j<nIns(); j++ ) { sb.append(j); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MemOpNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MemOpNode.java index cba4dc1b..de27bc75 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/MemOpNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MemOpNode.java @@ -47,7 +47,7 @@ public abstract class MemOpNode extends Node { public Node ptr() { return in(2); } public Node off() { return in(3); } - @Override StringBuilder _print1( StringBuilder sb, BitSet visited ) { return _printMach(sb,visited); } + @Override public StringBuilder _print1( StringBuilder sb, BitSet visited ) { return _printMach(sb,visited); } public StringBuilder _printMach( StringBuilder sb, BitSet visited ) { throw Utils.TODO(); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MinusFNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MinusFNode.java index 2b749ba3..99fc3144 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/MinusFNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MinusFNode.java @@ -13,7 +13,7 @@ public class MinusFNode extends Node { @Override public String glabel() { return "-"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("(-"), visited); return sb.append(")"); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java index dd2cbd26..e06e0c69 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java @@ -14,7 +14,7 @@ public class MinusNode extends Node { @Override public String glabel() { return "-"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("(-"), visited); return sb.append(")"); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MulFNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MulFNode.java index 2d44a9fb..6fbf4bbb 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/MulFNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MulFNode.java @@ -13,7 +13,7 @@ public class MulFNode extends Node { @Override public String glabel() { return "*"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("("), visited); in(2)._print0(sb.append("*"), visited); return sb.append(")"); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java index 80f8c319..384dbace 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java @@ -13,7 +13,7 @@ public class MulNode extends Node { @Override public String glabel() { return "*"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("("), visited); in(2)._print0(sb.append("*"), visited); return sb.append(")"); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/NewNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/NewNode.java index 80545d66..5ce0c1fb 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/NewNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/NewNode.java @@ -39,7 +39,7 @@ public class NewNode extends Node implements MultiNode { } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { sb.append("new "); return sb.append(_ptr._obj.str()); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java index b3d6c94e..3201ff3b 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java @@ -120,7 +120,7 @@ public abstract class Node { : _print1(sb, visited); } // Every Node implements this; a partial-line recursive print - abstract StringBuilder _print1(StringBuilder sb, BitSet visited); + abstract public StringBuilder _print1(StringBuilder sb, BitSet visited); public String p(int depth) { return IRPrinter.prettyPrint(this,depth); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/NotNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/NotNode.java index b454de66..0314841d 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/NotNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/NotNode.java @@ -12,7 +12,7 @@ public class NotNode extends Node { @Override public String glabel() { return "!"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("(!"), visited); return sb.append(")"); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ParmNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ParmNode.java index 8d7c4205..9e11a129 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/ParmNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ParmNode.java @@ -22,7 +22,7 @@ public class ParmNode extends PhiNode { public FunNode fun() { return (FunNode)in(0); } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { if( "main".equals(fun()._name) && _label.equals("arg") ) return sb.append("arg"); sb.append("Parm_").append(_label).append("("); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/PhiNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/PhiNode.java index 16f38d45..6c51b613 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/PhiNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/PhiNode.java @@ -29,7 +29,7 @@ public class PhiNode extends Node { @Override public String glabel() { return "φ_"+_label; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { if( !(region() instanceof RegionNode r) || r.inProgress() ) sb.append("Z"); sb.append("Phi("); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ProjNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ProjNode.java index 3d9db4ed..6ad5326d 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/ProjNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ProjNode.java @@ -24,7 +24,7 @@ public class ProjNode extends Node { @Override public String label() { return _label; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { if( _label != null ) return sb.append(_label); if( in(0) instanceof CallEndNode cend && cend.call()!=null ) return cend.call()._print0(sb,visited); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java index b755af3f..e9c25f47 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java @@ -14,7 +14,7 @@ public class ReadOnlyNode extends Node { @Override public String label() { return "ReadOnly"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { return in(1)._print0(sb.append("(const)"),visited); } @Override public Type compute() { diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/RegionNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/RegionNode.java index fb6539ae..0186ae45 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/RegionNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/RegionNode.java @@ -17,7 +17,7 @@ public class RegionNode extends CFGNode { public String label() { return "Region"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(label()); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java index 809dd1e1..f0b7d49e 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java @@ -35,7 +35,7 @@ public class ReturnNode extends CFGNode { public String label() { return "Return"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { sb.append("return "); if( expr()==null ) sb.append("----"); else expr()._print0(sb, visited); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java b/chapter21/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java index 44d3a587..7936086d 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java @@ -13,7 +13,7 @@ public class RoundF32Node extends Node { @Override public String glabel() { return "(f32)"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { return in(1)._print0(sb.append("((f32)"), visited).append(")"); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ScopeNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ScopeNode.java index f193e55a..38a5d968 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/ScopeNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ScopeNode.java @@ -44,7 +44,7 @@ public class ScopeNode extends MemMergeNode { @Override public String label() { return "Scope"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { sb.append("Scope[ "); int j=1; for( int i=0; i<nIns(); i++ ) { diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/StartNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/StartNode.java index 22a1750d..4bd76f50 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/StartNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/StartNode.java @@ -25,7 +25,7 @@ public class StartNode extends LoopNode implements MultiNode { @Override public String label() { return "Start"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(label()); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/StopNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/StopNode.java index b4cb002b..953324e7 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/StopNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/StopNode.java @@ -21,7 +21,7 @@ public class StopNode extends CFGNode { } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { // For the sake of many old tests, and single value prints as "return val" if( ret()!=null ) return ret()._print0(sb,visited); sb.append("Stop[ "); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java index 93294dba..2d553810 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java @@ -33,7 +33,7 @@ public class StoreNode extends MemOpNode { public Node val() { return in(4); } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(".").append(_name).append("=").append( val()).append(";"); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/StructNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/StructNode.java index 076b342a..9cb3a820 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/StructNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/StructNode.java @@ -14,7 +14,7 @@ public class StructNode extends Node { @Override public String label() { return _ts==null ? "STRUCT?" : _ts.str(); } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { if( _ts==null ) return sb.append("STRUCT?"); sb.append(_ts._name).append(" {"); for( int i=0; i<nIns(); i++ ) { diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/SubFNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/SubFNode.java index b591718d..5c7e969f 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/SubFNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/SubFNode.java @@ -13,7 +13,7 @@ public class SubFNode extends Node { @Override public String glabel() { return "-"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("("), visited); in(2)._print0(sb.append("-"), visited); return sb.append(")"); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java index 339c65ca..4290ff9b 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -13,7 +13,7 @@ public class SubNode extends Node { @Override public String glabel() { return "-"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("("), visited); in(2)._print0(sb.append("-"), visited); return sb.append(")"); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java index 1f4d67e0..c098ad99 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java @@ -14,7 +14,7 @@ public class ToFloatNode extends Node { @Override public String glabel() { return "(flt)"; } @Override - StringBuilder _print1(StringBuilder sb, BitSet visited) { + public StringBuilder _print1(StringBuilder sb, BitSet visited) { return in(1)._print0(sb.append("(flt)"), visited); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java index da021246..8c620a04 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java @@ -8,7 +8,7 @@ import java.util.BitSet; public class XCtrlNode extends CFGNode { public XCtrlNode() { super(new Node[]{CodeGen.CODE._start}); } @Override public String label() { return "Xctrl"; } - @Override StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append("Xctrl"); } + @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append("Xctrl"); } @Override public boolean isConst() { return true; } @Override public Type compute() { return Type.XCONTROL; } @Override public Node idealize() { return null; } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java index db4c7523..b0a517b0 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java @@ -40,11 +40,11 @@ public class BranchARM extends IfNode implements MachNode{ } @Override public void asm(CodeGen code, SB sb) { String src = code.reg(in(1)); - if( src!="flags" ) sb.p(src); - Node prj = cproj(0); + if( src!="flags" ) sb.p(src).p(" "); + CFGNode prj = cproj(0); while( prj.nOuts() == 1 ) - prj = prj.out(0); // Skip empty blocks - sb.p(prj instanceof LoopNode ? " LOOP" : " L").p(prj._nid); + prj = prj.uctrl(); // Skip empty blocks + sb.p(label(prj)); } @Override public String comment() { return "L"+cproj(1)._nid; } } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java index 9cea79e6..b0283ae9 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java @@ -3,7 +3,6 @@ package com.seaofnodes.simple.node.cpus.riscv; import com.seaofnodes.simple.*; import com.seaofnodes.simple.codegen.*; import com.seaofnodes.simple.node.*; - import java.util.BitSet; // Conditional branch such as: BEQ @@ -46,9 +45,9 @@ public class BranchRISC extends IfNode implements MachNode { } @Override public void asm(CodeGen code, SB sb) { sb.p(code.reg(in(1))).p(" ").p(_bop).p(" ").p(in(2)==null ? "#0" : code.reg(in(2))).p(" "); - Node prj = cproj(0); + CFGNode prj = cproj(0); while( prj.nOuts() == 1 ) - prj = prj.out(0); // Skip empty blocks - sb.p(prj instanceof LoopNode ? " LOOP" : " L").p(prj._nid); + prj = prj.uctrl(); // Skip empty blocks + sb.p(label(prj)); } } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java new file mode 100644 index 00000000..97a8c224 --- /dev/null +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java @@ -0,0 +1,33 @@ +package com.seaofnodes.simple.node.cpus.riscv; + +import com.seaofnodes.simple.*; +import com.seaofnodes.simple.codegen.*; +import com.seaofnodes.simple.node.*; +import com.seaofnodes.simple.type.Type; +import java.util.BitSet; + +// unconditional jump +public class UJmpRISC extends CFGNode implements MachNode { + UJmpRISC() { } + @Override public String op() { return "jmp"; } + @Override public String label() { return op(); } + @Override public StringBuilder _print1( StringBuilder sb, BitSet visited ) { + return sb.append("jmp "); + } + @Override public RegMask regmap(int i) {return null; } + @Override public RegMask outregmap() { return null; } + @Override public Type compute() { throw Utils.TODO(); } + @Override public Node idealize() { throw Utils.TODO(); } + @Override public void encoding( Encoding enc ) { + enc.jump(this,uctrl()); + //int body = riscv.b_type(0x63, 0, riscv.jumpop(_bop), src1, src2, 0); + //enc.add4(body); + throw Utils.TODO(); + } + + @Override public void asm(CodeGen code, SB sb) { + CFGNode target = uctrl(); + assert target.nOuts() > 1; // Should optimize jmp to empty targets + sb.p(label(target)); + } +} diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java index ae5635b8..d15c0177 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java @@ -11,10 +11,8 @@ public class JmpX86 extends IfNode implements MachNode { super(iff); _bop = bop; } - @Override public String op() { return "j"+_bop; } @Override public String label() { return op(); } - @Override public void postSelect() { Node set = in(1); Node cmp = set.in(1); @@ -31,19 +29,17 @@ public class JmpX86 extends IfNode implements MachNode { // Encoding is appended into the byte array; size is returned @Override public void encoding( Encoding enc ) { enc.jump(this,cproj(0)); - // common opcode - enc.add1(0x0F); - enc.add1(x86_64_v2.jumpop(_bop)); + enc.add1(0x0F).add1(x86_64_v2.jumpop(_bop)); enc.add4(0); // Offset patched later } @Override public void asm(CodeGen code, SB sb) { String src = code.reg(in(1)); - if( src!="flags" ) sb.p(src); - Node prj = cproj(0); // 0 is True is jump target + if( src!="flags" ) sb.p(src).p(" "); + CFGNode prj = cproj(0); // 0 is True is jump target while( prj.nOuts() == 1 ) - prj = prj.out(0); // Skip empty blocks - sb.p(prj instanceof LoopNode ? " LOOP" : " L").p(prj._nid); + prj = prj.uctrl(); // Skip empty blocks + sb.p(label(prj)); } @Override public String comment() { return "L"+cproj(1)._nid; } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java index 6d52df9d..a6e51856 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java @@ -3,22 +3,30 @@ package com.seaofnodes.simple.node.cpus.x86_64_v2; import com.seaofnodes.simple.*; import com.seaofnodes.simple.codegen.*; import com.seaofnodes.simple.node.*; +import com.seaofnodes.simple.type.Type; +import java.util.BitSet; // unconditional jump -// E9 cd JMP rel32 -public class UJmpX86 implements MachNode { +public class UJmpX86 extends CFGNode implements MachNode { UJmpX86() { } @Override public String op() { return "jmp"; } + @Override public String label() { return op(); } + @Override public StringBuilder _print1( StringBuilder sb, BitSet visited ) { + return sb.append("jmp "); + } @Override public RegMask regmap(int i) {return null; } @Override public RegMask outregmap() { return null; } - // Encoding is appended into the byte array; size is returned + @Override public Type compute() { throw Utils.TODO(); } + @Override public Node idealize() { throw Utils.TODO(); } @Override public void encoding( Encoding enc ) { - //enc.jump(); - //// E9 cd JMP rel32 - //enc.add1(0xE9); - //enc.add4(0); - throw Utils.TODO(); + enc.jump(this,uctrl()); + // E9 cd JMP rel32 + enc.add1(0xE9).add4(0); } - @Override public void asm(CodeGen code, SB sb) { } + @Override public void asm(CodeGen code, SB sb) { + CFGNode target = uctrl(); + assert target.nOuts() > 1; // Should optimize jmp to empty targets + sb.p(label(target)); + } } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java index 8cd7128d..70d03a12 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java @@ -312,15 +312,13 @@ public class x86_64_v2 extends Machine { } // Create a split op; any register to any register, including stack slots - @Override - public SplitNode split(String kind, byte round, LRG lrg) { + @Override public SplitNode split(String kind, byte round, LRG lrg) { return new SplitX86(kind, round); } // Return a MachNode unconditional branch - @Override - public CFGNode jump() { - throw Utils.TODO(); + @Override public CFGNode jump() { + return new UJmpX86(); } // Break an infinite loop diff --git a/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java b/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java index eee4ceb7..648edbe1 100644 --- a/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java +++ b/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java @@ -78,6 +78,6 @@ return sqrt(farg) + sqrt(farg+2.0); """; testCPU(src,"x86_64_v2", "SystemV",3,"return .[];"); testCPU(src,"riscv" , "SystemV",1,"return (add,.[],(mul,.[],1000));"); - testCPU(src,"arm" , "SystemV",1,"return (add,.[],(muli,.[]));"); + testCPU(src,"arm" , "SystemV",1,"return (add,.[],(mul,.[],1000));"); } } |
