package com.seaofnodes.simple.node; import com.seaofnodes.print.ExprPrinter; import com.seaofnodes.simple.*; import com.seaofnodes.simple.codegen.CodeGen; import com.seaofnodes.simple.util.BAOS; import com.seaofnodes.simple.type.*; import com.seaofnodes.simple.util.Utils; import java.util.*; /** * Memory Merge - a merge of many aliases into a "fat memory". All aliases * are here, but most will be lazy - take the default fat memory. */ public class MemMergeNode extends Node { public MemMergeNode( Node ...nodes) { super(nodes); _type = TypeMem.BOT; } public MemMergeNode(MemMergeNode mem) { super(mem); } @Override public Tag serialTag() { return Tag.MemMerge; } public void packed( BAOS baos, HashMap strs, HashMap types, IdentityHashMap anodes ) { baos.packed1(nIns()); } static Node make( BAOS bais ) { Node mem = new MemMergeNode(); mem.setDefX(bais.packed1()-1,null); return mem; } @Override public String label() { return "ALLMEM"; } @Override public boolean isMem() { return true; } @Override protected ExprPrinter _print1(ExprPrinter p) { p.p("MEM[ "); for( int j=2; j=nIns() || in(i)==null ) setDefX(i,mem.in(i)); } } CodeGen.CODE.add(mem.in(1)); setDef(1,mem.in(1)); return unkeep(); } return progress ? this : null; } public Node in( Var v ) { return in(v._idx); } public Node alias( int alias ) { assert !(in(1) instanceof BulkMemPhiNode bulk && bulk.isSplit(alias) && (alias >= nIns() || in(alias)==null)); return alias < nIns() && in(alias)!=null ? in(alias) : in(1); } public Node alias( int alias, Node st ) { return setDefX(alias,st); } // Now one-time do a useless-phi removal void _useless( ) { for( int i=1; i