package com.seaofnodes.simple.print; import com.seaofnodes.graph.GraphAdapter; import com.seaofnodes.graph.GraphSnapshot.*; import com.seaofnodes.simple.codegen.CodeGen; import com.seaofnodes.simple.node.*; import com.seaofnodes.simple.node.Node; import com.seaofnodes.simple.type.TypeMem; /** Chapter 25's view of the IR, including partially constructed parse-time graphs. */ public class SimpleGraphAdapter extends GraphAdapter { @Override protected boolean show(Node n) { if( n != CodeGen.CODE.ZERO && n != CodeGen.CODE.XCTRL ) return true; for( int i=0; i0 && n.in(i) instanceof ReturnNode ret ? ref(ret.fun()) : 0; } @Override protected int projectionIndex(Node n) { return n instanceof Proj p ? p.idx() : -1; } @Override protected boolean folding(Node n) { if( n instanceof FunNode fun ) return fun.folding(); if( n instanceof ReturnNode ret ) return ret.fun().folding(); if( n instanceof CallEndNode cend ) return cend.folding(); if( n instanceof CallNode ) for( int i=0; i= 2) ) return Role.MEM; Node def = n.in(i); if( def instanceof CFGNode ) return Role.CTRL; if( def != null && isMem(def) ) return Role.MEM; return Role.DATA; } private boolean isMem(Node n) { // These Phi subclasses are memory even before their first type computation. return n instanceof MemPhiNode || n instanceof BulkMemPhiNode || n.isMem() || n._type instanceof TypeMem; } }