diff options
| author | Cliff Click <cliffc@acm.org> | 2025-02-07 08:58:36 -0800 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-02-07 08:58:36 -0800 |
| commit | 2aa8c5d1d0659bd1c828134f1a1f14d025a2d0f1 (patch) | |
| tree | 0532f3ba5d74de006fcaa906dad9b787ebb06e2e /src/main/java/com/seaofnodes/simple/IRPrinter.java | |
| parent | 68dc63b9390bbe4ec50cc1b814d4e559e459c057 (diff) | |
| download | Simple-linear-chapter19.tar.gz Simple-linear-chapter19.zip | |
Ch# Chapter 19: Instruction Selection and Portable Compilationlinear-chapter19
Co-authored-by: hadha <helsgithub15@gmail.com>
Co-authored-by: Tamás Hadházy <85063808+Hels15@users.noreply.github.com>
Diffstat (limited to 'src/main/java/com/seaofnodes/simple/IRPrinter.java')
| -rw-r--r-- | src/main/java/com/seaofnodes/simple/IRPrinter.java | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/src/main/java/com/seaofnodes/simple/IRPrinter.java b/src/main/java/com/seaofnodes/simple/IRPrinter.java index aa498b16..3cddacfd 100644 --- a/src/main/java/com/seaofnodes/simple/IRPrinter.java +++ b/src/main/java/com/seaofnodes/simple/IRPrinter.java @@ -6,7 +6,7 @@ import java.util.ArrayList; import java.util.BitSet; import java.util.HashMap; -public class IRPrinter { +public abstract class IRPrinter { // Print a node on 1 line, columnar aligned, as: // NNID NNAME DDEF DDEF [[ UUSE UUSE ]] TYPE @@ -55,10 +55,8 @@ public class IRPrinter { Node n = rpos.get(i); if( n instanceof CFGNode || n.isMultiHead() ) { if( !gap ) sb.p("\n"); // Blank before multihead - if( n instanceof FunNode fun ) { - TypeFunPtr sig = fun.sig(); - sig.print(sb.p("--- ").p(sig._name==null ? "" : sig._name).p(" "),false).p("----------------------\n"); - } + if( n instanceof FunNode fun ) + fun.sig().print(sb.p("--- ").p(fun._name==null ? "" : fun._name).p(" "),false).p("----------------------\n"); printLine( n, sb ); // Print head while( --i >= 0 ) { Node t = rpos.get(i); @@ -66,8 +64,8 @@ public class IRPrinter { printLine( t, sb ); } if( n instanceof ReturnNode ret ) { - TypeFunPtr sig = ret.fun().sig(); - sig.print(sb.p("--- ").p(sig._name==null ? "" : sig._name).p(" "),false).p("----------------------\n"); + FunNode fun = ret.fun(); + fun.sig().print(sb.p("--- ").p(fun._name==null ? "" : fun._name).p(" "),false).p("----------------------\n"); } if( !(n instanceof CallNode) ) { sb.p("\n"); // Blank after multitail @@ -176,12 +174,12 @@ public class IRPrinter { private static String _prettyPrintScheduled( Node node, int depth ) { // Backwards DFS walk to depth. HashMap<Integer,Integer> ds = new HashMap<>(); - ArrayList<Node> ns = new ArrayList<>(); + Ary<Node> ns = new Ary<>(Node.class); _walk(ds,ns,node,depth); // Remove data projections, these are force-printed behind their multinode head for( int i=0; i<ns.size(); i++ ) { if( ns.get(i) instanceof ProjNode proj && !(proj.in(0) instanceof CFGNode) ) { - Utils.del(ns,i--); + ns.del(i--); ds.remove(proj._nid); } } @@ -192,11 +190,11 @@ public class IRPrinter { CFGNode blk = null; for( Node n : ns ) { CFGNode cfg = n instanceof CFGNode cfg0 && cfg0.blockHead() ? cfg0 : n.cfg0(); - if( blk==null || cfg.idepth() < blk.idepth() || (blk instanceof FunNode && !(cfg instanceof FunNode))) + if( blk==null || cfg.idepth() < blk.idepth() ) blk = cfg; } Integer d = ds.remove(blk._nid); - ns.remove(blk); + ns.del(ns.find(blk)); // Print block header sb.p("%-13.13s".formatted(label(blk)+":")); @@ -244,7 +242,7 @@ public class IRPrinter { return sb.toString(); } - private static void _walk( HashMap<Integer,Integer> ds, ArrayList<Node> ns, Node node, int d ) { + private static void _walk( HashMap<Integer,Integer> ds, Ary<Node> ns, Node node, int d ) { Integer nd = ds.get(node._nid); if( nd!=null && d <= nd ) return; // Been there, done that Integer old = ds.put(node._nid,d) ; @@ -270,11 +268,12 @@ public class IRPrinter { if( !blk.blockHead() ) blk = blk.cfg(0); sb.p( "%-9.9s ".formatted( label( blk ) ) ); } - static void printLine( Node n, SB sb, Ary<Node> bns, int i, HashMap<Integer,Integer> ds, ArrayList<Node> ns ) { + static void printLine( Node n, SB sb, Ary<Node> bns, int i, HashMap<Integer,Integer> ds, Ary<Node> ns ) { printLine( n, sb ); if( i != -1 ) bns.del(i); ds.remove(n._nid); - ns.remove(n); + int idx = ns.find(n); + if( idx!=-1 ) ns.del(idx); } } |
