summaryrefslogtreecommitdiff
path: root/src/main/java/com/seaofnodes/simple/IRPrinter.java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-02-07 08:58:36 -0800
committerCliff Click <cliffc@acm.org>2025-02-07 08:58:36 -0800
commit2aa8c5d1d0659bd1c828134f1a1f14d025a2d0f1 (patch)
tree0532f3ba5d74de006fcaa906dad9b787ebb06e2e /src/main/java/com/seaofnodes/simple/IRPrinter.java
parent68dc63b9390bbe4ec50cc1b814d4e559e459c057 (diff)
downloadSimple-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.java27
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);
}
}