aa
com.cliffc.aa.node.CallEpiNode Class Reference
Inheritance diagram for com.cliffc.aa.node.CallEpiNode:
[legend]
Collaboration diagram for com.cliffc.aa.node.CallEpiNode:
[legend]

Public Member Functions

 CallEpiNode (Node... nodes)
 
Node add_def (Node n)
 
void add_flow_def_extra (Node chg)
 
void add_flow_extra (Type old)
 
void add_flow_use_extra (Node chg)
 
void add_reduce_extra ()
 
TypeMem all_live ()
 
CallNode call ()
 
boolean check_and_wire ()
 
Node copy (boolean copy_edges)
 
void del (int idx)
 
Node do_flow ()
 
Node do_grow ()
 
Node do_mono ()
 
Node do_reduce ()
 
String dump (int max)
 
String dump (int max, boolean prims, boolean plive)
 
String dumprpo (boolean prims, boolean plive)
 
boolean equals (Object o)
 
ErrMsg err (boolean fast)
 
Node find (int uid)
 
Node get_mem_writer ()
 
int hashCode ()
 
Node ideal_grow ()
 
Node ideal_mono ()
 
Node ideal_reduce ()
 
Node in (int i)
 
Node init1 ()
 
Node insert (int idx, Node n)
 
void insert (Node nnn)
 
Node is_copy (int idx)
 
boolean is_dead ()
 
boolean is_forward_ref ()
 
boolean is_mem ()
 
boolean is_multi_head ()
 
boolean is_prim ()
 
Node kill ()
 
int len ()
 
TypeMem live (GVNGCM.Mode opt_mode)
 
TypeMem live_use (GVNGCM.Mode opt_mode, Node def)
 
boolean live_uses ()
 
final int more_flow (boolean lifting)
 
final boolean more_ideal (VBitSet bs)
 
TV2 new_tvar (String alloc_site)
 
int nwired ()
 
byte op_prec ()
 
Node pop ()
 
Node remove (int idx)
 
void replace (Node old, Node nnn)
 
void set_dead ()
 
Node set_def (int idx, Node n)
 
Type sharptr (Node mem)
 
boolean should_con (Type t)
 
Node subsume (Node nnn)
 
String toString ()
 
TV2 tvar ()
 
TV2 tvar (int x)
 
void unelock ()
 
boolean unify (boolean test)
 
Type val (int idx)
 
Type value (GVNGCM.Mode opt_mode)
 
final void walk_initype (GVNGCM gvn, VBitSet bs)
 
void walk_opt (VBitSet visit)
 
void walkerr_def (HashSet< ErrMsg > errs, VBitSet bs)
 
RetNode wired (int x)
 
Node xliv (GVNGCM.Mode opt_mode)
 
String xstr ()
 
Type xval ()
 

Static Public Member Functions

static Node con (Type t)
 
static void init0 ()
 
static void reset_to_init0 ()
 
static void roll_back_CNT ()
 

Public Attributes

Ary< Node_defs
 
boolean _elock
 
boolean _is_copy
 
byte _keep
 
TypeMem _live
 
int _uid
 
Ary< Node_uses
 
Type _val
 

Static Public Attributes

static int _INIT0_CNT
 
static final ConcurrentHashMap< Node, NodeVALS = new ConcurrentHashMap<>()
 

Package Functions

Node _elock ()
 
boolean check_solo_mem_writer (Node memw)
 
BitsAlias escapees ()
 
boolean is_CFG ()
 
Node is_pure_call ()
 
public< N extends Node > N keep ()
 
public< N extends Node > N keep (int d)
 
int newuid ()
 
boolean sane_wiring ()
 
String str ()
 
public< N extends Node > N unhook ()
 
public< N extends Node > N unkeep ()
 
public< N extends Node > N unkeep (int d)
 
CallEpiNode unwire (CallNode call, RetNode ret)
 
Node walk_dom_last (Predicate< Node > P)
 
void wire0 (CallNode call, Node fun)
 
void wire1 (CallNode call, Node fun, Node ret)
 

Static Package Functions

 [static initializer]
 
static BitsAlias esc_out (TypeMem tmem, Type trez)
 

Package Attributes

final byte _op
 
TV2 _tvar
 

Static Package Attributes

static final byte OP_CALL = 1
 
static final byte OP_CALLEPI = 2
 
static final byte OP_CAST = 3
 
static final byte OP_CON = 4
 
static final byte OP_CONTYPE = 5
 
static final byte OP_CPROJ = 6
 
static final byte OP_DEFMEM = 7
 
static final byte OP_ERR = 8
 
static final byte OP_FP2DISP =10
 
static final byte OP_FRESH = 9
 
static final byte OP_FUN =11
 
static final byte OP_FUNPTR =12
 
static final byte OP_IF =13
 
static final byte OP_JOIN =14
 
static final byte OP_LOAD =15
 
static final byte OP_LOOP =16
 
static final byte OP_MAX =36
 
static final byte OP_NAME =17
 
static final byte OP_NEWARY =19
 
static final byte OP_NEWOBJ =18
 
static final byte OP_NEWSTR =20
 
static final byte OP_PARM =21
 
static final byte OP_PHI =22
 
static final byte OP_PRIM =23
 
static final byte OP_PROJ =24
 
static final byte OP_REGION =25
 
static final byte OP_RET =26
 
static final byte OP_SCOPE =27
 
static final byte OP_SPLIT =28
 
static final byte OP_START =29
 
static final byte OP_STMEM =30
 
static final byte OP_STORE =31
 
static final byte OP_THRET =32
 
static final byte OP_THUNK =33
 
static final byte OP_TYPE =34
 
static final byte OP_UNR =35
 

Private Member Functions

Node _do_reduce ()
 
void adderr (HashSet< ErrMsg > errs)
 
boolean check_vals ()
 
SB dump (int d, SB sb, boolean plive)
 
SB dump (int d, SB sb, int max, VBitSet bs, boolean prims, boolean plive)
 
void dump (int d, SB sb, VBitSet bs, boolean plive)
 
Node find (int uid, VBitSet bs)
 
boolean is_multi_tail ()
 
Node merge (Node x)
 
int more_flow (boolean lifting, int errs)
 
void postorder (Ary< Node > nodes, VBitSet bs)
 
CallEpiNode set_is_copy (Node ctl, Node mem, Node rez)
 
Node unuse (Node old)
 

Static Private Member Functions

static void _header (FunNode fun, SB sb)
 

Static Private Attributes

static int CNT =1
 
static final VBitSet FLOW_VISIT = new VBitSet()
 
static final VBitSet LIVE = new VBitSet()
 
static final String[] STRS = new String[] { null, "Call", "CallEpi", "Cast", "Con", "ConType", "CProj", "DefMem", "Err", "Fresh", "FP2Disp", "Fun", "FunPtr", "If", "Join", "Load", "Loop", "Name", "NewObj", "NewAry", "NewStr", "Parm", "Phi", "Prim", "Proj", "Region", "Return", "Scope","Split", "Start", "StartMem", "Store", "Thret", "Thunk", "Type", "Unresolved" }
 

Detailed Description

Definition at line 24 of file CallEpiNode.java.

Constructor & Destructor Documentation

◆ CallEpiNode()

com.cliffc.aa.node.CallEpiNode.CallEpiNode ( Node...  nodes)

Definition at line 26 of file CallEpiNode.java.

26  {
27  super(OP_CALLEPI,nodes);
28  assert nodes[1] instanceof DefMemNode;
29  }

References com.cliffc.aa.node.Node.OP_CALLEPI.

Member Function Documentation

◆ [static initializer]()

com.cliffc.aa.node.Node.[static initializer]
staticpackageinherited

◆ _do_reduce()

Node com.cliffc.aa.node.Node._do_reduce ( )
privateinherited

Definition at line 570 of file Node.java.

570  {
571  // Replace with a constant, if possible
572  if( should_con(_val) )
573  return con(_val);
574 
575  // Try CSE
576  if( !_elock ) { // Not in VALS
577  Node x = VALS.get(this); // Try VALS
578  if( x != null ) // Hit
579  return merge(x); // Graph replace with x
580  }
581 
582  // Try general ideal call
583  Node x = ideal_reduce(); // Try the general reduction
584  if( x != null )
585  return merge(x); // Graph replace with x
586 
587  return null; // No change
588  }

References com.cliffc.aa.node.Node._elock, com.cliffc.aa.node.Node._val, com.cliffc.aa.node.Node.con(), com.cliffc.aa.node.Node.ideal_reduce(), com.cliffc.aa.node.Node.merge(), com.cliffc.aa.node.Node.should_con(), and com.cliffc.aa.node.Node.VALS.

Referenced by com.cliffc.aa.node.Node.do_reduce().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _elock()

Node com.cliffc.aa.node.Node._elock ( )
packageinherited

Definition at line 137 of file Node.java.

137  { // No assert version, used for new nodes
138  assert check_vals(); // elock & VALs match
139  if( !_elock && VALS.get(this)==null ) { _elock = true; VALS.put(this,this); }
140  return this;
141  }

References com.cliffc.aa.node.Node._elock, com.cliffc.aa.node.Node.check_vals(), and com.cliffc.aa.node.Node.VALS.

Here is the call graph for this function:

◆ _header()

static void com.cliffc.aa.node.Node._header ( FunNode  fun,
SB  sb 
)
staticprivateinherited

Definition at line 380 of file Node.java.

380  {
381  sb.p("============ ").p(fun==null?"null":fun.name()).p(" ============").nl();
382  }

References com.cliffc.aa.node.FunNode.name(), com.cliffc.aa.util.SB.nl(), and com.cliffc.aa.util.SB.p().

Referenced by com.cliffc.aa.node.Node.dumprpo().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_def()

Node com.cliffc.aa.node.Node.add_def ( Node  n)
inherited

Definition at line 152 of file Node.java.

152 { unelock(); _defs.add(n); if( n!=null ) n._uses.add(this); return this; }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._uses, and com.cliffc.aa.node.Node.unelock().

Referenced by com.cliffc.aa.node.MemJoinNode.add_alias_above(), com.cliffc.aa.node.MemJoinNode.add_alias_below(), com.cliffc.aa.node.UnresolvedNode.add_def_unresolved(), com.cliffc.aa.node.NewObjNode.add_fun(), com.cliffc.aa.node.MemPrimNode.ReadPrimNode.as_fun(), com.cliffc.aa.node.MemPrimNode.WritePrimNode.as_fun(), com.cliffc.aa.node.PrimNode.as_fun(), com.cliffc.aa.node.NewNode< T extends TypeObj< T >.NewPrimNode< TypeAry >.as_fun(), com.cliffc.aa.node.TestNodeSmall.check(), com.cliffc.aa.node.MemJoinNode.combine_splits(), com.cliffc.aa.node.IntrinsicNode.convertTypeName(), com.cliffc.aa.node.IntrinsicNode.convertTypeNameStruct(), com.cliffc.aa.node.Node.copy(), com.cliffc.aa.node.ConTypeNode.def_fref(), com.cliffc.aa.Parse.do_exit(), com.cliffc.aa.Parse.func(), com.cliffc.aa.node.FunNode.FunNode(), com.cliffc.aa.node.AssertNode.ideal_grow(), com.cliffc.aa.node.LoadNode.ideal_grow(), com.cliffc.aa.node.UnresolvedNode.ideal_reduce(), com.cliffc.aa.node.CallEpiNode.ideal_reduce(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.node.DefMemNode.make_mem(), com.cliffc.aa.Parse.merge_exits(), com.cliffc.aa.node.ScopeNode.ScopeNode(), com.cliffc.aa.node.CallEpiNode.set_is_copy(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.node.RegionNode.stacked_region(), com.cliffc.aa.node.RetNode.tail_recursive(), com.cliffc.aa.node.TestNode.test1monotonic_prim(), com.cliffc.aa.node.TestNodeSmall.testRecursiveDisplay(), com.cliffc.aa.node.CallEpiNode.wire0(), and com.cliffc.aa.node.CallEpiNode.wire1().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_flow_def_extra()

void com.cliffc.aa.node.Node.add_flow_def_extra ( Node  chg)
inherited

Reimplemented in com.cliffc.aa.node.CallNode, com.cliffc.aa.node.NewNode< T extends TypeObj< T >, com.cliffc.aa.node.RegionNode, com.cliffc.aa.node.MrgProjNode, and com.cliffc.aa.node.MemJoinNode.

Definition at line 515 of file Node.java.

515 { }

Referenced by com.cliffc.aa.node.ScopeNode.set_mem(), and com.cliffc.aa.node.Node.unuse().

Here is the caller graph for this function:

◆ add_flow_extra()

void com.cliffc.aa.node.Node.add_flow_extra ( Type  old)
inherited

Reimplemented in com.cliffc.aa.node.CallNode, com.cliffc.aa.node.FunPtrNode, com.cliffc.aa.node.StoreNode, com.cliffc.aa.node.CastNode, and com.cliffc.aa.node.FreshNode.

Definition at line 513 of file Node.java.

513 { }

Referenced by com.cliffc.aa.node.Node.do_flow(), and com.cliffc.aa.GVNGCM.gcp().

Here is the caller graph for this function:

◆ add_flow_use_extra()

void com.cliffc.aa.node.CallEpiNode.add_flow_use_extra ( Node  chg)

Reimplemented from com.cliffc.aa.node.Node.

Definition at line 369 of file CallEpiNode.java.

369  {
370  if( chg instanceof CallNode ) { // If the Call changes value
371  Env.GVN.add_flow(chg.in(MEM_IDX)); // The called memory changes liveness
372  Env.GVN.add_flow(((CallNode)chg).fdx()); // The called function changes liveness
373  for( int i=0; i<nwired(); i++ ) // Called returns change liveness
374  Env.GVN.add_flow(wired(i));
375  }
376  }

References com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.Env.GVN, com.cliffc.aa.node.Node.in(), com.cliffc.aa.node.CallEpiNode.nwired(), and com.cliffc.aa.node.CallEpiNode.wired().

Here is the call graph for this function:

◆ add_reduce_extra()

void com.cliffc.aa.node.Node.add_reduce_extra ( )
inherited

Reimplemented in com.cliffc.aa.node.CallNode, com.cliffc.aa.node.StoreNode, com.cliffc.aa.node.NewNode< T extends TypeObj< T >, and com.cliffc.aa.node.MemSplitNode.

Definition at line 517 of file Node.java.

517 { }

Referenced by com.cliffc.aa.node.Node.do_reduce().

Here is the caller graph for this function:

◆ adderr()

void com.cliffc.aa.node.Node.adderr ( HashSet< ErrMsg errs)
privateinherited

Definition at line 789 of file Node.java.

789  {
790  ErrMsg msg = err(false);
791  if( msg==null ) return;
792  msg._order = errs.size();
793  errs.add(msg);
794  }

References com.cliffc.aa.node.Node.ErrMsg._order, and com.cliffc.aa.node.Node.err().

Referenced by com.cliffc.aa.node.Node.walkerr_def().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ all_live()

TypeMem com.cliffc.aa.node.CallEpiNode.all_live ( )

Reimplemented from com.cliffc.aa.node.Node.

Definition at line 437 of file CallEpiNode.java.

437 { return TypeMem.ALLMEM; }

References com.cliffc.aa.type.TypeMem.ALLMEM.

Referenced by com.cliffc.aa.node.CallEpiNode.live_use().

Here is the caller graph for this function:

◆ call()

CallNode com.cliffc.aa.node.CallEpiNode.call ( )

◆ check_and_wire()

boolean com.cliffc.aa.node.CallEpiNode.check_and_wire ( )

Definition at line 179 of file CallEpiNode.java.

179  {
180  if( !(_val instanceof TypeTuple) ) return false; // Collapsing
181  CallNode call = call();
182  Type tcall = call._val;
183  if( !(tcall instanceof TypeTuple) ) return false;
184  BitsFun fidxs = CallNode.ttfp(tcall)._fidxs;
185  if( fidxs.above_center() ) return false; // Still choices to be made during GCP.
186 
187  // Check all fidxs for being wirable
188  boolean progress = false;
189  for( int fidx : fidxs ) { // For all fidxs
190  if( BitsFun.is_parent(fidx) ) continue; // Do not wire parents, as they will eventually settle out
191  FunNode fun = FunNode.find_fidx(fidx); // Lookup, even if not wired
192  if( fun.is_dead() ) continue; // Already dead, stale fidx
193  if( fun.is_forward_ref() ) continue; // Not forward refs, which at GCP just means a syntax error
194  RetNode ret = fun.ret();
195  if( ret==null ) continue; // Mid-death
196  if( _defs.find(ret) != -1 ) continue; // Wired already
197  if( !CEProjNode.good_call(tcall,fun) ) continue; // Args fail basic sanity
198  progress=true;
199  wire1(call,fun,ret); // Wire Call->Fun, Ret->CallEpi
200  }
201  return progress;
202  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.type.TypeFunPtr._fidxs, com.cliffc.aa.node.Node._val, com.cliffc.aa.type.Bits< B extends Bits< B >.above_center(), com.cliffc.aa.node.CallEpiNode.call(), com.cliffc.aa.node.FunNode.find_fidx(), com.cliffc.aa.node.CEProjNode.good_call(), com.cliffc.aa.node.Node.is_dead(), com.cliffc.aa.node.FunNode.is_forward_ref(), com.cliffc.aa.type.BitsFun.is_parent(), com.cliffc.aa.node.FunNode.ret(), com.cliffc.aa.node.CallNode.ttfp(), and com.cliffc.aa.node.CallEpiNode.wire1().

Referenced by com.cliffc.aa.GVNGCM.check_and_wire(), com.cliffc.aa.node.CallEpiNode.ideal_reduce(), and com.cliffc.aa.node.CallNode.ideal_reduce().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_solo_mem_writer()

boolean com.cliffc.aa.node.Node.check_solo_mem_writer ( Node  memw)
packageinherited

Definition at line 845 of file Node.java.

845  {
846  if( is_prim() ) return true; // Several top-level memory primitives, including top scope & defmem blow this
847  boolean found=false;
848  for( Node use : _uses )
849  if( use == memw ) found=true; // Only memw mem-writer follows
850  else if( use.is_mem() ) return false; // Found a 2nd mem-writer
851  return found;
852  }

References com.cliffc.aa.node.Node._uses, and com.cliffc.aa.node.Node.is_prim().

Referenced by com.cliffc.aa.node.MemJoinNode.add_alias_above(), com.cliffc.aa.node.MemSplitNode.check_split(), com.cliffc.aa.node.StoreNode.ideal_grow(), and com.cliffc.aa.node.MemJoinNode.ideal_mono().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_vals()

boolean com.cliffc.aa.node.Node.check_vals ( )
privateinherited

Definition at line 143 of file Node.java.

143  {
144  Node x = VALS.get(this), old=null;
145  if( x == this ) old=this; // Found in table quickly
146  // Hunt the hard way
147  else for( Node o : VALS.keySet() ) if( o._uid == _uid ) { old=o; break; }
148  return (old!=null) == _elock;
149  }

References com.cliffc.aa.node.Node._elock, com.cliffc.aa.node.Node._uid, and com.cliffc.aa.node.Node.VALS.

Referenced by com.cliffc.aa.node.Node._elock(), com.cliffc.aa.node.Node.do_reduce(), and com.cliffc.aa.node.Node.unelock().

Here is the caller graph for this function:

◆ con()

static Node com.cliffc.aa.node.Node.con ( Type  t)
staticinherited

Definition at line 670 of file Node.java.

670  {
671  assert t==t.simple_ptr();
672  Node con;
673  if( t instanceof TypeFunPtr && ((TypeFunPtr)t)._fidxs.abit()!=-1 )
674  con = new FunPtrNode(FunNode.find_fidx(((TypeFunPtr)t).fidx()).ret(),Env.ANY);
675  else
676  con = new ConNode<>(t);
677  Node con2 = VALS.get(con);
678  if( con2 != null ) { // Found a prior constant
679  con.kill(); // Kill the just-made one
680  con = con2;
681  con._live = TypeMem.LIVE_BOT; // Adding more liveness
682  } else { // New constant
683  con._val = t; // Typed
684  con._elock(); // Put in VALS, since if Con appears once, probably appears again in the same XFORM call
685  }
686  Env.GVN.add_flow(con); // Updated live flows
687  return con;
688  }

References com.cliffc.aa.node.Node._elock, com.cliffc.aa.node.Node._live, com.cliffc.aa.node.Node._val, com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.Env.ANY, com.cliffc.aa.node.FunNode.find_fidx(), com.cliffc.aa.Env.GVN, com.cliffc.aa.node.Node.kill(), com.cliffc.aa.type.TypeMem.LIVE_BOT, com.cliffc.aa.node.FunNode.ret(), com.cliffc.aa.type.Type< T extends Type< T >.simple_ptr(), and com.cliffc.aa.node.Node.VALS.

Referenced by com.cliffc.aa.node.Node._do_reduce(), com.cliffc.aa.node.MemPrimNode.ReadPrimNode.as_fun(), com.cliffc.aa.node.MemPrimNode.WritePrimNode.as_fun(), com.cliffc.aa.node.NewNode< T extends TypeObj< T >.NewPrimNode< TypeAry >.as_fun(), com.cliffc.aa.Parse.con(), com.cliffc.aa.node.IntrinsicNode.convertTypeName(), com.cliffc.aa.node.IntrinsicNode.convertTypeNameStruct(), com.cliffc.aa.node.CallNode.copy(), com.cliffc.aa.node.ConNode< T extends Type >.equals(), com.cliffc.aa.node.FunPtrNode.forward_ref(), com.cliffc.aa.node.AssertNode.ideal_grow(), com.cliffc.aa.node.CallEpiNode.ideal_reduce(), com.cliffc.aa.node.ScopeNode.ideal_reduce(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.Env.init(), com.cliffc.aa.node.NewNode< TypeStruct >.kill2(), com.cliffc.aa.node.DefMemNode.make_mem(), com.cliffc.aa.node.NewObjNode.promote_forward(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.node.TestNode.testMonotonic(), com.cliffc.aa.TestLive.testNewObj(), com.cliffc.aa.node.TestNodeSmall.testRecursiveDisplay(), com.cliffc.aa.Env.top_scope(), and com.cliffc.aa.node.Node.walk_opt().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ copy()

Node com.cliffc.aa.node.Node.copy ( boolean  copy_edges)
inherited

Reimplemented in com.cliffc.aa.node.FunNode, com.cliffc.aa.node.MemSplitNode, com.cliffc.aa.node.CallNode, com.cliffc.aa.node.NewNode< T extends TypeObj< T >, and com.cliffc.aa.node.CastNode.

Definition at line 264 of file Node.java.

264  {
265  try {
266  Node n = (Node)clone();
267  n._uid = newuid(); // A new UID
268  n._defs = new Ary<>(new Node[1],0); // New empty defs
269  n._uses = new Ary<>(new Node[1],0); // New empty uses
270  n._tvar = n.new_tvar("copy_constructor");
271  n._keep = 0; // Not keeping, even if cloning a mid-keeper operation
272  n._elock=false; // Not in GVN
273  if( copy_edges )
274  for( Node def : _defs )
275  n.add_def(def);
276  Env.GVN.add_work_all(n);
277  return n;
278  } catch( CloneNotSupportedException cns ) { throw new RuntimeException(cns); }
279  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._elock, com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._tvar, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node.add_def(), com.cliffc.aa.GVNGCM.add_work_all(), com.cliffc.aa.Env.GVN, com.cliffc.aa.node.Node.new_tvar(), com.cliffc.aa.node.Node.newuid(), and com.cliffc.aa.node.Node.Node().

Referenced by com.cliffc.aa.node.CallEpiNode.ideal_reduce(), com.cliffc.aa.node.FunNode.split_callers(), and com.cliffc.aa.node.TestNode.test1monotonic_prim().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ del()

void com.cliffc.aa.node.Node.del ( int  idx)
inherited

Definition at line 169 of file Node.java.

169  {
170  unelock();
171  Node n = _defs.del(idx);
172  if( n != null ) n._uses.del(this);
173  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._uses, and com.cliffc.aa.node.Node.unelock().

Referenced by com.cliffc.aa.node.FunNode.split_callers(), and com.cliffc.aa.node.CallEpiNode.unwire().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_flow()

Node com.cliffc.aa.node.Node.do_flow ( )
inherited

Definition at line 592 of file Node.java.

592  {
593  Node progress=null;
594  // Compute live bits. If progress, push the defs on the flow worklist.
595  // This is a reverse flow computation. Always assumed live if keep.
596  if( _keep==0 ) {
597  TypeMem oliv = _live;
598  TypeMem nliv = live(Env.GVN._opt_mode);
599  if( oliv != nliv ) { // Progress?
600  progress = this; // Progress!
601  assert nliv.isa(oliv); // Monotonically improving
602  _live = nliv; // Record progress
603  for( Node def : _defs ) // Put defs on worklist... liveness flows uphill
604  if( def != null ) Env.GVN.add_flow(def).add_flow_def_extra(this);
605  add_flow_extra(oliv);
606  }
607  }
608 
609  // Compute best value. If progress, push uses on the flow worklist.
610  // This is a forward flow computation.
611  Type oval = _val; // Get old type
612  Type nval = value(Env.GVN._opt_mode);// Get best type
613  if( nval!=oval ) {
614  progress = this; // Progress!
615  assert nval.isa(oval); // Monotonically improving
616  _val = nval;
617  // If becoming a constant, check for replacing with a ConNode
618  if( !oval.may_be_con() && nval.may_be_con() ) {
619  Env.GVN.add_reduce(this);
620  Env.GVN.add_flow_defs(this); // Since a constant, inputs are no longer live
621  }
622  // Put uses on worklist... values flows downhill
623  for( Node use : _uses )
624  Env.GVN.add_flow(use).add_flow_use_extra(this);
625  // Progressing on CFG can mean CFG paths go dead
626  if( is_CFG() ) for( Node use : _uses ) if( use.is_CFG() ) Env.GVN.add_reduce(use);
627  add_flow_extra(oval);
628  }
629  return progress;
630  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._live, com.cliffc.aa.GVNGCM._opt_mode, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node._val, com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.GVNGCM.add_flow_defs(), com.cliffc.aa.node.Node.add_flow_extra(), com.cliffc.aa.GVNGCM.add_reduce(), com.cliffc.aa.Env.GVN, com.cliffc.aa.node.Node.is_CFG(), com.cliffc.aa.type.Type< T extends Type< T >.isa(), com.cliffc.aa.node.Node.live(), com.cliffc.aa.type.Type< T extends Type< T >.may_be_con(), and com.cliffc.aa.node.Node.value().

Referenced by com.cliffc.aa.node.DefMemNode.make_mem(), and com.cliffc.aa.GVNGCM.xreduce().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_grow()

Node com.cliffc.aa.node.Node.do_grow ( )
inherited

Definition at line 639 of file Node.java.

639  {
640  Node nnn = ideal_grow();
641  if( nnn==null || nnn==this || is_dead() ) return nnn;
642  assert _keep<=1;
643  if( _keep==1 ) { _keep--; nnn._keep++; Env.GVN.add_dead(this); } // Doing an arbitrary replacement
644  return Env.GVN.add_flow(Env.GVN.add_reduce(nnn));
645  }

References com.cliffc.aa.node.Node._keep, com.cliffc.aa.GVNGCM.add_dead(), com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.GVNGCM.add_reduce(), com.cliffc.aa.Env.GVN, com.cliffc.aa.node.Node.ideal_grow(), and com.cliffc.aa.node.Node.is_dead().

Referenced by com.cliffc.aa.node.Node.more_ideal().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_mono()

Node com.cliffc.aa.node.Node.do_mono ( )
inherited

Definition at line 632 of file Node.java.

632  {
633  Node x= ideal_mono();
634  if( x==null ) return null;
635  assert x==this;
637  }

References com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.GVNGCM.add_mono(), com.cliffc.aa.GVNGCM.add_reduce(), com.cliffc.aa.Env.GVN, and com.cliffc.aa.node.Node.ideal_mono().

Referenced by com.cliffc.aa.node.Node.more_ideal().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_reduce()

Node com.cliffc.aa.node.Node.do_reduce ( )
inherited

Definition at line 545 of file Node.java.

545  {
546  assert check_vals();
547  Node nnn = _do_reduce();
548  if( nnn!=null ) { // Something happened
549  if( nnn!=this ) { // Replacement
550  assert _keep<=1; // Can only replace if zero or one
551  Env.GVN.add_flow_uses(this); // Visit users
553  if( _keep==1 ) { _keep--; nnn._keep++; } // Move keep bits over
554  subsume(nnn); // Replace
555  for( Node use : nnn._uses ) {
556  use.add_reduce_extra();
557  use.add_flow_use_extra(nnn);
558  }
559  }
560  Env.GVN.add_reduce(nnn); // Rerun the replacement
561  return nnn._elock(); // After putting in VALS
562  }
563  // No progress; put in VALS and return
564  _elock();
565  return null;
566  }

References com.cliffc.aa.node.Node._do_reduce(), com.cliffc.aa.node.Node._elock, com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node.add_flow_use_extra(), com.cliffc.aa.GVNGCM.add_flow_uses(), com.cliffc.aa.GVNGCM.add_reduce(), com.cliffc.aa.node.Node.add_reduce_extra(), com.cliffc.aa.node.Node.check_vals(), com.cliffc.aa.Env.GVN, and com.cliffc.aa.node.Node.subsume().

Referenced by com.cliffc.aa.node.Node.more_ideal(), com.cliffc.aa.GVNGCM.Build< N extends Node >.xform(), and com.cliffc.aa.GVNGCM.xreduce().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ dump() [1/5]

SB com.cliffc.aa.node.Node.dump ( int  d,
SB  sb,
boolean  plive 
)
privateinherited

Definition at line 290 of file Node.java.

290  {
291  String xs = String.format("%s%4d: %-7.7s ",plive ? _live : "",_uid,xstr());
292  sb.i(d).p(xs);
293  if( is_dead() ) return sb.p("DEAD");
294  for( Node n : _defs ) sb.p(n == null ? "____ " : String.format("%4d ",n._uid));
295  sb.p(" [[");
296  for( Node n : _uses ) sb.p(String.format("%4d ",n._uid));
297  sb.p("]] ");
298  sb.p(str()).s();
299  if( _val==null ) sb.p("----");
300  else _val.str(sb,new VBitSet(),null,true);
301 
302  return sb;
303  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._live, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node._val, com.cliffc.aa.util.SB.i(), com.cliffc.aa.node.Node.is_dead(), com.cliffc.aa.util.SB.p(), com.cliffc.aa.util.SB.s(), com.cliffc.aa.type.Type< T extends Type< T >.str(), com.cliffc.aa.node.Node.str(), and com.cliffc.aa.node.Node.xstr().

Here is the call graph for this function:

◆ dump() [2/5]

SB com.cliffc.aa.node.Node.dump ( int  d,
SB  sb,
int  max,
VBitSet  bs,
boolean  prims,
boolean  plive 
)
privateinherited

Definition at line 310 of file Node.java.

310  {
311  if( bs.tset(_uid) ) return sb;
312  if( d < max ) { // Limit at depth
313  // Print parser scopes first (deepest)
314  for( Node n : _defs ) if( n instanceof ScopeNode ) n.dump(d+1,sb,max,bs,prims,plive);
315  // Print constants early
316  for( Node n : _defs ) if( n instanceof ConNode ) n.dump(d+1,sb,max,bs,prims,plive);
317  // Do not recursively print root Scope, nor Unresolved of primitives.
318  // These are too common, and uninteresting.
319  for( Node n : _defs ) if( n != null && (!prims && n.is_prim() && n._defs._len > 3) ) bs.set(n._uid);
320  // Recursively print most of the rest, just not the multi-node combos and
321  // Unresolve & FunPtrs.
322  for( Node n : _defs )
323  if( n != null && !n.is_multi_head() && !n.is_multi_tail() &&
324  !(n instanceof UnresolvedNode) && !(n instanceof FunPtrNode) )
325  n.dump(d+1,sb,max,bs,prims,plive);
326  // Print Unresolved and FunPtrs, which typically catch whole functions.
327  for( Node n : _defs )
328  if( (n instanceof UnresolvedNode) || (n instanceof FunPtrNode) )
329  n.dump(d+1,sb,max,bs,prims,plive);
330  // Print anything not yet printed, including multi-node combos
331  for( Node n : _defs ) if( n != null && !n.is_multi_head() ) n.dump(d+1,sb,max,bs,prims,plive);
332  for( Node n : _defs ) if( n != null ) n.dump(d+1,sb,max,bs,prims,plive);
333  }
334  // Print multi-node combos all-at-once, including all tails even if they
335  // exceed the depth limit by 1.
336  Node x = is_multi_tail() ? in(0) : this;
337  if( x != null && x.is_multi_head() ) {
338  int dx = d+(x==this?0:1);
339  // Print all tails paths, all at once - nothing recursively below the tail
340  for( Node n : x._uses )
341  if( n.is_multi_tail() )
342  for( Node m : n._defs )
343  if( dx<max) m.dump(dx+1,sb,max,bs,prims,plive);
344  if( x==this ) bs.clear(_uid); // Reset for self, so prints right now
345  x.dump(dx,sb,bs,plive); // Conditionally print head of combo
346  // Print all combo tails, if not already printed
347  if( x!=this ) bs.clear(_uid); // Reset for self, so prints in the mix below
348  for( Node n : x._uses ) if( n.is_multi_tail() ) n.dump(dx-1,sb,bs,plive);
349  return sb;
350  } else { // Neither combo head nor tail, just print
351  return dump(d,sb,plive).nl();
352  }
353  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node.dump(), com.cliffc.aa.node.Node.in(), com.cliffc.aa.node.Node.is_multi_head(), com.cliffc.aa.node.Node.is_multi_tail(), and com.cliffc.aa.util.VBitSet.tset().

Here is the call graph for this function:

◆ dump() [3/5]

void com.cliffc.aa.node.Node.dump ( int  d,
SB  sb,
VBitSet  bs,
boolean  plive 
)
privateinherited

Definition at line 305 of file Node.java.

305  {
306  if( bs.tset(_uid) ) return;
307  dump(d,sb,plive).nl();
308  }

References com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node.dump(), and com.cliffc.aa.util.VBitSet.tset().

Here is the call graph for this function:

◆ dump() [4/5]

String com.cliffc.aa.node.Node.dump ( int  max)
inherited

Definition at line 286 of file Node.java.

286 { return dump(max,is_prim(),false); }

References com.cliffc.aa.node.Node.dump(), and com.cliffc.aa.node.Node.is_prim().

Referenced by com.cliffc.aa.Parse.dump(), com.cliffc.aa.node.Node.dump(), com.cliffc.aa.node.Node.dumprpo(), com.cliffc.aa.node.Node.more_flow(), and com.cliffc.aa.node.Node.toString().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ dump() [5/5]

String com.cliffc.aa.node.Node.dump ( int  max,
boolean  prims,
boolean  plive 
)
inherited

Definition at line 288 of file Node.java.

288 { return dump(0, new SB(),max,new VBitSet(),prims,plive).toString(); }

References com.cliffc.aa.node.Node.dump().

Referenced by com.cliffc.aa.node.Node.dump().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ dumprpo()

String com.cliffc.aa.node.Node.dumprpo ( boolean  prims,
boolean  plive 
)
inherited

Definition at line 358 of file Node.java.

358  {
359  Ary<Node> nodes = new Ary<>(new Node[1],0);
360  postorder(nodes,new VBitSet());
361  // Dump in reverse post order
362  SB sb = new SB();
363  Node prior = null;
364  for( int i=nodes._len-1; i>=0; i-- ) {
365  Node n = nodes.at(i);
366  if( !(n._uid <= Env.ALL_CTRL._uid || !n.is_prim() || prims) )
367  continue; // Visited, but do not print
368  // Add a nl after the last of a multi-tail sequence.
369  if( (prior != null && prior.is_multi_tail() && !n.is_multi_tail()) ||
370  // Add a nl before the start of a multi-head sequence.
371  n.is_multi_head() )
372  sb.nl();
373  if( n._op==OP_FUN ) _header((FunNode)n,sb);
374  n.dump(0,sb,plive).nl();
375  if( n._op==OP_RET && n.in(4) instanceof FunNode ) _header((FunNode)n.in(4),sb);
376  prior = n;
377  }
378  return sb.toString();
379  }

References com.cliffc.aa.node.Node._header(), com.cliffc.aa.util.Ary< E >._len, com.cliffc.aa.node.Node._op, com.cliffc.aa.node.Node._uid, com.cliffc.aa.Env.ALL_CTRL, com.cliffc.aa.util.Ary< E >.at(), com.cliffc.aa.node.Node.dump(), com.cliffc.aa.node.Node.in(), com.cliffc.aa.node.Node.is_multi_head(), com.cliffc.aa.node.Node.is_multi_tail(), com.cliffc.aa.node.Node.is_prim(), com.cliffc.aa.util.SB.nl(), com.cliffc.aa.node.Node.OP_FUN, com.cliffc.aa.node.Node.OP_RET, com.cliffc.aa.node.Node.postorder(), and com.cliffc.aa.util.SB.toString().

Referenced by com.cliffc.aa.Parse.dumprpo().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ equals()

boolean com.cliffc.aa.node.Node.equals ( Object  o)
inherited

Reimplemented in com.cliffc.aa.node.FunNode, com.cliffc.aa.node.CallNode, com.cliffc.aa.node.PrimNode.RandI64, com.cliffc.aa.node.LoadNode, com.cliffc.aa.node.ScopeNode, com.cliffc.aa.node.StoreNode, com.cliffc.aa.node.PrimNode, com.cliffc.aa.node.NewNode< T extends TypeObj< T >, com.cliffc.aa.node.UnresolvedNode, com.cliffc.aa.node.ConTypeNode, com.cliffc.aa.node.FreshNode, com.cliffc.aa.node.ProjNode, com.cliffc.aa.node.DefMemNode, com.cliffc.aa.node.RetNode, com.cliffc.aa.node.ConNode< T extends Type >, com.cliffc.aa.node.ThunkNode, com.cliffc.aa.node.ErrNode, com.cliffc.aa.node.ParmNode, com.cliffc.aa.node.PhiNode, com.cliffc.aa.node.StartNode, com.cliffc.aa.node.CEProjNode, and com.cliffc.aa.node.StartMemNode.

Definition at line 112 of file Node.java.

112  {
113  if( this==o ) return true;
114  if( !(o instanceof Node) ) return false;
115  Node n = (Node)o;
116  if( _op != n._op ) return false;
117  if( n._defs==null || _defs._len != n._defs._len ) return false;
118  // Note pointer-equality
119  for( int i=0; i<_defs._len; i++ ) if( _defs._es[i] != n._defs._es[i] ) return false;
120  return true;
121  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._op, and com.cliffc.aa.node.Node.Node().

Here is the call graph for this function:

◆ err()

◆ esc_out()

static BitsAlias com.cliffc.aa.node.CallEpiNode.esc_out ( TypeMem  tmem,
Type  trez 
)
staticpackage

Definition at line 361 of file CallEpiNode.java.

361  {
362  if( trez == Type.XNIL || trez == Type.NIL ) return BitsAlias.EMPTY;
363  if( trez instanceof TypeFunPtr ) trez = ((TypeFunPtr)trez)._disp;
364  if( trez instanceof TypeMemPtr )
365  return tmem.all_reaching_aliases(((TypeMemPtr)trez)._aliases);
366  return TypeMemPtr.OOP0.dual().isa(trez) ? BitsAlias.NZERO : BitsAlias.EMPTY;
367  }

References com.cliffc.aa.type.TypeMem.all_reaching_aliases(), com.cliffc.aa.type.Type< T extends Type< T >.dual(), com.cliffc.aa.type.BitsAlias.EMPTY, com.cliffc.aa.type.Type< T extends Type< T >.NIL, com.cliffc.aa.type.BitsAlias.NZERO, com.cliffc.aa.type.TypeMemPtr.OOP0, and com.cliffc.aa.type.Type< T extends Type< T >.XNIL.

Referenced by com.cliffc.aa.node.CallNode._ideal_grow(), com.cliffc.aa.node.CallNode.escapees(), and com.cliffc.aa.node.CallEpiNode.value().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ escapees()

BitsAlias com.cliffc.aa.node.CallEpiNode.escapees ( )
package

Reimplemented from com.cliffc.aa.node.Node.

Definition at line 509 of file CallEpiNode.java.

509 { return BitsAlias.FULL; }

References com.cliffc.aa.type.BitsAlias.FULL.

◆ find() [1/2]

Node com.cliffc.aa.node.Node.find ( int  uid)
inherited

Definition at line 427 of file Node.java.

427 { return find(uid,new VBitSet()); }

References com.cliffc.aa.node.Node.find().

Referenced by com.cliffc.aa.node.FunNode.bad_mem_use(), and com.cliffc.aa.node.Node.find().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ find() [2/2]

Node com.cliffc.aa.node.Node.find ( int  uid,
VBitSet  bs 
)
privateinherited

Definition at line 428 of file Node.java.

428  {
429  if( _uid==uid ) return this;
430  if( bs.tset(_uid) || is_dead() ) return null;
431  Node m;
432  for( Node n : _defs ) if( n!=null && (m=n.find(uid,bs)) !=null ) return m;
433  for( Node n : _uses ) if( (m=n.find(uid,bs)) !=null ) return m;
434  return null;
435  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node.find(), com.cliffc.aa.node.Node.is_dead(), and com.cliffc.aa.util.VBitSet.tset().

Here is the call graph for this function:

◆ get_mem_writer()

Node com.cliffc.aa.node.Node.get_mem_writer ( )
inherited

Definition at line 840 of file Node.java.

840  {
841  for( Node use : _uses ) if( use.is_mem() ) return use;
842  return null;
843  }

References com.cliffc.aa.node.Node._uses.

Referenced by com.cliffc.aa.node.StoreNode.ideal_reduce().

Here is the caller graph for this function:

◆ hashCode()

◆ ideal_grow()

Node com.cliffc.aa.node.Node.ideal_grow ( )
inherited

Reimplemented in com.cliffc.aa.node.PrimNode.OrElse, com.cliffc.aa.node.PrimNode.AndThen, com.cliffc.aa.node.CallNode, com.cliffc.aa.node.LoadNode, com.cliffc.aa.node.StoreNode, com.cliffc.aa.node.MrgProjNode, and com.cliffc.aa.node.AssertNode.

Definition at line 450 of file Node.java.

450 { return null; }

Referenced by com.cliffc.aa.node.Node.do_grow().

Here is the caller graph for this function:

◆ ideal_mono()

Node com.cliffc.aa.node.Node.ideal_mono ( )
inherited

Reimplemented in com.cliffc.aa.node.RetNode, com.cliffc.aa.node.StoreNode, com.cliffc.aa.node.MemJoinNode, com.cliffc.aa.node.LoadNode, com.cliffc.aa.node.MrgProjNode, and com.cliffc.aa.node.CastNode.

Definition at line 445 of file Node.java.

445 { return null; }

Referenced by com.cliffc.aa.node.Node.do_mono().

Here is the caller graph for this function:

◆ ideal_reduce()

Node com.cliffc.aa.node.CallEpiNode.ideal_reduce ( )

Reimplemented from com.cliffc.aa.node.Node.

Definition at line 40 of file CallEpiNode.java.

40  {
41  if( _is_copy ) return null;
42  CallNode call = call();
43  Type tc = call._val;
44  if( !(tc instanceof TypeTuple) ) return null;
45  TypeTuple tcall = (TypeTuple)tc;
46  if( CallNode.tctl(tcall) != Type.CTRL ) return null; // Call not executable
47  // Get calls resolved function.
48  BitsFun fidxs = CallNode.ttfp(tcall).fidxs();
49 
50  // If the call's allowed functions excludes any wired, remove the extras
51  if( !fidxs.test(BitsFun.ALL) ) { // Shortcut
52  for( int i = 0; i < nwired(); i++ ) {
53  RetNode ret = wired(i);
54  if( !fidxs.test_recur(ret.fidx()) ) { // Wired call not in execution set?
55  assert !BitsFun.is_parent(ret.fidx());
56  // Remove the edge. Pre-GCP all CG edges are virtual, and are lazily
57  // and pessimistically filled in by ideal calls. During the course
58  // of lifting types some of the manifested CG edges are killed.
59  // Post-GCP all CG edges are manifest, but types can keep lifting
60  // and so CG edges can still be killed.
61  unwire(call,ret);
62  return this; // Return with progress
63  }
64  }
65  }
66 
67  // See if we can wire any new fidxs directly between Call/Fun and Ret/CallEpi.
68  // This *adds* edges, but enables a lot of shrinking via inlining.
69  if( check_and_wire() ) return this;
70 
71  // The one allowed function is already wired? Then directly inline.
72  // Requires this calls 1 target, and the 1 target is only called by this.
73  if( nwired()==1 && fidxs.abit() != -1 ) { // Wired to 1 target
74  RetNode ret = wired(0); // One wired return
75  FunNode fun = ret.fun();
76  Type tdef = Env.DEFMEM._uses._len==0 ? null : Env.DEFMEM._val;
77  TypeTuple tret = ret._val instanceof TypeTuple ? (TypeTuple) ret._val : (TypeTuple)ret._val.oob(TypeTuple.RET);
78  Type tretmem = tret.at(1);
79  if( fun != null && fun._defs._len==2 && // Function is only called by 1 (and not the unknown caller)
80  (call.err(true)==null || fun._thunk_rhs) && // And args are ok
81  (tdef==null || CallNode.emem(tcall).isa(tdef)) && // Pre-GCP, call memory has to be as good as the default
82  (tdef==null || tretmem.isa(tdef)) && // Call and return memory at least as good as default
83  call.mem().in(0) != call && // Dead self-recursive
84  fun.in(1)._uses._len==1 && // And only calling fun
85  ret._live.isa(_live) && // Call and return liveness compatible
86  !fun.noinline() ) { // And not turned off
87  assert fun.in(1).in(0)==call; // Just called by us
88  fun.set_is_copy(); // Collapse the FunNode into the Call
89  return set_is_copy(ret.ctl(), ret.mem(), ret.rez()); // Collapse the CallEpi into the Ret
90  }
91  }
92 
93  // Parser thunks eagerly inline
94  if( call.fdx() instanceof ThretNode ) {
95  ThretNode tret = (ThretNode)call.fdx();
96  wire1(call,tret.thunk(),tret);
97  return set_is_copy(tret.ctrl(), tret.mem(), tret.rez()); // Collapse the CallEpi into the Thret
98  }
99 
100  // Only inline wired single-target function with valid args. CallNode wires.
101  if( nwired()!=1 ) return null; // More than 1 wired, inline only via FunNode
102  int fidx = fidxs.abit(); // Could be 1 or multi
103  if( fidx == -1 ) return null; // Multi choices, only 1 wired at the moment.
104  if( fidxs.above_center() ) return null; // Can be unresolved yet
105  if( BitsFun.is_parent(fidx) ) return null; // Parent, only 1 child wired
106 
107  if( call.err(true)!=null ) return null; // CallNode claims args in-error, do not inline
108 
109  // Call allows 1 function not yet inlined, sanity check it.
110  int cnargs = call.nargs();
111  FunNode fun = FunNode.find_fidx(fidx);
112  assert !fun.is_forward_ref() && !fun.is_dead()
113  && fun.nargs() == cnargs; // All checked by call.err
114  if( fun._val != Type.CTRL ) return null;
115  RetNode ret = fun.ret(); // Return from function
116  if( ret==null ) return null;
117 
118  // Single choice; check no conversions needed.
119  TypeTuple formals = fun._sig._formals;
120  for( Node parm : fun._uses ) {
121  if( parm instanceof ParmNode && parm.in(0)==fun ) {
122  int idx = ((ParmNode)parm)._idx;
123  if( idx < 0 ) continue; // RPC
124  Type actual = CallNode.targ(tcall,idx);
125  if( actual.isBitShape(formals.at(idx)) == 99 ) // Requires user-specified conversion
126  return null;
127  }
128  }
129 
130 
131  // Check for several trivial cases that can be fully inlined immediately.
132  Node cctl = call.ctl();
133  Node cmem = call.mem();
134  Node rctl = ret.ctl(); // Control being returned
135  Node rmem = ret.mem(); // Memory being returned
136  Node rrez = ret.rez(); // Result being returned
137  boolean inline = !fun.noinline();
138  // If the function does nothing with memory, then use the call memory directly.
139  if( (rmem instanceof ParmNode && rmem.in(CTL_IDX) == fun) || rmem._val ==TypeMem.XMEM )
140  rmem = cmem;
141  // Check that function return memory and post-call memory are compatible
142  if( !(_val instanceof TypeTuple) ) return null;
143  Type selfmem = ((TypeTuple) _val).at(MEM_IDX);
144  if( !rmem._val.isa( selfmem ) && !(selfmem==TypeMem.ANYMEM && call.is_pure_call()!=null) )
145  return null;
146 
147  // Check for zero-op body (id function)
148  if( rrez instanceof ParmNode && rrez.in(CTL_IDX) == fun && cmem == rmem && inline )
149  return unwire(call,ret).set_is_copy(cctl,cmem,call.arg(((ParmNode)rrez)._idx)); // Collapse the CallEpi
150 
151  // Check for constant body
152  Type trez = rrez._val;
153  if( trez.is_con() && rctl==fun && cmem == rmem && inline )
154  return unwire(call,ret).set_is_copy(cctl,cmem,Node.con(trez));
155 
156  // Check for a 1-op body using only constants or parameters and no memory effects
157  boolean can_inline=!(rrez instanceof ParmNode) && rmem==cmem && inline;
158  for( Node parm : rrez._defs )
159  if( parm != null && parm != fun &&
160  !(parm instanceof ParmNode && parm.in(0) == fun) &&
161  !(parm instanceof ConNode) )
162  can_inline=false; // Not trivial
163  if( can_inline ) {
164  Node irez = rrez.copy(false); // Copy the entire function body
165  ProjNode proj = ProjNode.proj(this,REZ_IDX);
166  irez._live = proj==null ? TypeMem.ESCAPE : proj._live;
167  for( Node parm : rrez._defs )
168  irez.add_def((parm instanceof ParmNode && parm.in(CTL_IDX) == fun) ? call.arg(((ParmNode)parm)._idx) : parm);
169  if( irez instanceof PrimNode ) ((PrimNode)irez)._badargs = call._badargs;
170  GVN.add_work_all(irez);
171  return unwire(call,ret).set_is_copy(cctl,cmem,irez);
172  }
173 
174  return null;
175  }

References com.cliffc.aa.node.CallNode._badargs, com.cliffc.aa.node.Node._defs, com.cliffc.aa.type.TypeFunSig._formals, com.cliffc.aa.node.CallEpiNode._is_copy, com.cliffc.aa.node.Node._live, com.cliffc.aa.node.FunNode._sig, com.cliffc.aa.node.FunNode._thunk_rhs, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node._val, com.cliffc.aa.type.Bits< B extends Bits< B >.abit(), com.cliffc.aa.type.Bits< B extends Bits< B >.above_center(), com.cliffc.aa.node.Node.add_def(), com.cliffc.aa.type.BitsFun.ALL, com.cliffc.aa.type.TypeMem.ANYMEM, com.cliffc.aa.node.CallNode.arg(), com.cliffc.aa.type.TypeTuple.at(), com.cliffc.aa.node.CallEpiNode.call(), com.cliffc.aa.node.CallEpiNode.check_and_wire(), com.cliffc.aa.node.Node.con(), com.cliffc.aa.node.Node.copy(), com.cliffc.aa.node.RetNode.ctl(), com.cliffc.aa.node.CallNode.ctl(), com.cliffc.aa.node.ThretNode.ctrl(), com.cliffc.aa.type.Type< T extends Type< T >.CTRL, com.cliffc.aa.Env.DEFMEM, com.cliffc.aa.node.CallNode.emem(), com.cliffc.aa.node.CallNode.err(), com.cliffc.aa.type.TypeMem.ESCAPE, com.cliffc.aa.node.CallNode.fdx(), com.cliffc.aa.node.RetNode.fidx(), com.cliffc.aa.type.TypeFunPtr.fidxs(), com.cliffc.aa.node.FunNode.find_fidx(), com.cliffc.aa.node.RetNode.fun(), com.cliffc.aa.node.Node.in(), com.cliffc.aa.type.Type< T extends Type< T >.is_con(), com.cliffc.aa.node.Node.is_dead(), com.cliffc.aa.node.FunNode.is_forward_ref(), com.cliffc.aa.type.BitsFun.is_parent(), com.cliffc.aa.node.CallNode.is_pure_call(), com.cliffc.aa.type.Type< T extends Type< T >.isa(), com.cliffc.aa.type.Type< T extends Type< T >.isBitShape(), com.cliffc.aa.node.ThretNode.mem(), com.cliffc.aa.node.RetNode.mem(), com.cliffc.aa.node.CallNode.mem(), com.cliffc.aa.node.CallNode.nargs(), com.cliffc.aa.node.FunNode.nargs(), com.cliffc.aa.node.FunNode.noinline(), com.cliffc.aa.node.CallEpiNode.nwired(), com.cliffc.aa.type.Type< T extends Type< T >.oob(), com.cliffc.aa.node.ProjNode.proj(), com.cliffc.aa.type.TypeTuple.RET, com.cliffc.aa.node.FunNode.ret(), com.cliffc.aa.node.ThretNode.rez(), com.cliffc.aa.node.RetNode.rez(), com.cliffc.aa.node.CallEpiNode.set_is_copy(), com.cliffc.aa.node.FunNode.set_is_copy(), com.cliffc.aa.node.CallNode.targ(), com.cliffc.aa.node.CallNode.tctl(), com.cliffc.aa.type.Bits< B extends Bits< B >.test(), com.cliffc.aa.type.Bits< B extends Bits< B >.test_recur(), com.cliffc.aa.node.ThretNode.thunk(), com.cliffc.aa.node.CallNode.ttfp(), com.cliffc.aa.node.CallEpiNode.unwire(), com.cliffc.aa.node.CallEpiNode.wire1(), com.cliffc.aa.node.CallEpiNode.wired(), and com.cliffc.aa.type.TypeMem.XMEM.

Here is the call graph for this function:

◆ in()

Node com.cliffc.aa.node.Node.in ( int  i)
inherited

Definition at line 126 of file Node.java.

126 { return _defs.at(i); }

References com.cliffc.aa.node.Node._defs.

Referenced by com.cliffc.aa.node.MemJoinNode.add_alias_above(), com.cliffc.aa.node.MemJoinNode.add_alias_below(), com.cliffc.aa.node.UnresolvedNode.add_def_unresolved(), com.cliffc.aa.node.CallNode.add_flow_def_extra(), com.cliffc.aa.node.MProjNode.add_flow_use_extra(), com.cliffc.aa.node.ParmNode.add_flow_use_extra(), com.cliffc.aa.node.LoadNode.add_flow_use_extra(), com.cliffc.aa.node.CallEpiNode.add_flow_use_extra(), com.cliffc.aa.node.MemPrimNode.adr(), com.cliffc.aa.node.LoadNode.adr(), com.cliffc.aa.node.StoreNode.adr(), com.cliffc.aa.node.AssertNode.arg(), com.cliffc.aa.node.NewNode< T extends TypeObj< T >.NewPrimNode< TypeAry >.as_fun(), com.cliffc.aa.node.StoreNode.bad(), com.cliffc.aa.node.LoadNode.bad(), com.cliffc.aa.node.CallEpiNode.call(), com.cliffc.aa.node.MemJoinNode.can_bypass(), com.cliffc.aa.node.FunNode.check_callers(), com.cliffc.aa.node.MemSplitNode.check_split(), com.cliffc.aa.node.CastNode.checked(), com.cliffc.aa.node.MemJoinNode.combine_splits(), com.cliffc.aa.node.RetNode.ctl(), com.cliffc.aa.node.CallNode.ctl(), com.cliffc.aa.node.ThretNode.ctrl(), com.cliffc.aa.node.ScopeNode.ctrl(), com.cliffc.aa.node.FunPtrNode.display(), com.cliffc.aa.node.CallNode.dsp(), com.cliffc.aa.node.Node.dump(), com.cliffc.aa.node.Node.dumprpo(), com.cliffc.aa.node.ScopeNode.early_ctrl(), com.cliffc.aa.node.ScopeNode.early_mem(), com.cliffc.aa.node.ScopeNode.early_val(), com.cliffc.aa.node.ParmNode.err(), com.cliffc.aa.node.PhiNode.err(), com.cliffc.aa.node.MProjNode.escapees(), com.cliffc.aa.node.MrgProjNode.escapees(), com.cliffc.aa.node.IntrinsicNode.escapees(), com.cliffc.aa.node.FunNode.find_body(), com.cliffc.aa.node.LoadNode.find_previous_store(), com.cliffc.aa.node.MemJoinNode.find_sese_head(), com.cliffc.aa.node.NewNode< TypeStruct >.fld(), com.cliffc.aa.node.FP2DispNode.fptr2disp(), com.cliffc.aa.node.ParmNode.fun(), com.cliffc.aa.node.RetNode.fun(), com.cliffc.aa.node.FunNode.has_unknown_callers(), com.cliffc.aa.node.FreshNode.id(), com.cliffc.aa.node.AssertNode.ideal_grow(), com.cliffc.aa.node.StoreNode.ideal_grow(), com.cliffc.aa.node.LoadNode.ideal_grow(), com.cliffc.aa.node.CallNode.ideal_grow(), com.cliffc.aa.node.PrimNode.AndThen.ideal_grow(), com.cliffc.aa.node.PrimNode.OrElse.ideal_grow(), com.cliffc.aa.node.FunNode.ideal_inline(), com.cliffc.aa.node.CastNode.ideal_mono(), com.cliffc.aa.node.LoadNode.ideal_mono(), com.cliffc.aa.node.MemJoinNode.ideal_mono(), com.cliffc.aa.node.FP2DispNode.ideal_reduce(), com.cliffc.aa.node.IfNode.ideal_reduce(), com.cliffc.aa.node.RegionNode.ideal_reduce(), com.cliffc.aa.node.FreshNode.ideal_reduce(), com.cliffc.aa.node.CastNode.ideal_reduce(), com.cliffc.aa.node.ProjNode.ideal_reduce(), com.cliffc.aa.node.ErrNode.ideal_reduce(), com.cliffc.aa.node.MemJoinNode.ideal_reduce(), com.cliffc.aa.node.UnresolvedNode.ideal_reduce(), com.cliffc.aa.node.PhiNode.ideal_reduce(), com.cliffc.aa.node.StoreNode.ideal_reduce(), com.cliffc.aa.node.ParmNode.ideal_reduce(), com.cliffc.aa.node.CallEpiNode.ideal_reduce(), com.cliffc.aa.node.IntrinsicNode.ideal_reduce(), com.cliffc.aa.node.RetNode.ideal_reduce(), com.cliffc.aa.node.ScopeNode.ideal_reduce(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.node.FunNode.ideal_reduce(), com.cliffc.aa.node.PrimNode.ConvertStrStr.ideal_reduce(), com.cliffc.aa.node.MemPrimNode.idx(), com.cliffc.aa.node.MemSplitNode.insert_split(), com.cliffc.aa.node.ThunkNode.is_copy(), com.cliffc.aa.node.IfNode.is_copy(), com.cliffc.aa.node.RegionNode.is_copy(), com.cliffc.aa.node.RetNode.is_copy(), com.cliffc.aa.node.CallEpiNode.is_copy(), com.cliffc.aa.node.PrimNode.AndThen.is_copy(), com.cliffc.aa.node.PrimNode.OrElse.is_copy(), com.cliffc.aa.node.CallNode.is_copy(), com.cliffc.aa.node.FunNode.is_copy(), com.cliffc.aa.node.FunPtrNode.is_pure_call(), com.cliffc.aa.node.CallEpiNode.is_pure_call(), com.cliffc.aa.node.CallNode.least_cost(), com.cliffc.aa.node.ThunkNode.live_use(), com.cliffc.aa.node.DefMemNode.live_use(), com.cliffc.aa.node.CastNode.live_use(), com.cliffc.aa.node.MrgProjNode.live_use(), com.cliffc.aa.node.PhiNode.live_use(), com.cliffc.aa.node.CallEpiNode.live_use(), com.cliffc.aa.node.PrimNode.AndThen.live_use(), com.cliffc.aa.node.PrimNode.OrElse.live_use(), com.cliffc.aa.node.MemPrimNode.mem(), com.cliffc.aa.node.MrgProjNode.mem(), com.cliffc.aa.node.ThretNode.mem(), com.cliffc.aa.node.MemSplitNode.mem(), com.cliffc.aa.node.LoadNode.mem(), com.cliffc.aa.node.IntrinsicNode.mem(), com.cliffc.aa.node.RetNode.mem(), com.cliffc.aa.node.AssertNode.mem(), com.cliffc.aa.node.StoreNode.mem(), com.cliffc.aa.node.ScopeNode.mem(), com.cliffc.aa.node.CallNode.mem(), com.cliffc.aa.node.MemJoinNode.MemJoinNode(), com.cliffc.aa.node.FunPtrNode.merge_ref_def(), com.cliffc.aa.node.MemJoinNode.msp(), com.cliffc.aa.node.MrgProjNode.nnn(), com.cliffc.aa.node.FunNode.noinline(), com.cliffc.aa.node.ProjNode.op_prec(), com.cliffc.aa.node.IntrinsicNode.ptr(), com.cliffc.aa.node.ScopeNode.ptr(), com.cliffc.aa.Parse.remove_unknown_callers(), com.cliffc.aa.node.FunPtrNode.ret(), com.cliffc.aa.GVNGCM.retype_mem(), com.cliffc.aa.node.MemPrimNode.rez(), com.cliffc.aa.node.ThretNode.rez(), com.cliffc.aa.node.RetNode.rez(), com.cliffc.aa.node.StoreNode.rez(), com.cliffc.aa.node.ScopeNode.rez(), com.cliffc.aa.node.RetNode.rpc(), com.cliffc.aa.node.CallEpiNode.sane_wiring(), com.cliffc.aa.node.Node.should_con(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.node.FunNode.split_size(), com.cliffc.aa.node.RegionNode.stacked_region(), com.cliffc.aa.node.ScopeNode.stk(), com.cliffc.aa.node.TestNode.stx(), com.cliffc.aa.node.CallNode.swap_new(), com.cliffc.aa.node.RetNode.tail_recursive(), com.cliffc.aa.Parse.term(), com.cliffc.aa.node.TestNodeSmall.testCallNodeResolve(), com.cliffc.aa.node.TestNodeSmall.testCallNodeResolve2(), com.cliffc.aa.node.TestNode.testMonotonic(), com.cliffc.aa.node.TestNodeSmall.testUnresolvedAdd(), com.cliffc.aa.node.ThretNode.thunk(), com.cliffc.aa.node.Node.tvar(), com.cliffc.aa.node.ProjNode.unify(), com.cliffc.aa.node.FunNode.unwire(), com.cliffc.aa.node.CallEpiNode.unwire(), com.cliffc.aa.node.Node.val(), com.cliffc.aa.node.ParmNode.valid_args(), com.cliffc.aa.node.DefMemNode.value(), com.cliffc.aa.node.MProjNode.value(), com.cliffc.aa.node.CastNode.value(), com.cliffc.aa.node.IfNode.value(), com.cliffc.aa.node.PhiNode.value(), com.cliffc.aa.node.ParmNode.value(), com.cliffc.aa.node.MrgProjNode.value(), com.cliffc.aa.node.RegionNode.value(), com.cliffc.aa.node.FunPtrNode.value(), com.cliffc.aa.node.PrimNode.EQ_OOP.value(), com.cliffc.aa.node.PrimNode.NE_OOP.value(), com.cliffc.aa.node.FunNode.value(), com.cliffc.aa.node.LoopNode.walk_dom_last(), com.cliffc.aa.node.ThunkNode.walk_dom_last(), com.cliffc.aa.node.RegionNode.walk_dom_last(), com.cliffc.aa.node.Node.walk_dom_last(), com.cliffc.aa.node.CallEpiNode.wire0(), com.cliffc.aa.node.CallEpiNode.wired(), com.cliffc.aa.node.FunPtrNode.xfun(), com.cliffc.aa.node.CProjNode.xstr(), and com.cliffc.aa.node.UnresolvedNode.xstr().

Here is the caller graph for this function:

◆ init0()

static void com.cliffc.aa.node.Node.init0 ( )
staticinherited

Definition at line 70 of file Node.java.

70  {
71  assert LIVE.get(CNT-1) && !LIVE.get(CNT);
73  }

References com.cliffc.aa.node.Node._INIT0_CNT, com.cliffc.aa.node.Node.CNT, and com.cliffc.aa.node.Node.LIVE.

Referenced by com.cliffc.aa.Env.record_for_top_reset2().

Here is the caller graph for this function:

◆ init1()

Node com.cliffc.aa.node.Node.init1 ( )
inherited

Definition at line 708 of file Node.java.

708  {
709  Node x = VALS.get(this);
711  if( x!=null ) { // Hit in GVN table
712  merge(x);
713  kill(); // Kill just-init'd
714  return x; // Return old
715  }
716  _elock();
718  return Env.GVN.add_work_all(this);
719  }

References com.cliffc.aa.node.Node._elock, com.cliffc.aa.node.Node._live, com.cliffc.aa.GVNGCM._opt_mode, com.cliffc.aa.node.Node._val, com.cliffc.aa.GVNGCM.add_work_all(), com.cliffc.aa.type.TypeMem.DEAD, com.cliffc.aa.Env.GVN, com.cliffc.aa.node.Node.kill(), com.cliffc.aa.node.Node.merge(), com.cliffc.aa.GVNGCM.Mode.Opto, com.cliffc.aa.node.Node.VALS, and com.cliffc.aa.node.Node.value().

Referenced by com.cliffc.aa.node.CallEpiNode.wire0().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ insert() [1/2]

Node com.cliffc.aa.node.Node.insert ( int  idx,
Node  n 
)
inherited

Definition at line 165 of file Node.java.

165 { unelock(); _defs.insert(idx,n); if( n!=null ) n._uses.add(this); return this; }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._uses, and com.cliffc.aa.node.Node.unelock().

Referenced by com.cliffc.aa.node.MemJoinNode.add_alias_above(), com.cliffc.aa.node.MemJoinNode.add_alias_below(), com.cliffc.aa.Parse.remove_unknown_callers(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.node.Node.subsume(), com.cliffc.aa.node.CallNode.swap_new(), and com.cliffc.aa.node.RetNode.tail_recursive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ insert() [2/2]

void com.cliffc.aa.node.Node.insert ( Node  nnn)
inherited

Definition at line 191 of file Node.java.

191  {
192  if( _uses._len>0 ) unelock(); // Hacking edges
193  while( _uses._len > 0 ) {
194  Node u = _uses.del(0); // Old use
195  u.replace(this,nnn); // was this now nnn
196  nnn._uses.add(u);
197  }
198  }

References com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node.replace(), and com.cliffc.aa.node.Node.unelock().

Here is the call graph for this function:

◆ is_CFG()

◆ is_copy()

Node com.cliffc.aa.node.CallEpiNode.is_copy ( int  idx)

Reimplemented from com.cliffc.aa.node.Node.

Definition at line 394 of file CallEpiNode.java.

394 { return _is_copy ? in(idx) : null; }

References com.cliffc.aa.node.CallEpiNode._is_copy, and com.cliffc.aa.node.Node.in().

Here is the call graph for this function:

◆ is_dead()

◆ is_forward_ref()

boolean com.cliffc.aa.node.Node.is_forward_ref ( )
inherited

Reimplemented in com.cliffc.aa.node.FunNode, com.cliffc.aa.node.FunPtrNode, com.cliffc.aa.node.RetNode, and com.cliffc.aa.node.ConTypeNode.

Definition at line 830 of file Node.java.

830 { return false; }

Referenced by com.cliffc.aa.node.CallNode.err(), com.cliffc.aa.node.StoreNode.ideal_reduce(), com.cliffc.aa.Parse.inc(), com.cliffc.aa.node.NewObjNode.promote_forward(), com.cliffc.aa.Parse.stmt(), and com.cliffc.aa.node.Node.walkerr_def().

Here is the caller graph for this function:

◆ is_mem()

boolean com.cliffc.aa.node.CallEpiNode.is_mem ( )

Reimplemented from com.cliffc.aa.node.Node.

Definition at line 36 of file CallEpiNode.java.

36 { return true; }

◆ is_multi_head()

◆ is_multi_tail()

boolean com.cliffc.aa.node.Node.is_multi_tail ( )
privateinherited

Definition at line 355 of file Node.java.

355 { return _op==OP_PARM || _op==OP_PHI || _op==OP_PROJ || _op==OP_CPROJ; }

References com.cliffc.aa.node.Node._op, com.cliffc.aa.node.Node.OP_CPROJ, com.cliffc.aa.node.Node.OP_PARM, com.cliffc.aa.node.Node.OP_PHI, and com.cliffc.aa.node.Node.OP_PROJ.

Referenced by com.cliffc.aa.node.Node.dump(), com.cliffc.aa.node.Node.dumprpo(), and com.cliffc.aa.node.Node.postorder().

Here is the caller graph for this function:

◆ is_prim()

◆ is_pure_call()

Node com.cliffc.aa.node.CallEpiNode.is_pure_call ( )
package

Reimplemented from com.cliffc.aa.node.Node.

Definition at line 503 of file CallEpiNode.java.

503 { return in(0) instanceof CallNode ? call().is_pure_call() : null; }

References com.cliffc.aa.node.CallEpiNode.call(), com.cliffc.aa.node.Node.in(), and com.cliffc.aa.node.CallNode.is_pure_call().

Here is the call graph for this function:

◆ keep() [1/2]

public<N extends Node> N com.cliffc.aa.node.Node.keep ( )
packageinherited

Definition at line 228 of file Node.java.

228 { return keep(1); }

References com.cliffc.aa.node.Node.keep().

Referenced by com.cliffc.aa.Parse._expr(), com.cliffc.aa.Parse._expr_higher(), com.cliffc.aa.Parse._short_circuit_expr(), com.cliffc.aa.GVNGCM.Build< N extends Node >.add(), com.cliffc.aa.node.MemJoinNode.add_alias_above(), com.cliffc.aa.node.MemJoinNode.add_alias_below_new(), com.cliffc.aa.Parse.apply(), com.cliffc.aa.node.ScopeNode.IfScope.check(), com.cliffc.aa.Parse.do_call0(), com.cliffc.aa.Parse.do_exit(), com.cliffc.aa.node.UnresolvedNode.filter(), com.cliffc.aa.node.FunNode.FunNode(), com.cliffc.aa.Parse.go(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.Parse.ifex(), com.cliffc.aa.Parse.inc(), com.cliffc.aa.Env.init(), com.cliffc.aa.GVNGCM.Build< N extends Node >.init(), com.cliffc.aa.GVNGCM.iter(), com.cliffc.aa.node.Node.keep(), com.cliffc.aa.Parse.merge_exits(), com.cliffc.aa.node.ScopeNode.ScopeNode(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.Parse.stmt(), com.cliffc.aa.Parse.stmts(), com.cliffc.aa.Parse.struct(), com.cliffc.aa.node.Node.subsume(), com.cliffc.aa.node.CallNode.swap_new(), com.cliffc.aa.Parse.term(), com.cliffc.aa.TestLive.testNewObj(), com.cliffc.aa.Env.top_scope(), and com.cliffc.aa.Parse.tuple().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ keep() [2/2]

public<N extends Node> N com.cliffc.aa.node.Node.keep ( int  d)
packageinherited

Definition at line 230 of file Node.java.

230 { _keep+=d; return (N)this; }

References com.cliffc.aa.node.Node._keep.

◆ kill()

Node com.cliffc.aa.node.Node.kill ( )
inherited

Definition at line 211 of file Node.java.

211  {
212  if( is_dead() ) return null;
213  assert _uses._len==0 && _keep==0;
214  // Similar to unelock(), except do not put on any worklist
215  if( _elock ) { _elock = false; Node x = VALS.remove(this); assert x == this; }
216  while( _defs._len > 0 ) unuse(_defs.pop());
217  set_dead(); // officially dead now
218  LIVE.clear(_uid); // Off the LIVE set. CNT cannot roll back unless the GVN worklists are also clear
219  return this;
220  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._elock, com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node.is_dead(), com.cliffc.aa.node.Node.LIVE, com.cliffc.aa.node.Node.set_dead(), com.cliffc.aa.node.Node.unuse(), and com.cliffc.aa.node.Node.VALS.

Referenced by com.cliffc.aa.node.Node.con(), com.cliffc.aa.node.Node.init1(), com.cliffc.aa.Parse.kill(), com.cliffc.aa.node.Node.subsume(), and com.cliffc.aa.node.TestNodeSmall.testCallNodeResolve().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ len()

int com.cliffc.aa.node.Node.len ( )
inherited

Definition at line 125 of file Node.java.

125 { return _defs._len; }

References com.cliffc.aa.node.Node._defs.

Referenced by com.cliffc.aa.node.MemPrimNode.err(), com.cliffc.aa.node.CallNode.ideal_reduce(), and com.cliffc.aa.node.CallEpiNode.value().

Here is the caller graph for this function:

◆ live()

TypeMem com.cliffc.aa.node.Node.live ( GVNGCM.Mode  opt_mode)
inherited

Reimplemented in com.cliffc.aa.node.CallNode, com.cliffc.aa.node.RetNode, com.cliffc.aa.node.MemJoinNode, com.cliffc.aa.node.ScopeNode, com.cliffc.aa.node.FunPtrNode, com.cliffc.aa.node.ConNode< T extends Type >, com.cliffc.aa.node.ThretNode, and com.cliffc.aa.node.StartNode.

Definition at line 478 of file Node.java.

478  {
479  if( _keep>0 ) return all_live();
480  // Compute meet/union of all use livenesses
481  TypeMem live = TypeMem.DEAD; // Start at lattice top
482  for( Node use : _uses ) // Computed across all uses
483  if( use.live_uses() ) {
484  TypeMem ulive = use.live_use(opt_mode, this);
485  live = (TypeMem)live.meet(ulive); // Make alive used fields
486  }
487  assert live==TypeMem.DEAD || live.basic_live()==all_live().basic_live();
488  assert live!=TypeMem.LIVE_BOT || (_val !=Type.CTRL && _val !=Type.XCTRL);
489  return live;
490  }

References com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node._val, com.cliffc.aa.node.Node.all_live(), com.cliffc.aa.type.TypeMem.basic_live(), com.cliffc.aa.type.Type< T extends Type< T >.CTRL, com.cliffc.aa.type.TypeMem.DEAD, com.cliffc.aa.type.TypeMem.LIVE_BOT, com.cliffc.aa.type.Type< T extends Type< T >.meet(), and com.cliffc.aa.type.Type< T extends Type< T >.XCTRL.

Referenced by com.cliffc.aa.node.Node.do_flow(), com.cliffc.aa.GVNGCM.gcp(), com.cliffc.aa.node.PhiNode.ideal_reduce(), com.cliffc.aa.node.MemPrimNode.LValueLength.live_use(), com.cliffc.aa.node.LoadNode.live_use(), com.cliffc.aa.node.Node.more_flow(), com.cliffc.aa.node.Node.more_ideal(), com.cliffc.aa.GVNGCM.revalive(), and com.cliffc.aa.node.Node.xliv().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ live_use()

TypeMem com.cliffc.aa.node.CallEpiNode.live_use ( GVNGCM.Mode  opt_mode,
Node  def 
)

Reimplemented from com.cliffc.aa.node.Node.

Definition at line 440 of file CallEpiNode.java.

440  {
441  assert _keep==0 || _live==all_live();
442  if( _is_copy ) return def._live; // A copy
443  // Not a copy
444  if( def==in(0) ) return _live; // The Call
445  if( def==in(1) ) return opt_mode._CG ? TypeMem.DEAD : _live; // The DefMem
446  // Wired return.
447  // The given function is alive, only if the Call will Call it.
448  Type tcall = call()._val;
449  if( !(tcall instanceof TypeTuple) ) return tcall.above_center() ? TypeMem.DEAD : _live;
450  BitsFun fidxs = CallNode.ttfp(tcall).fidxs();
451  int fidx = ((RetNode)def).fidx();
452  if( fidxs.above_center() || !fidxs.test_recur(fidx) )
453  return TypeMem.DEAD; // Call does not call this, so not alive.
454  return _live;
455  }

References com.cliffc.aa.node.CallEpiNode._is_copy, com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._live, com.cliffc.aa.node.Node._val, com.cliffc.aa.type.Bits< B extends Bits< B >.above_center(), com.cliffc.aa.type.Type< T extends Type< T >.above_center(), com.cliffc.aa.node.CallEpiNode.all_live(), com.cliffc.aa.node.CallEpiNode.call(), com.cliffc.aa.type.TypeMem.DEAD, com.cliffc.aa.type.TypeFunPtr.fidxs(), com.cliffc.aa.node.Node.in(), com.cliffc.aa.type.Bits< B extends Bits< B >.test_recur(), and com.cliffc.aa.node.CallNode.ttfp().

Here is the call graph for this function:

◆ live_uses()

boolean com.cliffc.aa.node.Node.live_uses ( )
inherited

Definition at line 491 of file Node.java.

491  {
492  return _live != TypeMem.DEAD && // Only live uses make more live
493  // And no chance use turns into a constant (which then does not use anything)
494  !(_live.basic_live() && _val.may_be_con() && !is_prim() && err(true)==null &&
495  // FunPtrs still use their Rets, even if constant
496  !(this instanceof FunPtrNode));
497  }

References com.cliffc.aa.node.Node._live, com.cliffc.aa.node.Node._val, com.cliffc.aa.type.TypeMem.basic_live(), com.cliffc.aa.type.TypeMem.DEAD, com.cliffc.aa.node.Node.err(), com.cliffc.aa.node.Node.is_prim(), and com.cliffc.aa.type.Type< T extends Type< T >.may_be_con().

Here is the call graph for this function:

◆ merge()

Node com.cliffc.aa.node.Node.merge ( Node  x)
privateinherited

Definition at line 702 of file Node.java.

702  {
703  x._live = (TypeMem)x._live.meet(_live);
704  return Env.GVN.add_flow(x);
705  }

References com.cliffc.aa.node.Node._live, com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.Env.GVN, and com.cliffc.aa.type.Type< T extends Type< T >.meet().

Referenced by com.cliffc.aa.node.Node._do_reduce(), and com.cliffc.aa.node.Node.init1().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ more_flow() [1/2]

final int com.cliffc.aa.node.Node.more_flow ( boolean  lifting)
inherited

Definition at line 747 of file Node.java.

747 { FLOW_VISIT.clear(); return more_flow(lifting,0); }

References com.cliffc.aa.node.Node.FLOW_VISIT, and com.cliffc.aa.node.Node.more_flow().

Referenced by com.cliffc.aa.GVNGCM.check_and_wire(), com.cliffc.aa.GVNGCM.gcp(), com.cliffc.aa.node.Node.more_flow(), and com.cliffc.aa.GVNGCM.remove_ambi().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ more_flow() [2/2]

int com.cliffc.aa.node.Node.more_flow ( boolean  lifting,
int  errs 
)
privateinherited

Definition at line 748 of file Node.java.

748  {
749  if( FLOW_VISIT.tset(_uid) ) return errs; // Been there, done that
750  if( Env.GVN.on_dead(this) ) return errs; // Do not check dying nodes
751  // Check for only forwards flow, and if possible then also on worklist
752  Type oval= _val, nval = value(Env.GVN._opt_mode);
753  TypeMem oliv=_live, nliv = live (Env.GVN._opt_mode);
754  boolean hm = false;
755  if( nval != oval || nliv != oliv || hm ) {
756  boolean ok = lifting
757  ? nval.isa(oval) && nliv.isa(oliv)
758  : oval.isa(nval) && oliv.isa(nliv);
759  if( !ok || (!Env.GVN.on_flow(this) && !Env.GVN.on_dead(this) && _keep==0) ) { // Still-to-be-computed?
760  FLOW_VISIT.clear(_uid); // Pop-frame & re-run in debugger
761  System.err.println(dump(0,new SB(),true)); // Rolling backwards not allowed
762  errs++;
763  }
764  }
765  for( Node def : _defs ) if( def != null ) errs = def.more_flow(lifting,errs);
766  for( Node use : _uses ) if( use != null ) errs = use.more_flow(lifting,errs);
767  return errs;
768  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._live, com.cliffc.aa.GVNGCM._opt_mode, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node._val, com.cliffc.aa.node.Node.dump(), com.cliffc.aa.node.Node.FLOW_VISIT, com.cliffc.aa.Env.GVN, com.cliffc.aa.type.Type< T extends Type< T >.isa(), com.cliffc.aa.node.Node.live(), com.cliffc.aa.GVNGCM.on_dead(), com.cliffc.aa.GVNGCM.on_flow(), com.cliffc.aa.util.VBitSet.tset(), and com.cliffc.aa.node.Node.value().

Here is the call graph for this function:

◆ more_ideal()

final boolean com.cliffc.aa.node.Node.more_ideal ( VBitSet  bs)
inherited

Definition at line 722 of file Node.java.

722  {
723  if( bs.tset(_uid) ) return false; // Been there, done that
724  if( _keep == 0 && _live.is_live() ) { // Only non-keeps, which is just top-level scope and prims
725  Type t = value(Env.GVN._opt_mode);
726  if( _val != t )
727  return true; // Found a value improvement
729  if( _live != live )
730  return true; // Found a liveness improvement
731  Node x;
732  x = do_reduce(); if( x != null )
733  return true; // Found an ideal call
734  x = do_mono(); if( x != null )
735  return true; // Found an ideal call
736  x = do_grow(); if( x != null )
737  return true; // Found an ideal call
738  if( this instanceof FunNode ) ((FunNode)this).ideal_inline(true);
739  }
740  for( Node def : _defs ) if( def != null && def.more_ideal(bs) ) return true;
741  for( Node use : _uses ) if( use != null && use.more_ideal(bs) ) return true;
742  return false;
743  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._live, com.cliffc.aa.GVNGCM._opt_mode, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node._val, com.cliffc.aa.node.Node.do_grow(), com.cliffc.aa.node.Node.do_mono(), com.cliffc.aa.node.Node.do_reduce(), com.cliffc.aa.Env.GVN, com.cliffc.aa.type.TypeMem.is_live(), com.cliffc.aa.node.Node.live(), com.cliffc.aa.util.VBitSet.tset(), and com.cliffc.aa.node.Node.value().

Referenced by com.cliffc.aa.GVNGCM.iter().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ new_tvar()

TV2 com.cliffc.aa.node.Node.new_tvar ( String  alloc_site)
inherited

Definition at line 101 of file Node.java.

101 { return TV2.make_leaf(this,alloc_site); }

References com.cliffc.aa.tvar.TV2.make_leaf().

Referenced by com.cliffc.aa.node.Node.copy(), and com.cliffc.aa.node.Node.Node().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ newuid()

int com.cliffc.aa.node.Node.newuid ( )
packageinherited

Definition at line 61 of file Node.java.

61  {
62  assert CNT < 100000 : "infinite node create loop";
63  if( CNT==AA.UID )
64  System.out.print("");
65  LIVE.set(CNT);
66  return CNT++;
67  }

References com.cliffc.aa.node.Node.CNT, com.cliffc.aa.node.Node.LIVE, and com.cliffc.aa.AA.UID.

Referenced by com.cliffc.aa.node.Node.copy(), and com.cliffc.aa.node.Node.Node().

Here is the caller graph for this function:

◆ nwired()

int com.cliffc.aa.node.CallEpiNode.nwired ( )

◆ op_prec()

◆ pop()

Node com.cliffc.aa.node.Node.pop ( )
inherited

Definition at line 174 of file Node.java.

174 { unelock(); Node n = _defs.pop(); unuse(n); return n; }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node.unelock(), and com.cliffc.aa.node.Node.unuse().

Referenced by com.cliffc.aa.node.ScopeNode.early_kill(), com.cliffc.aa.node.PrimNode.AndThen.ideal_grow(), com.cliffc.aa.node.PrimNode.OrElse.ideal_grow(), com.cliffc.aa.node.UnresolvedNode.ideal_reduce(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.node.NewNode< TypeStruct >.kill2(), com.cliffc.aa.node.FunNode.make_new_fun(), com.cliffc.aa.node.CallEpiNode.set_is_copy(), and com.cliffc.aa.node.FunNode.split_callers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ postorder()

void com.cliffc.aa.node.Node.postorder ( Ary< Node nodes,
VBitSet  bs 
)
privateinherited

Definition at line 383 of file Node.java.

383  {
384  if( bs.tset(_uid) ) return;
385  // If CFG, walk the CFG first. Do not walk thru Returns (into Calls) as
386  // this breaks up the whole- functions-at-once.
387  if( is_CFG() && _op!=OP_RET ) {
388  // Walk any CProj first.
389  for( Node use : _uses )
390  if( use._op == OP_CPROJ )
391  use.postorder(nodes,bs);
392  // Walk the CFG, walking CallEpis last
393  for( Node use : _uses )
394  if( !(use instanceof CallEpiNode) && use.is_CFG() )
395  use.postorder(nodes,bs);
396  for( Node use : _uses )
397  if( (use instanceof CallEpiNode) && use.is_CFG() )
398  use.postorder(nodes,bs);
399  }
400 
401  // Walk the rest (especially data). Since visit bits are set on the CFGs
402  // its OK to walk them also. Calls are special, since their Proj's feed
403  // into a Fun's Parms. We want the Fun to walk its own Parms, in order so
404  // ignore these edges. Since the Parms are all reachable from the Fun they
405  // get walked eventually.
406  if( _op != OP_CALL && _op!=OP_RET ) {
407  if( _op!=OP_SPLIT || _uses._len!=2 )
408  for( Node use : _uses )
409  use.postorder(nodes,bs);
410  else { // For MemSplit, walk the "busy" side first
411  Node p0 = _uses.at(0), p1 = _uses.at(1);
412  if( ((ProjNode)p0)._idx==1 ) { p0=p1; p1=_uses.at(0); } // Swap
413  p1.postorder(nodes,bs);
414  p0.postorder(nodes,bs);
415  }
416  }
417 
418  // Slight PO tweak: heads and tails together.
419  if( is_multi_head() )
420  for( Node use : _uses )
421  if( use.is_multi_tail() )
422  nodes.push(use);
423  if( !is_multi_tail() ) nodes.push(this);
424  }

References com.cliffc.aa.node.Node._op, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node.is_CFG(), com.cliffc.aa.node.Node.is_multi_head(), com.cliffc.aa.node.Node.is_multi_tail(), com.cliffc.aa.node.Node.OP_CALL, com.cliffc.aa.node.Node.OP_CPROJ, com.cliffc.aa.node.Node.OP_RET, com.cliffc.aa.node.Node.OP_SPLIT, com.cliffc.aa.node.Node.postorder(), com.cliffc.aa.util.Ary< E >.push(), and com.cliffc.aa.util.VBitSet.tset().

Referenced by com.cliffc.aa.node.Node.dumprpo(), and com.cliffc.aa.node.Node.postorder().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ remove()

Node com.cliffc.aa.node.Node.remove ( int  idx)
inherited

Definition at line 176 of file Node.java.

176 { unelock(); return unuse(_defs.remove(idx)); }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node.unelock(), and com.cliffc.aa.node.Node.unuse().

Referenced by com.cliffc.aa.node.RegionNode.stacked_region().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ replace()

void com.cliffc.aa.node.Node.replace ( Node  old,
Node  nnn 
)
inherited

Definition at line 163 of file Node.java.

163 { unelock(); _defs.replace(old,nnn); }

References com.cliffc.aa.node.Node._defs, and com.cliffc.aa.node.Node.unelock().

Referenced by com.cliffc.aa.node.Node.insert().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ reset_to_init0()

static void com.cliffc.aa.node.Node.reset_to_init0 ( )
staticinherited

Definition at line 77 of file Node.java.

77  {
78  CNT = 0;
79  LIVE.clear();
80  VALS.clear();
81  }

References com.cliffc.aa.node.Node.CNT, com.cliffc.aa.node.Node.LIVE, and com.cliffc.aa.node.Node.VALS.

Referenced by com.cliffc.aa.Env.top_reset().

Here is the caller graph for this function:

◆ roll_back_CNT()

static void com.cliffc.aa.node.Node.roll_back_CNT ( )
staticinherited

Definition at line 222 of file Node.java.

222 { while( !LIVE.get(CNT-1) ) CNT--; }

References com.cliffc.aa.node.Node.CNT, and com.cliffc.aa.node.Node.LIVE.

Referenced by com.cliffc.aa.GVNGCM.iter().

Here is the caller graph for this function:

◆ sane_wiring()

boolean com.cliffc.aa.node.CallEpiNode.sane_wiring ( )
package

Definition at line 379 of file CallEpiNode.java.

379  {
380  CallNode call = call();
381  for( int i=0; i<nwired(); i++ ) {
382  RetNode ret = wired(i);
383  if( ret.is_copy() ) return true; // Abort check, will be misaligned until dead path removed
384  FunNode fun = ret.fun();
385  boolean found=false;
386  for( Node def : fun._defs )
387  if( def instanceof CEProjNode && def.in(0)==call )
388  { found=true; break; }
389  if( !found ) return false;
390  }
391  return true;
392  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.CallEpiNode.call(), com.cliffc.aa.node.RetNode.fun(), com.cliffc.aa.node.Node.in(), com.cliffc.aa.node.RetNode.is_copy(), com.cliffc.aa.node.CallEpiNode.nwired(), and com.cliffc.aa.node.CallEpiNode.wired().

Referenced by com.cliffc.aa.node.CallEpiNode.unwire().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_dead()

void com.cliffc.aa.node.Node.set_dead ( )
inherited

Definition at line 821 of file Node.java.

821 { _defs = _uses = null; } // TODO: Poor-mans indication of a dead node, probably needs to recycle these...

References com.cliffc.aa.node.Node._defs, and com.cliffc.aa.node.Node._uses.

Referenced by com.cliffc.aa.node.Node.kill().

Here is the caller graph for this function:

◆ set_def()

Node com.cliffc.aa.node.Node.set_def ( int  idx,
Node  n 
)
inherited

Definition at line 154 of file Node.java.

154  {
155  unelock();
156  Node old = _defs.at(idx); // Get old value
157  // Add edge to new guy before deleting old, in case old goes dead and
158  // recursively makes new guy go dead also
159  if( (_defs._es[idx] = n) != null ) n._uses.add(this);
160  return unuse(old);
161  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node.unelock(), and com.cliffc.aa.node.Node.unuse().

Referenced by com.cliffc.aa.node.CallNode._ideal_grow(), com.cliffc.aa.node.MemJoinNode.add_alias_above(), com.cliffc.aa.node.MemJoinNode.add_alias_below(), com.cliffc.aa.node.MemJoinNode.combine_splits(), com.cliffc.aa.Parse.do_exit(), com.cliffc.aa.node.PrimNode.AndThen.ideal_grow(), com.cliffc.aa.node.PrimNode.OrElse.ideal_grow(), com.cliffc.aa.node.CastNode.ideal_mono(), com.cliffc.aa.node.FP2DispNode.ideal_reduce(), com.cliffc.aa.node.IfNode.ideal_reduce(), com.cliffc.aa.node.RegionNode.ideal_reduce(), com.cliffc.aa.node.FreshNode.ideal_reduce(), com.cliffc.aa.node.CastNode.ideal_reduce(), com.cliffc.aa.node.ErrNode.ideal_reduce(), com.cliffc.aa.node.UnresolvedNode.ideal_reduce(), com.cliffc.aa.node.RetNode.ideal_reduce(), com.cliffc.aa.node.FunPtrNode.ideal_reduce(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.node.FunNode.ideal_reduce(), com.cliffc.aa.node.MemSplitNode.insert_split(), com.cliffc.aa.node.DefMemNode.make_mem(), com.cliffc.aa.node.FunPtrNode.merge_ref_def(), com.cliffc.aa.node.NewObjNode.promote_forward(), com.cliffc.aa.Parse.remove_unknown_callers(), com.cliffc.aa.node.ScopeNode.replace_mem(), com.cliffc.aa.node.CallNode.set_arg(), com.cliffc.aa.node.ScopeNode.set_ctrl(), com.cliffc.aa.node.CallNode.set_dsp(), com.cliffc.aa.node.CallNode.set_fdx(), com.cliffc.aa.node.FunNode.set_is_copy(), com.cliffc.aa.node.LoadNode.set_mem(), com.cliffc.aa.node.ScopeNode.set_mem(), com.cliffc.aa.node.CallNode.set_mem(), com.cliffc.aa.node.ScopeNode.set_ptr(), com.cliffc.aa.node.ScopeNode.set_rez(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.node.CallNode.swap_new(), com.cliffc.aa.node.RetNode.tail_recursive(), and com.cliffc.aa.node.CallEpiNode.unwire().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_is_copy()

CallEpiNode com.cliffc.aa.node.CallEpiNode.set_is_copy ( Node  ctl,
Node  mem,
Node  rez 
)
private

Definition at line 396 of file CallEpiNode.java.

396  {
397  CallNode call = call();
398  if( FunNode._must_inline == call._uid ) // Assert an expected inlining happens
399  FunNode._must_inline = 0;
400  if( mem instanceof IntrinsicNode ) // Better error message for Intrinsic if Call args are bad
401  ((IntrinsicNode)mem)._badargs = call._badargs[1];
402  call._is_copy=_is_copy=true;
403  // Memory was split at the Call, according to the escapes aliases, and
404  // rejoined at the CallEpi. We need to make that explicit here.
405  GVNGCM.retype_mem(null,call,this,false);
406 
408  Env.GVN.add_reduce_uses(this);
409  while( _defs._len>0 ) pop();
410  add_def(ctl);
411  add_def(mem);
412  add_def(rez);
413  return this;
414  }

References com.cliffc.aa.node.CallNode._badargs, com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.CallEpiNode._is_copy, com.cliffc.aa.node.CallNode._is_copy, com.cliffc.aa.node.FunNode._must_inline, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node.add_def(), com.cliffc.aa.GVNGCM.add_reduce_uses(), com.cliffc.aa.node.CallEpiNode.call(), com.cliffc.aa.Env.GVN, com.cliffc.aa.node.Node.pop(), and com.cliffc.aa.GVNGCM.retype_mem().

Referenced by com.cliffc.aa.node.CallEpiNode.ideal_reduce().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sharptr()

Type com.cliffc.aa.node.Node.sharptr ( Node  mem)
inherited

Definition at line 855 of file Node.java.

855 { return mem._val.sharptr(_val); }

References com.cliffc.aa.node.Node._val, and com.cliffc.aa.type.Type< T extends Type< T >.sharptr().

Referenced by com.cliffc.aa.node.ParmNode.err(), com.cliffc.aa.node.CallNode.err(), com.cliffc.aa.Parse.get_display_ptr(), com.cliffc.aa.node.AssertNode.ideal_reduce(), com.cliffc.aa.node.FunNode.split_size(), com.cliffc.aa.node.ParmNode.valid_args(), com.cliffc.aa.node.ParmNode.value(), com.cliffc.aa.node.MemPrimNode.LValueLength.value(), com.cliffc.aa.node.AssertNode.value(), and com.cliffc.aa.node.MemPrimNode.LValueRead.value().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ should_con()

boolean com.cliffc.aa.node.Node.should_con ( Type  t)
inherited

Definition at line 651 of file Node.java.

651  {
652  if( this instanceof ConNode || // Already a constant
653  (this instanceof FunPtrNode && _val.is_con()) || // Already a constant
654  this instanceof ErrNode || // Never touch an ErrNode
655  this instanceof FreshNode ||// These modify the TVars but not the constant flows
656  is_prim() ) // Never touch a Primitive
657  return false; // Already a constant, or never touch an ErrNode
658  // Constant argument to call: keep for call resolution.
659  // Call can always inline to fold constant.
660  if( this instanceof ProjNode && in(0) instanceof CallNode && ((ProjNode)this)._idx>0 )
661  return false;
662  // Is in-error; do not remove the error.
663  if( err(true) != null )
664  return false;
665  // Is a constant
666  return t.is_con();
667  }

References com.cliffc.aa.node.Node._val, com.cliffc.aa.node.Node.err(), com.cliffc.aa.node.Node.in(), com.cliffc.aa.type.Type< T extends Type< T >.is_con(), and com.cliffc.aa.node.Node.is_prim().

Referenced by com.cliffc.aa.node.Node._do_reduce(), and com.cliffc.aa.node.Node.walk_opt().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ str()

String com.cliffc.aa.node.Node.str ( )
packageinherited

Reimplemented in com.cliffc.aa.node.FunNode, com.cliffc.aa.node.CallNode, com.cliffc.aa.node.FunPtrNode, com.cliffc.aa.node.NewNode< T extends TypeObj< T >, com.cliffc.aa.node.MemSplitNode, com.cliffc.aa.node.StoreNode, com.cliffc.aa.node.LoadNode, and com.cliffc.aa.node.ErrNode.

Definition at line 283 of file Node.java.

283 { return xstr(); } // Inline longer name

References com.cliffc.aa.node.Node.xstr().

Referenced by com.cliffc.aa.node.Node.dump(), and com.cliffc.aa.node.ConNode< T extends Type >.toString().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ subsume()

Node com.cliffc.aa.node.Node.subsume ( Node  nnn)
inherited

Definition at line 201 of file Node.java.

201  {
202  assert !nnn.is_dead();
203  insert(nnn); // Change graph shape
204  nnn.keep(); // Keep-alive
205  kill(); // Delete the old, and anything it uses
206  return nnn.unkeep(); // Remove keep-alive
207  }

References com.cliffc.aa.node.Node.insert(), com.cliffc.aa.node.Node.is_dead(), com.cliffc.aa.node.Node.keep(), com.cliffc.aa.node.Node.kill(), and com.cliffc.aa.node.Node.unkeep().

Referenced by com.cliffc.aa.node.MemJoinNode.combine_splits(), com.cliffc.aa.node.CallNode.copy(), com.cliffc.aa.node.Node.do_reduce(), com.cliffc.aa.node.IfNode.flip(), and com.cliffc.aa.node.Node.walk_opt().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ toString()

String com.cliffc.aa.node.Node.toString ( )
inherited

Reimplemented in com.cliffc.aa.node.ConNode< T extends Type >.

Definition at line 284 of file Node.java.

284 { return dump(0,new SB(),false).toString(); }

References com.cliffc.aa.node.Node.dump().

Here is the call graph for this function:

◆ tvar() [1/2]

TV2 com.cliffc.aa.node.Node.tvar ( )
inherited

Definition at line 96 of file Node.java.

96  {
97  TV2 tv = _tvar.find(); // Do U-F step
98  return tv == _tvar ? tv : (_tvar = tv); // Update U-F style in-place.
99  }

References com.cliffc.aa.node.Node._tvar, and com.cliffc.aa.tvar.TV2.find().

Referenced by com.cliffc.aa.node.MemJoinNode.add_alias_below(), com.cliffc.aa.Parse.func(), com.cliffc.aa.node.Node.tvar(), com.cliffc.aa.node.ProjNode.unify(), com.cliffc.aa.node.FreshNode.unify(), com.cliffc.aa.node.MemSplitNode.unify(), com.cliffc.aa.node.CastNode.unify(), com.cliffc.aa.node.MemJoinNode.unify(), com.cliffc.aa.node.StoreNode.unify(), and com.cliffc.aa.node.LoadNode.unify().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tvar() [2/2]

TV2 com.cliffc.aa.node.Node.tvar ( int  x)
inherited

Definition at line 100 of file Node.java.

100 { return in(x).tvar(); } // nth TV2

References com.cliffc.aa.node.Node.in(), and com.cliffc.aa.node.Node.tvar().

Here is the call graph for this function:

◆ unelock()

void com.cliffc.aa.node.Node.unelock ( )
inherited

Definition at line 128 of file Node.java.

128  {
129  assert check_vals(); // elock & VALs match
130  if( _elock ) { // Edge-locked
131  _elock=false; // Unlock
132  Node x = VALS.remove(this);
133  assert x==this; // Got the right node out
134  Env.GVN.add_reduce(Env.GVN.add_flow(this));
135  }
136  }

References com.cliffc.aa.node.Node._elock, com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.GVNGCM.add_reduce(), com.cliffc.aa.node.Node.check_vals(), com.cliffc.aa.Env.GVN, and com.cliffc.aa.node.Node.VALS.

Referenced by com.cliffc.aa.node.NewNode< TypeStruct >._init(), com.cliffc.aa.node.Node.add_def(), com.cliffc.aa.node.Node.del(), com.cliffc.aa.node.Node.insert(), com.cliffc.aa.node.NewNode< TypeStruct >.kill2(), com.cliffc.aa.node.Node.pop(), com.cliffc.aa.node.Node.remove(), com.cliffc.aa.node.Node.replace(), com.cliffc.aa.node.Node.set_def(), com.cliffc.aa.node.RetNode.set_fidx(), com.cliffc.aa.node.ProjNode.set_idx(), com.cliffc.aa.node.CallNode.set_rpc(), and com.cliffc.aa.node.TestNodeSmall.testCallNodeResolve().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ unhook()

public<N extends Node> N com.cliffc.aa.node.Node.unhook ( )
packageinherited

Definition at line 239 of file Node.java.

239  {
240  if( _keep==1 ) Env.GVN.add_work_all(this);
241  return unkeep();
242  }

References com.cliffc.aa.node.Node._keep, com.cliffc.aa.GVNGCM.add_work_all(), com.cliffc.aa.Env.GVN, and com.cliffc.aa.node.Node.unkeep().

Referenced by com.cliffc.aa.Parse.apply(), com.cliffc.aa.Parse.func(), and com.cliffc.aa.Parse.term().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ unify()

◆ unkeep() [1/2]

public<N extends Node> N com.cliffc.aa.node.Node.unkeep ( )
packageinherited

Definition at line 232 of file Node.java.

232 { return unkeep(1); }

References com.cliffc.aa.node.Node.unkeep().

Referenced by com.cliffc.aa.Parse._args(), com.cliffc.aa.Parse._expr(), com.cliffc.aa.Parse._expr_higher(), com.cliffc.aa.Parse._short_circuit_expr(), com.cliffc.aa.node.MemJoinNode.add_alias_above(), com.cliffc.aa.node.MemJoinNode.add_alias_below(), com.cliffc.aa.node.MemJoinNode.add_alias_below_new(), com.cliffc.aa.Parse.apply(), com.cliffc.aa.node.ScopeNode.IfScope.check(), com.cliffc.aa.node.TestNodeSmall.check(), com.cliffc.aa.Env.close_display(), com.cliffc.aa.Parse.do_call0(), com.cliffc.aa.node.UnresolvedNode.filter(), com.cliffc.aa.Parse.go(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.Parse.ifex(), com.cliffc.aa.Parse.inc(), com.cliffc.aa.Env.init(), com.cliffc.aa.node.MemSplitNode.insert_split(), com.cliffc.aa.GVNGCM.iter(), com.cliffc.aa.node.FunNode.make_new_fun(), com.cliffc.aa.Parse.merge_exits(), com.cliffc.aa.Parse.remove_unknown_callers(), com.cliffc.aa.node.RetNode.RetNode(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.Parse.stmt(), com.cliffc.aa.Parse.struct(), com.cliffc.aa.node.Node.subsume(), com.cliffc.aa.node.CallNode.swap_new(), com.cliffc.aa.Parse.term(), com.cliffc.aa.Parse.tuple(), com.cliffc.aa.node.Node.unhook(), and com.cliffc.aa.node.Node.unkeep().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ unkeep() [2/2]

public<N extends Node> N com.cliffc.aa.node.Node.unkeep ( int  d)
packageinherited

Definition at line 234 of file Node.java.

234  {
235  assert _keep >= d; _keep-=d;
236  return (N)this;
237  }

References com.cliffc.aa.node.Node._keep.

◆ unuse()

Node com.cliffc.aa.node.Node.unuse ( Node  old)
privateinherited

Definition at line 178 of file Node.java.

178  {
179  if( old == null ) return this;
180  old._uses.del(this);
181  // Either last use of old & goes dead, or at least 1 fewer uses & changes liveness
182  Env.GVN.add_unuse(old);
183  if( old._uses._len!=0 && old._keep ==0 ) old.add_flow_def_extra(this);
184  return this;
185  }

References com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node.add_flow_def_extra(), com.cliffc.aa.GVNGCM.add_unuse(), and com.cliffc.aa.Env.GVN.

Referenced by com.cliffc.aa.node.Node.kill(), com.cliffc.aa.node.Node.pop(), com.cliffc.aa.node.Node.remove(), and com.cliffc.aa.node.Node.set_def().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ unwire()

CallEpiNode com.cliffc.aa.node.CallEpiNode.unwire ( CallNode  call,
RetNode  ret 
)
package

Definition at line 416 of file CallEpiNode.java.

416  {
417  assert sane_wiring();
418  if( !ret.is_copy() ) {
419  FunNode fun = ret.fun();
420  for( int i = 1; i < fun._defs._len; i++ ) // Unwire
421  if( fun.in(i).in(0) == call ) {
422  fun.set_def(i, Env.XCTRL);
423  Env.GVN.add_flow(fun);
424  for( Node use : fun._uses ) {
425  Env.GVN.add_flow(use); // Dead path, all Phis can lift
426  Env.GVN.add_flow_defs(use); // All Phi uses lose a use
427  }
428  break;
429  }
430  }
431  del(_defs.find(ret));
432  Env.GVN.add_reduce(ret);
433  assert sane_wiring();
434  return this;
435  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._uses, com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.GVNGCM.add_flow_defs(), com.cliffc.aa.GVNGCM.add_reduce(), com.cliffc.aa.node.CallEpiNode.call(), com.cliffc.aa.node.Node.del(), com.cliffc.aa.node.RetNode.fun(), com.cliffc.aa.Env.GVN, com.cliffc.aa.node.Node.in(), com.cliffc.aa.node.RetNode.is_copy(), com.cliffc.aa.node.CallEpiNode.sane_wiring(), com.cliffc.aa.node.Node.set_def(), and com.cliffc.aa.Env.XCTRL.

Referenced by com.cliffc.aa.node.CallEpiNode.ideal_reduce().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ val()

Type com.cliffc.aa.node.Node.val ( int  idx)
inherited

Definition at line 470 of file Node.java.

470 { return in(idx)._val; }

References com.cliffc.aa.node.Node._val, and com.cliffc.aa.node.Node.in().

Referenced by com.cliffc.aa.node.NewNode< TypeStruct >.captured(), com.cliffc.aa.node.FunNode.check_callers(), com.cliffc.aa.node.ParmNode.err(), com.cliffc.aa.node.PrimNode.err(), com.cliffc.aa.node.PrimNode.ConvertTypeName.err(), com.cliffc.aa.node.FunNode.find_type_split(), com.cliffc.aa.node.FunNode.find_type_split_index(), com.cliffc.aa.node.AssertNode.ideal_grow(), com.cliffc.aa.node.FunNode.ideal_inline(), com.cliffc.aa.node.IfNode.ideal_reduce(), com.cliffc.aa.node.RegionNode.ideal_reduce(), com.cliffc.aa.node.MrgProjNode.ideal_reduce(), com.cliffc.aa.node.MemJoinNode.ideal_reduce(), com.cliffc.aa.node.PhiNode.ideal_reduce(), com.cliffc.aa.node.PhiNode.live_use(), com.cliffc.aa.node.RetNode.RetNode(), com.cliffc.aa.node.StoreNode.StoreNode(), com.cliffc.aa.node.ThretNode.ThretNode(), com.cliffc.aa.node.StoreNode.unify(), com.cliffc.aa.node.LoadNode.unify(), com.cliffc.aa.node.ParmNode.valid_args(), com.cliffc.aa.node.CEProjNode.value(), com.cliffc.aa.node.ErrNode.value(), com.cliffc.aa.node.ProjNode.value(), com.cliffc.aa.node.MProjNode.value(), com.cliffc.aa.node.FreshNode.value(), com.cliffc.aa.node.CastNode.value(), com.cliffc.aa.node.FP2DispNode.value(), com.cliffc.aa.node.IfNode.value(), com.cliffc.aa.node.PhiNode.value(), com.cliffc.aa.node.ParmNode.value(), com.cliffc.aa.node.MemPrimNode.LValueLength.value(), com.cliffc.aa.node.RegionNode.value(), com.cliffc.aa.node.MemJoinNode.value(), com.cliffc.aa.node.MemPrimNode.LValueRead.value(), com.cliffc.aa.node.PrimNode.value(), com.cliffc.aa.node.RetNode.value(), com.cliffc.aa.node.MemPrimNode.LValueWrite.value(), com.cliffc.aa.node.MemPrimNode.LValueWriteFinal.value(), com.cliffc.aa.node.PrimNode.ConvertStrStr.value(), com.cliffc.aa.node.CallEpiNode.value(), com.cliffc.aa.node.PrimNode.AndI64.value(), com.cliffc.aa.node.PrimNode.OrI64.value(), com.cliffc.aa.node.PrimNode.EQ_OOP.value(), com.cliffc.aa.node.PrimNode.NE_OOP.value(), com.cliffc.aa.node.PrimNode.Not.value(), com.cliffc.aa.node.PrimNode.RandI64.value(), com.cliffc.aa.node.PrimNode.Id.value(), com.cliffc.aa.node.FunNode.value(), and com.cliffc.aa.node.Node.walk_opt().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ value()

Type com.cliffc.aa.node.CallEpiNode.value ( GVNGCM.Mode  opt_mode)

Reimplemented from com.cliffc.aa.node.Node.

Definition at line 254 of file CallEpiNode.java.

254  {
255  if( _is_copy ) return _val; // A copy
256  Type tin0 = val(0);
257  if( !(tin0 instanceof TypeTuple) )
258  return tin0.oob(); // Weird stuff?
259  TypeTuple tcall = (TypeTuple)tin0;
260  if( tcall._ts.length < ARG_IDX ) return tcall.oob(); // Weird stuff
261 
262  // Get Call result. If the Call args are in-error, then the Call is called
263  // and we flow types to the post-call.... BUT the bad args are NOT passed
264  // along to the function being called.
265  // tcall[0] = Control
266  // tcall[1] = Memory passed around the functions.
267  // tcall[2] = TypeFunPtr passed to FP2Closure
268  // tcall[3+]= Arg types
269  Type ctl = CallNode.tctl(tcall); // Call is reached or not?
270  if( ctl != Type.CTRL && ctl != Type.ALL )
271  return TypeTuple.CALLE.dual();
272  TypeFunPtr tfptr= CallNode.ttfpx(tcall); // Peel apart Call tuple
273  TypeMemPtr tescs= CallNode.tesc(tcall); // Peel apart Call tuple
274 
275  // Fidxes; if still in the parser, assuming calling everything
276  BitsFun fidxs = tfptr==null || tfptr.is_forward_ref() ? BitsFun.FULL : tfptr.fidxs();
277  // NO fidxs, means we're not calling anything.
278  if( fidxs==BitsFun.EMPTY ) return TypeTuple.CALLE.dual();
279  if( fidxs.above_center() ) return TypeTuple.CALLE.dual(); // Not resolved yet
280 
281  // Default memory: global worse-case scenario
282  TypeMem defmem = Env.DEFMEM._val instanceof TypeMem
283  ? (TypeMem)Env.DEFMEM._val
284  : Env.DEFMEM._val.oob(TypeMem.ALLMEM);
285 
286  // Any not-wired unknown call targets?
287  if( fidxs!=BitsFun.FULL ) {
288  // If fidxs includes a parent fidx, then it was split - currently exactly
289  // in two. If both children are wired, then proceed to merge both
290  // children as expected; same if the parent is still wired (perhaps with
291  // some children). If only 1 child is wired, then we have an extra fidx
292  // for a not-wired child. If this fidx is really some unknown caller we
293  // would have to get super conservative; but its actually just a recently
294  // split child fidx. If we get the RetNode via FunNode.find_fidx we suffer
295  // the non-local progress curse. If we get super conservative, we end up
296  // rolling backwards (original fidx returned int; each split will only
297  // ever return int-or-better). So instead we "freeze in place".
298  outerloop:
299  for( int fidx : fidxs ) {
300  int kids=0;
301  for( int i=0; i<nwired(); i++ ) {
302  int rfidx = wired(i)._fidx;
303  if( fidx == rfidx ) continue outerloop; // Directly wired is always OK
304  if( fidx == BitsFun.parent(rfidx) ) kids++; // Count wired kids of a parent fidx
305  }
306  if( BitsFun.is_parent(fidx) ) { // Child of a split parent, need both kids wired
307  if( kids==2 ) continue; // Both kids wired, this is ok
308  return _val; // "Freeze in place"
309  }
310  if( !opt_mode._CG ) // Before GCP? Fidx is an unwired unknown call target
311  { fidxs = BitsFun.FULL; break; }
312  }
313  }
314 
315  // Compute call-return value from all callee returns
316  Type trez = Type .ANY ;
317  Type tmem = TypeMem.ANYMEM;
318  if( fidxs == BitsFun.FULL ) { // Called something unknown
319  trez = Type.ALL; // Unknown target does worst thing
320  tmem = defmem;
321  } else { // All targets are known & wired
322  for( int i=0; i<nwired(); i++ ) {
323  RetNode ret = wired(i);
324  if( fidxs.test_recur(ret._fidx) ) { // Can be wired, but later fidx is removed
325  Type tret = ret._val;
326  if( !(tret instanceof TypeTuple) ) tret = tret.oob(TypeTuple.RET);
327  tmem = tmem.meet(((TypeTuple)tret).at(MEM_IDX));
328  trez = trez.meet(((TypeTuple)tret).at(REZ_IDX));
329  }
330  }
331  }
332  TypeMem post_call = (TypeMem)tmem;
333 
334  // If no memory projection, then do not compute memory
335  if( (_keep==0 && ProjNode.proj(this,MEM_IDX)==null) || call().mem()==null )
336  return TypeTuple.make(Type.CTRL,TypeMem.ANYMEM,trez);
337  Type premem = call().mem()._val;
338 
339  // Build epilog memory.
340 
341  // Approximate "live out of call", includes things that are alive before
342  // the call but not flowing in. Catches all the "new in call" returns.
343  BitsAlias esc_out = esc_out(post_call,trez);
344  TypeMem caller_mem = premem instanceof TypeMem ? (TypeMem)premem : premem.oob(TypeMem.ALLMEM);
345  int len = opt_mode._CG ? Math.max(caller_mem.len(),post_call.len()) : defmem.len();
346  TypeObj[] pubs = new TypeObj[len];
347  for( int i=1; i<pubs.length; i++ ) {
348  boolean ein = tescs._aliases.test_recur(i);
349  boolean eout = esc_out .test_recur(i);
350  TypeObj pre = caller_mem.at(i);
351  TypeObj obj = ein || eout ? (TypeObj)(pre.meet(post_call.at(i))) : pre;
352  if( !opt_mode._CG ) // Before GCP, must use DefMem to keeps types strong as the Parser
353  obj = (TypeObj)obj.join(defmem.at(i));
354  pubs[i] = obj;
355  }
356  TypeMem tmem3 = TypeMem.make0(pubs);
357 
358  return TypeTuple.make(Type.CTRL,tmem3,trez);
359  }

References com.cliffc.aa.type.TypeMemPtr._aliases, com.cliffc.aa.node.RetNode._fidx, com.cliffc.aa.node.CallEpiNode._is_copy, com.cliffc.aa.node.Node._keep, com.cliffc.aa.type.TypeTuple._ts, com.cliffc.aa.node.Node._val, com.cliffc.aa.type.Bits< B extends Bits< B >.above_center(), com.cliffc.aa.type.Type< T extends Type< T >.ALL, com.cliffc.aa.type.TypeMem.ALLMEM, com.cliffc.aa.type.Type< T extends Type< T >.ANY, com.cliffc.aa.type.TypeMem.ANYMEM, com.cliffc.aa.type.TypeMem.at(), com.cliffc.aa.node.CallEpiNode.call(), com.cliffc.aa.type.TypeTuple.CALLE, com.cliffc.aa.type.Type< T extends Type< T >.CTRL, com.cliffc.aa.Env.DEFMEM, com.cliffc.aa.type.Type< T extends Type< T >.dual(), com.cliffc.aa.type.BitsFun.EMPTY, com.cliffc.aa.node.CallEpiNode.esc_out(), com.cliffc.aa.type.TypeFunPtr.fidxs(), com.cliffc.aa.type.BitsFun.FULL, com.cliffc.aa.type.TypeFunPtr.is_forward_ref(), com.cliffc.aa.type.BitsFun.is_parent(), com.cliffc.aa.type.Type< T extends Type< T >.join(), com.cliffc.aa.node.Node.len(), com.cliffc.aa.type.TypeMem.len(), com.cliffc.aa.type.TypeTuple.make(), com.cliffc.aa.type.TypeMem.make0(), com.cliffc.aa.type.Type< T extends Type< T >.meet(), com.cliffc.aa.node.CallNode.mem(), com.cliffc.aa.node.CallEpiNode.nwired(), com.cliffc.aa.type.Type< T extends Type< T >.oob(), com.cliffc.aa.type.BitsFun.parent(), com.cliffc.aa.node.ProjNode.proj(), com.cliffc.aa.type.TypeTuple.RET, com.cliffc.aa.node.CallNode.tctl(), com.cliffc.aa.node.CallNode.tesc(), com.cliffc.aa.type.Bits< B extends Bits< B >.test_recur(), com.cliffc.aa.node.CallNode.ttfpx(), com.cliffc.aa.node.Node.val(), and com.cliffc.aa.node.CallEpiNode.wired().

Here is the call graph for this function:

◆ walk_dom_last()

Node com.cliffc.aa.node.Node.walk_dom_last ( Predicate< Node P)
packageinherited

Reimplemented in com.cliffc.aa.node.ScopeNode, com.cliffc.aa.node.RegionNode, com.cliffc.aa.node.ConNode< T extends Type >, com.cliffc.aa.node.ThunkNode, com.cliffc.aa.node.StartNode, and com.cliffc.aa.node.LoopNode.

Definition at line 863 of file Node.java.

863  {
864  assert in(0) != null; // All default control nodes pass ctrl in slot 0
865  Node n = in(0).walk_dom_last(P);
866  if( n != null ) return n; // Take last answer first
867  return P.test(this) ? this : null;
868  }

References com.cliffc.aa.node.Node.in(), and com.cliffc.aa.node.Node.walk_dom_last().

Referenced by com.cliffc.aa.node.CastNode.ideal_mono(), com.cliffc.aa.node.LoopNode.walk_dom_last(), com.cliffc.aa.node.ThunkNode.walk_dom_last(), com.cliffc.aa.node.RegionNode.walk_dom_last(), and com.cliffc.aa.node.Node.walk_dom_last().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ walk_initype()

final void com.cliffc.aa.node.Node.walk_initype ( GVNGCM  gvn,
VBitSet  bs 
)
inherited

Definition at line 691 of file Node.java.

691  {
692  if( bs.tset(_uid) ) return; // Been there, done that
693  _val = Type.ANY; // Highest value
694  _live = TypeMem.DEAD; // Not alive
695  // Walk reachable graph
696  gvn.add_flow(this);
697  for( Node use : _uses ) use.walk_initype(gvn,bs);
698  for( Node def : _defs ) if( def != null ) def.walk_initype(gvn,bs);
699  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._live, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node._val, com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.type.Type< T extends Type< T >.ANY, com.cliffc.aa.type.TypeMem.DEAD, and com.cliffc.aa.util.VBitSet.tset().

Referenced by com.cliffc.aa.GVNGCM.gcp().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ walk_opt()

void com.cliffc.aa.node.Node.walk_opt ( VBitSet  visit)
inherited

Definition at line 797 of file Node.java.

797  {
798  assert !is_dead();
799  if( visit.tset(_uid) ) return; // Been there, done that
800 
801  // Replace any constants. Since the node computes a constant, its inputs
802  // were never marked live, and so go dead and so go to ANY and so are not
803  // available to recompute the constant later.
804  Type val = _val;
805  TypeFunPtr tfp;
806  if( val instanceof TypeFunPtr &&
807  _live.live_no_disp() &&
808  (tfp=(TypeFunPtr)val)._disp!=TypeMemPtr.NO_DISP )
809  val = tfp.make_no_disp();
810  if( should_con(val) )
812 
813  // Walk reachable graph
814  if( is_dead() ) return;
815  Env.GVN.add_work_all(this);
816  for( Node def : _defs ) if( def != null ) def.walk_opt(visit);
817  for( Node use : _uses ) use.walk_opt(visit);
818  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._live, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node._val, com.cliffc.aa.GVNGCM.add_work_all(), com.cliffc.aa.node.Node.con(), com.cliffc.aa.Env.GVN, com.cliffc.aa.node.Node.is_dead(), com.cliffc.aa.type.TypeMem.live_no_disp(), com.cliffc.aa.type.TypeFunPtr.make_no_disp(), com.cliffc.aa.type.TypeMemPtr.NO_DISP, com.cliffc.aa.GVNGCM.Mode.Opto, com.cliffc.aa.node.Node.should_con(), com.cliffc.aa.node.Node.subsume(), com.cliffc.aa.util.VBitSet.tset(), com.cliffc.aa.node.Node.val(), com.cliffc.aa.node.Node.walk_opt(), and com.cliffc.aa.node.Node.xliv().

Referenced by com.cliffc.aa.GVNGCM.gcp(), and com.cliffc.aa.node.Node.walk_opt().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ walkerr_def()

void com.cliffc.aa.node.Node.walkerr_def ( HashSet< ErrMsg errs,
VBitSet  bs 
)
inherited

Definition at line 771 of file Node.java.

771  {
772  if( bs.tset(_uid) ) return; // Been there, done that
773  for( int i=0; i<_defs._len; i++ ) {
774  Node def = _defs.at(i); // Walk data defs for more errors
775  if( def == null || def._val == Type.XCTRL ) continue;
776  // Walk function bodies that are wired, but not bare FunPtrs.
777  if( def instanceof FunPtrNode && !def.is_forward_ref() )
778  continue;
779  def.walkerr_def(errs,bs);
780  }
781  if( is_prim() ) return;
782  // Skip reporting if any input is 'all', as the input should report instead.
783  for( Node def : _defs )
784  if( def !=null && def._val ==Type.ALL )
785  return; // Skip reporting.
786  adderr(errs);
787  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node._uid, com.cliffc.aa.node.Node._val, com.cliffc.aa.node.Node.adderr(), com.cliffc.aa.type.Type< T extends Type< T >.ALL, com.cliffc.aa.node.Node.is_forward_ref(), com.cliffc.aa.node.Node.is_prim(), com.cliffc.aa.util.VBitSet.tset(), com.cliffc.aa.node.Node.walkerr_def(), and com.cliffc.aa.type.Type< T extends Type< T >.XCTRL.

Referenced by com.cliffc.aa.Parse.gather_errors(), and com.cliffc.aa.node.Node.walkerr_def().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ wire0()

void com.cliffc.aa.node.CallEpiNode.wire0 ( CallNode  call,
Node  fun 
)
package

Definition at line 218 of file CallEpiNode.java.

218  {
219  // Wire. Bulk parallel function argument path add
220 
221  // Add an input path to all incoming arg ParmNodes from the Call. Cannot
222  // assert finding all args, because dead args may already be removed - and
223  // so there's no Parm/Phi to attach the incoming arg to.
224  for( Node arg : fun._uses ) {
225  if( arg.in(0) != fun || !(arg instanceof ParmNode) ) continue;
226  Node actual;
227  int idx = ((ParmNode)arg)._idx;
228  switch( idx ) {
229  case 0: actual = new ConNode<>(TypeRPC.make(call._rpc)); break; // Always RPC is a constant
230  case MEM_IDX: actual = new MProjNode(call,(Env.DEFMEM._uses._len==0) ? Env.ANY : Env.DEFMEM); break; // Memory into the callee
231  default: actual = idx >= call.nargs() // Check for args present
232  ? new ConNode<>(Type.ALL) // Missing args, still wire (to keep FunNode neighbors) but will error out later.
233  : new ProjNode(call,idx); // Normal args
234  break;
235  }
236  actual._live = arg._live; // Set it before CSE during init1
237  arg.add_def(actual.init1());
238  if( arg._val.is_con() ) // Added an edge, value may change or go in-error
239  GVN.add_flow_defs(arg); // So use-liveness changes
240  }
241 
242  // Add matching control to function via a CallGraph edge.
243  fun.add_def(new CEProjNode(call,fun instanceof FunNode && !((FunNode) fun)._thunk_rhs ? ((FunNode)fun)._sig : null).init1());
244  GVN.add_flow(fun);
245  GVN.add_flow_uses(fun);
246  if( fun instanceof ThunkNode ) GVN.add_reduce_uses(fun);
247  if( fun instanceof FunNode ) GVN.add_inline((FunNode)fun);
248  }

References com.cliffc.aa.node.Node._live, com.cliffc.aa.node.CallNode._rpc, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node._val, com.cliffc.aa.node.Node.add_def(), com.cliffc.aa.type.Type< T extends Type< T >.ALL, com.cliffc.aa.Env.ANY, com.cliffc.aa.node.CallEpiNode.call(), com.cliffc.aa.Env.DEFMEM, com.cliffc.aa.node.Node.in(), com.cliffc.aa.node.Node.init1(), com.cliffc.aa.type.Type< T extends Type< T >.is_con(), com.cliffc.aa.type.TypeRPC.make(), and com.cliffc.aa.node.CallNode.nargs().

Referenced by com.cliffc.aa.node.FunNode.split_callers(), and com.cliffc.aa.node.CallEpiNode.wire1().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ wire1()

void com.cliffc.aa.node.CallEpiNode.wire1 ( CallNode  call,
Node  fun,
Node  ret 
)
package

Definition at line 207 of file CallEpiNode.java.

207  {
208  assert _defs.find(ret)==-1; // No double wiring
209  wire0(call,fun);
210  // Wire self to the return
211  add_def(ret);
212  GVN.add_flow(this);
213  GVN.add_flow(call);
214  GVN.add_flow_defs(call);
215  }

References com.cliffc.aa.node.Node._defs, com.cliffc.aa.node.Node.add_def(), com.cliffc.aa.node.CallEpiNode.call(), and com.cliffc.aa.node.CallEpiNode.wire0().

Referenced by com.cliffc.aa.node.CallEpiNode.check_and_wire(), com.cliffc.aa.node.CallEpiNode.ideal_reduce(), and com.cliffc.aa.node.FunNode.split_callers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ wired()

RetNode com.cliffc.aa.node.CallEpiNode.wired ( int  x)

Definition at line 38 of file CallEpiNode.java.

38 { return (RetNode)in(x+2); }

References com.cliffc.aa.node.Node.in().

Referenced by com.cliffc.aa.node.CallEpiNode.add_flow_use_extra(), com.cliffc.aa.Parse.do_call0(), com.cliffc.aa.node.CallEpiNode.ideal_reduce(), com.cliffc.aa.node.CallEpiNode.sane_wiring(), com.cliffc.aa.node.FunNode.split_callers(), and com.cliffc.aa.node.CallEpiNode.value().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xliv()

Node com.cliffc.aa.node.Node.xliv ( GVNGCM.Mode  opt_mode)
inherited

Definition at line 500 of file Node.java.

500 { _live = live(opt_mode); return this; }

References com.cliffc.aa.node.Node._live, and com.cliffc.aa.node.Node.live().

Referenced by com.cliffc.aa.TestLive.testBasic(), com.cliffc.aa.TestLive.testNewObj(), and com.cliffc.aa.node.Node.walk_opt().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xstr()

String com.cliffc.aa.node.CallEpiNode.xstr ( )

Reimplemented from com.cliffc.aa.node.Node.

Definition at line 30 of file CallEpiNode.java.

30  {// Self short name
31  if( _is_copy ) return "CopyEpi";
32  if( is_dead() ) return "XallEpi";
33  return "CallEpi";
34  }

References com.cliffc.aa.node.CallEpiNode._is_copy, and com.cliffc.aa.node.Node.is_dead().

Here is the call graph for this function:

◆ xval()

Type com.cliffc.aa.node.Node.xval ( )
inherited

Definition at line 460 of file Node.java.

460  {
461  Type oval = _val; // Get old type
462  Type nval = value(Env.GVN._opt_mode); // Get best type
463  if( nval!=oval ) {
464  _val = nval;
465  Env.GVN.add_flow_uses(this); // Put uses on worklist... values flows downhill
466  }
467  return nval;
468  }

References com.cliffc.aa.GVNGCM._opt_mode, com.cliffc.aa.node.Node._val, com.cliffc.aa.GVNGCM.add_flow_uses(), com.cliffc.aa.Env.GVN, and com.cliffc.aa.node.Node.value().

Referenced by com.cliffc.aa.node.MemSplitNode.add_alias(), com.cliffc.aa.node.MemJoinNode.add_alias_below_new(), com.cliffc.aa.node.NewObjNode.add_fun(), com.cliffc.aa.node.TestNodeSmall.check(), com.cliffc.aa.node.MemJoinNode.combine_splits(), com.cliffc.aa.node.ConTypeNode.def_fref(), com.cliffc.aa.node.LoadNode.ideal_mono(), com.cliffc.aa.node.MemJoinNode.ideal_reduce(), com.cliffc.aa.node.StoreNode.ideal_reduce(), com.cliffc.aa.node.IntrinsicNode.ideal_reduce(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.node.FunNode.make_new_fun(), com.cliffc.aa.node.FunPtrNode.merge_ref_def(), com.cliffc.aa.node.NewObjNode.promote_forward(), com.cliffc.aa.node.MemSplitNode.remove_alias(), com.cliffc.aa.node.FunNode.split_callers(), and com.cliffc.aa.TestLive.testNewObj().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ _defs

Ary<Node> com.cliffc.aa.node.Node._defs
inherited

Definition at line 124 of file Node.java.

Referenced by com.cliffc.aa.node.MemJoinNode.add_alias_above(), com.cliffc.aa.node.MemJoinNode.add_alias_below(), com.cliffc.aa.node.Node.add_def(), com.cliffc.aa.node.UnresolvedNode.add_def_unresolved(), com.cliffc.aa.node.CallNode.add_flow_extra(), com.cliffc.aa.GVNGCM.add_work_defs(), com.cliffc.aa.node.CallNode.arg(), com.cliffc.aa.node.MemPrimNode.ReadPrimNode.as_fun(), com.cliffc.aa.node.MemPrimNode.WritePrimNode.as_fun(), com.cliffc.aa.node.PrimNode.as_fun(), com.cliffc.aa.node.FunNode.bad_mem_use(), com.cliffc.aa.node.CallEpiNode.check_and_wire(), com.cliffc.aa.node.FunNode.check_callers(), com.cliffc.aa.node.MemJoinNode.combine_splits(), com.cliffc.aa.node.UnresolvedNode.copy(), com.cliffc.aa.node.Node.copy(), com.cliffc.aa.node.ConTypeNode.def_fref(), com.cliffc.aa.node.Node.del(), com.cliffc.aa.node.Node.do_flow(), com.cliffc.aa.node.Node.dump(), com.cliffc.aa.node.Node.equals(), com.cliffc.aa.node.MemPrimNode.err(), com.cliffc.aa.node.ErrNode.err(), com.cliffc.aa.node.ParmNode.err(), com.cliffc.aa.node.PrimNode.err(), com.cliffc.aa.node.CallNode.fdx(), com.cliffc.aa.node.UnresolvedNode.filter(), com.cliffc.aa.node.Node.find(), com.cliffc.aa.node.FunNode.find_body(), com.cliffc.aa.node.UnresolvedNode.find_fidx(), com.cliffc.aa.node.FunNode.find_type_split(), com.cliffc.aa.node.FunNode.find_type_split_index(), com.cliffc.aa.node.UnresolvedNode.funptr(), com.cliffc.aa.GVNGCM.gcp(), com.cliffc.aa.node.CallNode.get_fptr(), com.cliffc.aa.node.FunNode.has_unknown_callers(), com.cliffc.aa.node.Node.hashCode(), com.cliffc.aa.node.LoadNode.ideal_grow(), com.cliffc.aa.node.CallNode.ideal_grow(), com.cliffc.aa.node.PrimNode.AndThen.ideal_grow(), com.cliffc.aa.node.PrimNode.OrElse.ideal_grow(), com.cliffc.aa.node.FunNode.ideal_inline(), com.cliffc.aa.node.FP2DispNode.ideal_reduce(), com.cliffc.aa.node.IfNode.ideal_reduce(), com.cliffc.aa.node.RegionNode.ideal_reduce(), com.cliffc.aa.node.UnresolvedNode.ideal_reduce(), com.cliffc.aa.node.MemJoinNode.ideal_reduce(), com.cliffc.aa.node.PhiNode.ideal_reduce(), com.cliffc.aa.node.ParmNode.ideal_reduce(), com.cliffc.aa.node.CallEpiNode.ideal_reduce(), com.cliffc.aa.node.NewNode< TypeStruct >.ideal_reduce(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.node.Node.in(), com.cliffc.aa.node.Node.insert(), com.cliffc.aa.node.ScopeNode.is_closure(), com.cliffc.aa.node.ThunkNode.is_copy(), com.cliffc.aa.node.RegionNode.is_copy(), com.cliffc.aa.node.PrimNode.AndThen.is_copy(), com.cliffc.aa.node.PrimNode.OrElse.is_copy(), com.cliffc.aa.node.UnresolvedNode.is_pure_call(), com.cliffc.aa.node.Node.kill(), com.cliffc.aa.node.NewNode< TypeStruct >.kill2(), com.cliffc.aa.node.Node.len(), com.cliffc.aa.node.MemPrimNode.ReadPrimNode.live_use(), com.cliffc.aa.node.PhiNode.live_use(), com.cliffc.aa.node.CallNode.live_use(), com.cliffc.aa.node.DefMemNode.make_mem(), com.cliffc.aa.node.FunPtrNode.merge_ref_def(), com.cliffc.aa.node.Node.more_flow(), com.cliffc.aa.node.Node.more_ideal(), com.cliffc.aa.node.CallNode.nargs(), com.cliffc.aa.node.Node.Node(), com.cliffc.aa.node.CallEpiNode.nwired(), com.cliffc.aa.node.CProjNode.op_prec(), com.cliffc.aa.node.UnresolvedNode.op_prec(), com.cliffc.aa.node.CallNode.parms(), com.cliffc.aa.node.Node.pop(), com.cliffc.aa.node.Node.remove(), com.cliffc.aa.node.Node.replace(), com.cliffc.aa.node.FunNode.ret(), com.cliffc.aa.node.CallEpiNode.sane_wiring(), com.cliffc.aa.node.Node.set_dead(), com.cliffc.aa.node.Node.set_def(), com.cliffc.aa.node.CallNode.set_fdx(), com.cliffc.aa.node.CallEpiNode.set_is_copy(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.node.FunNode.split_size(), com.cliffc.aa.node.RegionNode.stacked_region(), com.cliffc.aa.node.FunPtrNode.str(), com.cliffc.aa.Parse.string(), com.cliffc.aa.node.TestNode.stx(), com.cliffc.aa.node.RetNode.tail_recursive(), com.cliffc.aa.Parse.term(), com.cliffc.aa.node.TestNode.test1monotonic(), com.cliffc.aa.node.TestNode.test1monotonic_intrinsic(), com.cliffc.aa.node.TestNode.test1monotonic_prim(), com.cliffc.aa.node.MemJoinNode.unify(), com.cliffc.aa.node.FunNode.unwire(), com.cliffc.aa.node.CallEpiNode.unwire(), com.cliffc.aa.node.DefMemNode.value(), com.cliffc.aa.node.UnresolvedNode.value(), com.cliffc.aa.node.PhiNode.value(), com.cliffc.aa.node.ParmNode.value(), com.cliffc.aa.node.ConTypeNode.value(), com.cliffc.aa.node.RegionNode.value(), com.cliffc.aa.node.MemJoinNode.value(), com.cliffc.aa.node.PrimNode.value(), com.cliffc.aa.node.PrimNode.ConvertTypeName.value(), com.cliffc.aa.node.CallNode.value(), com.cliffc.aa.node.FunNode.value(), com.cliffc.aa.node.RegionNode.walk_dom_last(), com.cliffc.aa.node.Node.walk_initype(), com.cliffc.aa.node.Node.walk_opt(), com.cliffc.aa.node.Node.walkerr_def(), com.cliffc.aa.node.CallEpiNode.wire1(), and com.cliffc.aa.node.FunPtrNode.xstr().

◆ _elock

◆ _INIT0_CNT

int com.cliffc.aa.node.Node._INIT0_CNT
staticinherited

◆ _is_copy

◆ _keep

◆ _live

TypeMem com.cliffc.aa.node.Node._live
inherited

Definition at line 89 of file Node.java.

Referenced by com.cliffc.aa.node.LoadNode._live_use(), com.cliffc.aa.node.NewNode< TypeStruct >.add_flow_def_extra(), com.cliffc.aa.node.FunPtrNode.add_flow_extra(), com.cliffc.aa.node.Node.con(), com.cliffc.aa.node.ConNode< T extends Type >.ConNode(), com.cliffc.aa.node.Node.do_flow(), com.cliffc.aa.node.Node.dump(), com.cliffc.aa.node.ErrNode.ErrNode(), com.cliffc.aa.node.IfNode.flip(), com.cliffc.aa.GVNGCM.gcp(), com.cliffc.aa.node.LoadNode.get_fld2(), com.cliffc.aa.node.MrgProjNode.ideal_reduce(), com.cliffc.aa.node.StoreNode.ideal_reduce(), com.cliffc.aa.node.CallEpiNode.ideal_reduce(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.node.FunNode.ideal_reduce(), com.cliffc.aa.node.Node.init1(), com.cliffc.aa.node.MemSplitNode.insert_split(), com.cliffc.aa.node.MemJoinNode.live(), com.cliffc.aa.node.CallNode.live(), com.cliffc.aa.node.ThretNode.live_use(), com.cliffc.aa.node.DefMemNode.live_use(), com.cliffc.aa.node.FreshNode.live_use(), com.cliffc.aa.node.FP2DispNode.live_use(), com.cliffc.aa.node.MProjNode.live_use(), com.cliffc.aa.node.CastNode.live_use(), com.cliffc.aa.node.NewNode< TypeStruct >.live_use(), com.cliffc.aa.node.MrgProjNode.live_use(), com.cliffc.aa.node.PhiNode.live_use(), com.cliffc.aa.node.MemPrimNode.LValueLength.live_use(), com.cliffc.aa.node.AssertNode.live_use(), com.cliffc.aa.node.IntrinsicNode.live_use(), com.cliffc.aa.node.StoreNode.live_use(), com.cliffc.aa.node.FunPtrNode.live_use(), com.cliffc.aa.node.ScopeNode.live_use(), com.cliffc.aa.node.MemJoinNode.live_use(), com.cliffc.aa.node.MemPrimNode.WritePrimNode.live_use(), com.cliffc.aa.node.RetNode.live_use(), com.cliffc.aa.node.LoadNode.live_use(), com.cliffc.aa.node.CallEpiNode.live_use(), com.cliffc.aa.node.Node.live_use(), com.cliffc.aa.node.CallNode.live_use(), com.cliffc.aa.node.Node.live_uses(), com.cliffc.aa.node.Node.merge(), com.cliffc.aa.node.Node.more_flow(), com.cliffc.aa.node.Node.more_ideal(), com.cliffc.aa.node.Node.Node(), com.cliffc.aa.node.PhiNode.PhiNode(), com.cliffc.aa.GVNGCM.revalive(), com.cliffc.aa.node.RetNode.tail_recursive(), com.cliffc.aa.TestLive.testBasic(), com.cliffc.aa.TestLive.testNewObj(), com.cliffc.aa.node.ThretNode.ThretNode(), com.cliffc.aa.node.DefMemNode.value(), com.cliffc.aa.node.Node.walk_initype(), com.cliffc.aa.node.Node.walk_opt(), com.cliffc.aa.node.CallEpiNode.wire0(), and com.cliffc.aa.node.Node.xliv().

◆ _op

◆ _tvar

TV2 com.cliffc.aa.node.Node._tvar
packageinherited

◆ _uid

◆ _uses

Ary<Node> com.cliffc.aa.node.Node._uses
inherited

Definition at line 245 of file Node.java.

Referenced by com.cliffc.aa.node.CallNode._ideal_grow(), com.cliffc.aa.node.Node.add_def(), com.cliffc.aa.node.MemJoinNode.add_flow_def_extra(), com.cliffc.aa.node.MrgProjNode.add_flow_def_extra(), com.cliffc.aa.node.RegionNode.add_flow_def_extra(), com.cliffc.aa.node.CProjNode.add_flow_use_extra(), com.cliffc.aa.node.ParmNode.add_flow_use_extra(), com.cliffc.aa.node.RegionNode.add_flow_use_extra(), com.cliffc.aa.node.StoreNode.add_reduce_extra(), com.cliffc.aa.GVNGCM.add_unuse(), com.cliffc.aa.GVNGCM.add_work_uses(), com.cliffc.aa.node.MemPrimNode.ReadPrimNode.as_fun(), com.cliffc.aa.node.MemPrimNode.WritePrimNode.as_fun(), com.cliffc.aa.node.PrimNode.as_fun(), com.cliffc.aa.node.NewNode< T extends TypeObj< T >.NewPrimNode< TypeAry >.as_fun(), com.cliffc.aa.node.FunNode.bad_mem_use(), com.cliffc.aa.node.NewNode< TypeStruct >.captured(), com.cliffc.aa.node.CallNode.cepi(), com.cliffc.aa.node.FunNode.check_callers(), com.cliffc.aa.node.Node.check_solo_mem_writer(), com.cliffc.aa.node.MemSplitNode.check_split(), com.cliffc.aa.node.MemJoinNode.combine_splits(), com.cliffc.aa.node.Node.copy(), com.cliffc.aa.node.Node.del(), com.cliffc.aa.node.FunPtrNode.display_used(), com.cliffc.aa.node.Node.do_flow(), com.cliffc.aa.node.Node.do_reduce(), com.cliffc.aa.node.Node.dump(), com.cliffc.aa.node.ErrNode.err(), com.cliffc.aa.node.CallNode.err(), com.cliffc.aa.node.Node.find(), com.cliffc.aa.node.FunNode.find_body(), com.cliffc.aa.node.FunNode.find_type_split_index(), com.cliffc.aa.node.IfNode.flip(), com.cliffc.aa.node.FunNode.fptr(), com.cliffc.aa.node.RetNode.funptr(), com.cliffc.aa.GVNGCM.gcp(), com.cliffc.aa.node.Node.get_mem_writer(), com.cliffc.aa.node.StoreNode.ideal_grow(), com.cliffc.aa.node.PrimNode.AndThen.ideal_grow(), com.cliffc.aa.node.PrimNode.OrElse.ideal_grow(), com.cliffc.aa.node.IfNode.ideal_reduce(), com.cliffc.aa.node.RegionNode.ideal_reduce(), com.cliffc.aa.node.MrgProjNode.ideal_reduce(), com.cliffc.aa.node.MemJoinNode.ideal_reduce(), com.cliffc.aa.node.StoreNode.ideal_reduce(), com.cliffc.aa.node.CallEpiNode.ideal_reduce(), com.cliffc.aa.node.IntrinsicNode.ideal_reduce(), com.cliffc.aa.node.RetNode.ideal_reduce(), com.cliffc.aa.node.FunNode.ideal_reduce(), com.cliffc.aa.node.Node.insert(), com.cliffc.aa.node.Node.is_dead(), com.cliffc.aa.node.MemSplitNode.join(), com.cliffc.aa.node.Node.kill(), com.cliffc.aa.Parse.kill(), com.cliffc.aa.node.NewNode< TypeStruct >.kill2(), com.cliffc.aa.node.ConNode< T extends Type >.live(), com.cliffc.aa.node.ScopeNode.live(), com.cliffc.aa.node.Node.live(), com.cliffc.aa.node.FunNode.make_new_fun(), com.cliffc.aa.node.FunPtrNode.merge_ref_def(), com.cliffc.aa.node.Node.more_flow(), com.cliffc.aa.node.Node.more_ideal(), com.cliffc.aa.node.NewNode< TypeStruct >.mrg(), com.cliffc.aa.node.FunNode.names(), com.cliffc.aa.node.Node.Node(), com.cliffc.aa.node.FunNode.parm(), com.cliffc.aa.node.FunNode.parms(), com.cliffc.aa.node.Node.postorder(), com.cliffc.aa.node.ProjNode.proj(), com.cliffc.aa.node.NewNode< TypeStruct >.ptr(), com.cliffc.aa.node.MemSplitNode.remove_alias(), com.cliffc.aa.Parse.remove_unknown_callers(), com.cliffc.aa.node.FunNode.ret(), com.cliffc.aa.GVNGCM.retype_mem(), com.cliffc.aa.node.Node.set_dead(), com.cliffc.aa.node.Node.set_def(), com.cliffc.aa.node.ScopeNode.set_mem(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.node.RegionNode.stacked_region(), com.cliffc.aa.node.RetNode.tail_recursive(), com.cliffc.aa.node.ThunkNode.thret(), com.cliffc.aa.node.Node.unuse(), com.cliffc.aa.node.CallEpiNode.unwire(), com.cliffc.aa.node.CEProjNode.value(), com.cliffc.aa.node.Node.walk_initype(), com.cliffc.aa.node.Node.walk_opt(), com.cliffc.aa.node.CallEpiNode.wire0(), com.cliffc.aa.GVNGCM.xform(), and com.cliffc.aa.GVNGCM.xreduce().

◆ _val

Type com.cliffc.aa.node.Node._val
inherited

Definition at line 88 of file Node.java.

Referenced by com.cliffc.aa.node.Node._do_reduce(), com.cliffc.aa.node.LoadNode._find_previous_store_call(), com.cliffc.aa.node.CallNode._ideal_grow(), com.cliffc.aa.node.MemPrimNode.LValueLength._live_use(), com.cliffc.aa.node.LoadNode._live_use(), com.cliffc.aa.node.FreshNode.add_flow_extra(), com.cliffc.aa.node.CastNode.add_flow_extra(), com.cliffc.aa.node.CallNode.add_flow_extra(), com.cliffc.aa.node.FunPtrNode.add_flow_use_extra(), com.cliffc.aa.node.CallEpiNode.check_and_wire(), com.cliffc.aa.node.RetNode.check_phi_type(), com.cliffc.aa.node.CastNode.checked(), com.cliffc.aa.node.MemJoinNode.combine_splits(), com.cliffc.aa.node.ScopeNode.compute_live_mem(), com.cliffc.aa.node.Node.con(), com.cliffc.aa.node.NewObjNode.create_active(), com.cliffc.aa.Parse.do_exit(), com.cliffc.aa.node.Node.do_flow(), com.cliffc.aa.node.Node.dump(), com.cliffc.aa.node.MemPrimNode.err(), com.cliffc.aa.node.ErrNode.err(), com.cliffc.aa.node.ParmNode.err(), com.cliffc.aa.node.PhiNode.err(), com.cliffc.aa.node.AssertNode.err(), com.cliffc.aa.node.IntrinsicNode.err(), com.cliffc.aa.node.StoreNode.err(), com.cliffc.aa.node.LoadNode.err(), com.cliffc.aa.node.CallNode.err(), com.cliffc.aa.node.StoreNode.escapees(), com.cliffc.aa.node.MemPrimNode.WritePrimNode.escapees(), com.cliffc.aa.node.CallNode.escapees(), com.cliffc.aa.Parse.fact(), com.cliffc.aa.node.CallNode.fidxs(), com.cliffc.aa.node.LoadNode.find_previous_store(), com.cliffc.aa.node.FunNode.find_type_split(), com.cliffc.aa.node.FunNode.find_type_split_index(), com.cliffc.aa.Parse.func(), com.cliffc.aa.Parse.gather_errors(), com.cliffc.aa.GVNGCM.gcp(), com.cliffc.aa.node.AssertNode.ideal_grow(), com.cliffc.aa.node.StoreNode.ideal_grow(), com.cliffc.aa.node.CallNode.ideal_grow(), com.cliffc.aa.node.FunNode.ideal_inline(), com.cliffc.aa.node.LoadNode.ideal_mono(), com.cliffc.aa.node.IfNode.ideal_reduce(), com.cliffc.aa.node.FreshNode.ideal_reduce(), com.cliffc.aa.node.MrgProjNode.ideal_reduce(), com.cliffc.aa.node.CastNode.ideal_reduce(), com.cliffc.aa.node.MemJoinNode.ideal_reduce(), com.cliffc.aa.node.LoadNode.ideal_reduce(), com.cliffc.aa.node.PhiNode.ideal_reduce(), com.cliffc.aa.node.StoreNode.ideal_reduce(), com.cliffc.aa.node.ParmNode.ideal_reduce(), com.cliffc.aa.node.CallEpiNode.ideal_reduce(), com.cliffc.aa.node.IntrinsicNode.ideal_reduce(), com.cliffc.aa.node.RetNode.ideal_reduce(), com.cliffc.aa.node.FunPtrNode.ideal_reduce(), com.cliffc.aa.node.ScopeNode.ideal_reduce(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.Parse.ifex(), com.cliffc.aa.node.Node.init1(), com.cliffc.aa.node.IfNode.is_copy(), com.cliffc.aa.node.CallNode.is_copy(), com.cliffc.aa.node.CallNode.least_cost(), com.cliffc.aa.node.Node.live(), com.cliffc.aa.node.CallNode.live(), com.cliffc.aa.node.MemPrimNode.ReadPrimNode.live_use(), com.cliffc.aa.node.CallEpiNode.live_use(), com.cliffc.aa.node.CallNode.live_use(), com.cliffc.aa.node.CallNode.live_use_call(), com.cliffc.aa.node.Node.live_uses(), com.cliffc.aa.Env.lookup_valtype(), com.cliffc.aa.Parse.merge_exits(), com.cliffc.aa.node.Node.more_flow(), com.cliffc.aa.node.Node.more_ideal(), com.cliffc.aa.node.Node.Node(), com.cliffc.aa.GVNGCM.remove_ambi(), com.cliffc.aa.GVNGCM.retype_mem(), com.cliffc.aa.node.ScopeNode.set_mem(), com.cliffc.aa.node.TestNode.set_type(), com.cliffc.aa.node.Node.sharptr(), com.cliffc.aa.node.Node.should_con(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.node.FunNode.split_size(), com.cliffc.aa.node.RetNode.tail_recursive(), com.cliffc.aa.Parse.term(), com.cliffc.aa.node.TestNode.test1jig(), com.cliffc.aa.node.TestNode.test1monotonic_init(), com.cliffc.aa.TestLive.testBasic(), com.cliffc.aa.node.TestNodeSmall.testCallNodeResolve2(), com.cliffc.aa.node.TestNode.testMonotonic(), com.cliffc.aa.TestLive.testNewObj(), com.cliffc.aa.node.TestNodeSmall.testRecursiveDisplay(), com.cliffc.aa.node.TestNodeSmall.testUnresolvedAdd(), com.cliffc.aa.Parse.tstmt(), com.cliffc.aa.Parse.type0(), com.cliffc.aa.Parse.typechk(), com.cliffc.aa.node.NewObjNode.update(), com.cliffc.aa.node.Node.val(), com.cliffc.aa.node.DefMemNode.value(), com.cliffc.aa.node.MProjNode.value(), com.cliffc.aa.node.MemSplitNode.value(), com.cliffc.aa.node.UnresolvedNode.value(), com.cliffc.aa.node.MrgProjNode.value(), com.cliffc.aa.node.AssertNode.value(), com.cliffc.aa.node.IntrinsicNode.value(), com.cliffc.aa.node.StoreNode.value(), com.cliffc.aa.node.FunPtrNode.value(), com.cliffc.aa.node.RetNode.value(), com.cliffc.aa.node.LoadNode.value(), com.cliffc.aa.node.CallEpiNode.value(), com.cliffc.aa.node.CallNode.value(), com.cliffc.aa.node.Node.walk_initype(), com.cliffc.aa.node.Node.walk_opt(), com.cliffc.aa.node.Node.walkerr_def(), com.cliffc.aa.node.CallEpiNode.wire0(), and com.cliffc.aa.node.Node.xval().

◆ CNT

int com.cliffc.aa.node.Node.CNT =1
staticprivateinherited

◆ FLOW_VISIT

final VBitSet com.cliffc.aa.node.Node.FLOW_VISIT = new VBitSet()
staticprivateinherited

Definition at line 746 of file Node.java.

Referenced by com.cliffc.aa.node.Node.more_flow().

◆ LIVE

◆ OP_CALL

◆ OP_CALLEPI

final byte com.cliffc.aa.node.Node.OP_CALLEPI = 2
staticpackageinherited

◆ OP_CAST

final byte com.cliffc.aa.node.Node.OP_CAST = 3
staticpackageinherited

◆ OP_CON

final byte com.cliffc.aa.node.Node.OP_CON = 4
staticpackageinherited

Definition at line 20 of file Node.java.

Referenced by com.cliffc.aa.node.ConNode< T extends Type >.ConNode().

◆ OP_CONTYPE

final byte com.cliffc.aa.node.Node.OP_CONTYPE = 5
staticpackageinherited

Definition at line 21 of file Node.java.

Referenced by com.cliffc.aa.node.ConTypeNode.ConTypeNode().

◆ OP_CPROJ

◆ OP_DEFMEM

final byte com.cliffc.aa.node.Node.OP_DEFMEM = 7
staticpackageinherited

◆ OP_ERR

final byte com.cliffc.aa.node.Node.OP_ERR = 8
staticpackageinherited

Definition at line 24 of file Node.java.

Referenced by com.cliffc.aa.node.ErrNode.ErrNode().

◆ OP_FP2DISP

final byte com.cliffc.aa.node.Node.OP_FP2DISP =10
staticpackageinherited

Definition at line 26 of file Node.java.

Referenced by com.cliffc.aa.node.FP2DispNode.FP2DispNode().

◆ OP_FRESH

final byte com.cliffc.aa.node.Node.OP_FRESH = 9
staticpackageinherited

◆ OP_FUN

◆ OP_FUNPTR

final byte com.cliffc.aa.node.Node.OP_FUNPTR =12
staticpackageinherited

◆ OP_IF

◆ OP_JOIN

final byte com.cliffc.aa.node.Node.OP_JOIN =14
staticpackageinherited

Definition at line 30 of file Node.java.

Referenced by com.cliffc.aa.node.MemJoinNode.MemJoinNode().

◆ OP_LOAD

final byte com.cliffc.aa.node.Node.OP_LOAD =15
staticpackageinherited

◆ OP_LOOP

final byte com.cliffc.aa.node.Node.OP_LOOP =16
staticpackageinherited

◆ OP_MAX

final byte com.cliffc.aa.node.Node.OP_MAX =36
staticpackageinherited

Definition at line 52 of file Node.java.

Referenced by com.cliffc.aa.node.FunNode.split_size().

◆ OP_NAME

final byte com.cliffc.aa.node.Node.OP_NAME =17
staticpackageinherited

◆ OP_NEWARY

final byte com.cliffc.aa.node.Node.OP_NEWARY =19
staticpackageinherited

Definition at line 35 of file Node.java.

◆ OP_NEWOBJ

final byte com.cliffc.aa.node.Node.OP_NEWOBJ =18
staticpackageinherited

◆ OP_NEWSTR

final byte com.cliffc.aa.node.Node.OP_NEWSTR =20
staticpackageinherited

◆ OP_PARM

final byte com.cliffc.aa.node.Node.OP_PARM =21
staticpackageinherited

◆ OP_PHI

◆ OP_PRIM

final byte com.cliffc.aa.node.Node.OP_PRIM =23
staticpackageinherited

◆ OP_PROJ

final byte com.cliffc.aa.node.Node.OP_PROJ =24
staticpackageinherited

◆ OP_REGION

◆ OP_RET

◆ OP_SCOPE

final byte com.cliffc.aa.node.Node.OP_SCOPE =27
staticpackageinherited

◆ OP_SPLIT

final byte com.cliffc.aa.node.Node.OP_SPLIT =28
staticpackageinherited

◆ OP_START

final byte com.cliffc.aa.node.Node.OP_START =29
staticpackageinherited

◆ OP_STMEM

final byte com.cliffc.aa.node.Node.OP_STMEM =30
staticpackageinherited

Definition at line 46 of file Node.java.

Referenced by com.cliffc.aa.node.StartMemNode.StartMemNode().

◆ OP_STORE

final byte com.cliffc.aa.node.Node.OP_STORE =31
staticpackageinherited

◆ OP_THRET

final byte com.cliffc.aa.node.Node.OP_THRET =32
staticpackageinherited

Definition at line 48 of file Node.java.

Referenced by com.cliffc.aa.node.ThretNode.ThretNode().

◆ OP_THUNK

final byte com.cliffc.aa.node.Node.OP_THUNK =33
staticpackageinherited

Definition at line 49 of file Node.java.

Referenced by com.cliffc.aa.node.ThunkNode.ThunkNode().

◆ OP_TYPE

final byte com.cliffc.aa.node.Node.OP_TYPE =34
staticpackageinherited

Definition at line 50 of file Node.java.

Referenced by com.cliffc.aa.node.AssertNode.AssertNode().

◆ OP_UNR

final byte com.cliffc.aa.node.Node.OP_UNR =35
staticpackageinherited

Definition at line 51 of file Node.java.

Referenced by com.cliffc.aa.node.UnresolvedNode.UnresolvedNode().

◆ STRS

final String [] com.cliffc.aa.node.Node.STRS = new String[] { null, "Call", "CallEpi", "Cast", "Con", "ConType", "CProj", "DefMem", "Err", "Fresh", "FP2Disp", "Fun", "FunPtr", "If", "Join", "Load", "Loop", "Name", "NewObj", "NewAry", "NewStr", "Parm", "Phi", "Prim", "Proj", "Region", "Return", "Scope","Split", "Start", "StartMem", "Store", "Thret", "Thunk", "Type", "Unresolved" }
staticprivateinherited

Definition at line 54 of file Node.java.

Referenced by com.cliffc.aa.node.Node.xstr().

◆ VALS


The documentation for this class was generated from the following file:
com.cliffc.aa.type.BitsAlias.FULL
static BitsAlias FULL
Definition: BitsAlias.java:27
com.cliffc.aa.node.Node.OP_PROJ
static final byte OP_PROJ
Definition: Node.java:40
com.cliffc.aa.util.Ary.at
E at(int i)
Definition: Ary.java:25
com.cliffc.aa.node.CallEpiNode.all_live
TypeMem all_live()
Definition: CallEpiNode.java:437
com.cliffc.aa.type.TypeMemPtr.NO_DISP
static final Type NO_DISP
Definition: TypeMemPtr.java:80
com.cliffc.aa.node.Node._do_reduce
Node _do_reduce()
Definition: Node.java:570
com.cliffc.aa.type.BitsFun.parent
static int parent(int kid)
Definition: BitsFun.java:50
com.cliffc.aa.type.BitsFun.EMPTY
static final BitsFun EMPTY
Definition: BitsFun.java:37
com.cliffc.aa.GVNGCM.add_unuse
Node add_unuse(Node n)
Definition: GVNGCM.java:59
com.cliffc.aa.type.TypeMem.DEAD
static final TypeMem DEAD
Definition: TypeMem.java:226
com.cliffc.aa.type.TypeFunPtr
Definition: TypeFunPtr.java:23
com.cliffc.aa.node.CallEpiNode.wire0
void wire0(CallNode call, Node fun)
Definition: CallEpiNode.java:218
com.cliffc.aa.node.PrimNode
Definition: PrimNode.java:20
com.cliffc.aa.util.Ary.push
E push(E e)
Add element in amortized constant time.
Definition: Ary.java:58
com.cliffc.aa.node.CallEpiNode.call
CallNode call()
Definition: CallEpiNode.java:35
com.cliffc.aa.type.TypeRPC.make
static TypeRPC make(BitsRPC rpcs)
Definition: TypeRPC.java:25
com.cliffc.aa.node.Node.OP_START
static final byte OP_START
Definition: Node.java:45
com.cliffc.aa.type.Type.isa
boolean isa(Type t)
Definition: Type.java:623
com.cliffc.aa.type.TypeMem.live_no_disp
boolean live_no_disp()
Definition: TypeMem.java:320
com.cliffc.aa.node.Node.walk_dom_last
Node walk_dom_last(Predicate< Node > P)
Definition: Node.java:863
com.cliffc.aa.node.Node.live
TypeMem live(GVNGCM.Mode opt_mode)
Definition: Node.java:478
com.cliffc.aa.AA.UID
static int UID
Definition: AA.java:43
com.cliffc.aa.node.CallNode.mem
Node mem()
Definition: CallNode.java:119
com.cliffc.aa.Env.XCTRL
static ConNode XCTRL
Definition: Env.java:21
com.cliffc.aa.type.TypeMem
Memory type; the state of all of memory; memory edges order memory ops.
Definition: TypeMem.java:53
com.cliffc.aa.GVNGCM.add_mono
public< N extends Node > N add_mono(N n)
Definition: GVNGCM.java:51
com.cliffc.aa.type.Type.join
Type join(Type t)
Definition: Type.java:619
com.cliffc.aa.node.Node.len
int len()
Definition: Node.java:125
com.cliffc.aa.type.TypeMem.XMEM
static final TypeMem XMEM
Definition: TypeMem.java:225
com.cliffc.aa.node.Node._live
TypeMem _live
Definition: Node.java:89
com.cliffc.aa.node.Node.OP_LOOP
static final byte OP_LOOP
Definition: Node.java:32
com.cliffc.aa.GVNGCM.add_flow_uses
void add_flow_uses(Node n)
Definition: GVNGCM.java:55
com.cliffc.aa.node.CallNode._is_copy
boolean _is_copy
Definition: CallNode.java:89
com.cliffc.aa.type.TypeMem.LIVE_BOT
static final TypeMem LIVE_BOT
Definition: TypeMem.java:226
com.cliffc.aa.node.Node.add_flow_use_extra
void add_flow_use_extra(Node chg)
Definition: Node.java:514
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.node.Node.subsume
Node subsume(Node nnn)
Definition: Node.java:201
com.cliffc.aa.node.Node.VALS
static final ConcurrentHashMap< Node, Node > VALS
Definition: Node.java:537
com.cliffc.aa.node.Node.OP_SPLIT
static final byte OP_SPLIT
Definition: Node.java:44
com.cliffc.aa.type.TypeMem.is_live
boolean is_live()
Definition: TypeMem.java:560
com.cliffc.aa.type.TypeMem.ESCAPE
static final TypeMem ESCAPE
Definition: TypeMem.java:227
com.cliffc.aa.GVNGCM.add_work_all
Node add_work_all(Node n)
Definition: GVNGCM.java:73
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.Node.OP_CALLEPI
static final byte OP_CALLEPI
Definition: Node.java:18
com.cliffc.aa.util.Ary
Definition: Ary.java:11
com.cliffc.aa.node.Node.is_multi_tail
boolean is_multi_tail()
Definition: Node.java:355
com.cliffc.aa.node.Node.add_flow_def_extra
void add_flow_def_extra(Node chg)
Definition: Node.java:515
com.cliffc.aa.type.BitsFun.FULL
static final BitsFun FULL
Definition: BitsFun.java:33
com.cliffc.aa.type.BitsAlias
Definition: BitsAlias.java:8
com.cliffc.aa.type.TypeTuple
Definition: TypeTuple.java:11
com.cliffc.aa.node.Node.do_mono
Node do_mono()
Definition: Node.java:632
com.cliffc.aa.node.Node.keep
public< N extends Node > N keep()
Definition: Node.java:228
com.cliffc.aa.util.Ary._len
int _len
Definition: Ary.java:13
com.cliffc.aa.node.Node.err
ErrMsg err(boolean fast)
Definition: Node.java:526
com.cliffc.aa.node.Node.unelock
void unelock()
Definition: Node.java:128
com.cliffc.aa.type.TypeFunPtr.fidxs
BitsFun fidxs()
Definition: TypeFunPtr.java:127
com.cliffc.aa.type.TypeMem.ALLMEM
static final TypeMem ALLMEM
Definition: TypeMem.java:228
com.cliffc.aa.node.Node._val
Type _val
Definition: Node.java:88
com.cliffc.aa.node.Node.find
Node find(int uid)
Definition: Node.java:427
com.cliffc.aa.type.Type.ANY
static final Type ANY
Definition: Type.java:325
com.cliffc.aa.node.Node.OP_FUN
static final byte OP_FUN
Definition: Node.java:27
com.cliffc.aa.node.Node.add_def
Node add_def(Node n)
Definition: Node.java:152
com.cliffc.aa.type.BitsFun.ALL
static final int ALL
Definition: BitsFun.java:24
com.cliffc.aa.type.Type.meet
final Type meet(Type t)
Definition: Type.java:412
com.cliffc.aa.node.CallEpiNode.check_and_wire
boolean check_and_wire()
Definition: CallEpiNode.java:179
com.cliffc.aa.node.CallEpiNode.is_pure_call
Node is_pure_call()
Definition: CallEpiNode.java:503
com.cliffc.aa.type.Bits.test_recur
boolean test_recur(int i)
Definition: Bits.java:232
com.cliffc.aa.type.Bits.test
static boolean test(long[] bits, int i)
Definition: Bits.java:224
com.cliffc.aa.type.Type.str
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Definition: Type.java:131
com.cliffc.aa.node.Node.OP_CALL
static final byte OP_CALL
Definition: Node.java:17
com.cliffc.aa.type.TypeMem.ANYMEM
static final TypeMem ANYMEM
Definition: TypeMem.java:228
com.cliffc.aa.node.Node.ideal_reduce
Node ideal_reduce()
Definition: Node.java:441
com.cliffc.aa.type.Type.ALL
static final Type ALL
Definition: Type.java:324
com.cliffc.aa.node.Node.is_prim
boolean is_prim()
Definition: Node.java:260
com.cliffc.aa.node.Node.postorder
void postorder(Ary< Node > nodes, VBitSet bs)
Definition: Node.java:383
com.cliffc.aa.node.Node.Node
Node(byte op)
Definition: Node.java:247
com.cliffc.aa.util.VBitSet.tset
boolean tset(int idx)
Definition: VBitSet.java:7
com.cliffc.aa.type.TypeFunPtr.is_forward_ref
boolean is_forward_ref()
Definition: TypeFunPtr.java:186
com.cliffc.aa.type.Bits.above_center
boolean above_center()
Definition: Bits.java:204
com.cliffc.aa.type.TypeMem.make0
static TypeMem make0(TypeObj[] as)
Definition: TypeMem.java:170
com.cliffc.aa.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.node.FunNode.name
static String name(int fidx, boolean debug)
Definition: FunNode.java:109
com.cliffc.aa.node.Node.CNT
static int CNT
Definition: Node.java:59
com.cliffc.aa.type.TypeObj
Definition: TypeObj.java:15
com.cliffc.aa.type.Type.isBitShape
byte isBitShape(Type t)
Definition: Type.java:814
com.cliffc.aa.node.Node.unkeep
public< N extends Node > N unkeep()
Definition: Node.java:232
com.cliffc.aa.node.CallNode.nargs
int nargs()
Definition: CallNode.java:125
com.cliffc.aa.type.Type.is_con
boolean is_con()
Definition: Type.java:776
com.cliffc.aa.type.BitsFun.is_parent
static boolean is_parent(int idx)
Definition: BitsFun.java:48
com.cliffc.aa.node.Node.FLOW_VISIT
static final VBitSet FLOW_VISIT
Definition: Node.java:746
com.cliffc.aa.type.TypeMem.len
int len()
Definition: TypeMem.java:149
com.cliffc.aa.type.Type.above_center
boolean above_center()
Definition: Type.java:741
com.cliffc.aa.node.Node.should_con
boolean should_con(Type t)
Definition: Node.java:651
com.cliffc.aa.node.Node.is_dead
boolean is_dead()
Definition: Node.java:820
com.cliffc.aa.node.Node.value
abstract Type value(GVNGCM.Mode opt_mode)
com.cliffc.aa.node.CallNode._rpc
int _rpc
Definition: CallNode.java:87
com.cliffc.aa.node.Node.OP_IF
static final byte OP_IF
Definition: Node.java:29
com.cliffc.aa.node.Node.kill
Node kill()
Definition: Node.java:211
com.cliffc.aa.type.TypeTuple.RET
static final TypeTuple RET
Definition: TypeTuple.java:130
com.cliffc.aa.node.RetNode._fidx
int _fidx
Definition: RetNode.java:20
com.cliffc.aa.node.Node._keep
byte _keep
Definition: Node.java:86
com.cliffc.aa.node.Node.adderr
void adderr(HashSet< ErrMsg > errs)
Definition: Node.java:789
com.cliffc.aa.GVNGCM.add_reduce_uses
void add_reduce_uses(Node n)
Definition: GVNGCM.java:57
com.cliffc.aa.node.Node.merge
Node merge(Node x)
Definition: Node.java:702
com.cliffc.aa.node.CallEpiNode.set_is_copy
CallEpiNode set_is_copy(Node ctl, Node mem, Node rez)
Definition: CallEpiNode.java:396
com.cliffc.aa.type.Type.CTRL
static final Type CTRL
Definition: Type.java:326
com.cliffc.aa.util.SB.s
SB s()
Definition: SB.java:41
com.cliffc.aa.node.FunNode.find_fidx
static FunNode find_fidx(int fidx)
Definition: FunNode.java:101
com.cliffc.aa.node.FunNode._must_inline
static int _must_inline
Definition: FunNode.java:73
com.cliffc.aa.node.FunNode.set_is_copy
void set_is_copy()
Definition: FunNode.java:919
com.cliffc.aa.node.CallEpiNode.esc_out
static BitsAlias esc_out(TypeMem tmem, Type trez)
Definition: CallEpiNode.java:361
com.cliffc.aa.type.TypeMem.basic_live
boolean basic_live()
Definition: TypeMem.java:561
com.cliffc.aa.type.TypeTuple.make
static TypeTuple make(boolean any, Type[] ts)
Definition: TypeTuple.java:82
com.cliffc.aa.node.Node.in
Node in(int i)
Definition: Node.java:126
com.cliffc.aa.node.Node.OP_SCOPE
static final byte OP_SCOPE
Definition: Node.java:43
com.cliffc.aa.GVNGCM.on_flow
boolean on_flow(Node n)
Definition: GVNGCM.java:40
com.cliffc.aa.tvar.TV2.make_leaf
static TV2 make_leaf(Node n, @NotNull String alloc_site)
Definition: TV2.java:126
com.cliffc.aa.node.Node.set_dead
void set_dead()
Definition: Node.java:821
com.cliffc.aa.node.CallEpiNode.wire1
void wire1(CallNode call, Node fun, Node ret)
Definition: CallEpiNode.java:207
com.cliffc.aa.type.Type.may_be_con
boolean may_be_con()
Definition: Type.java:759
com.cliffc.aa.type.Type.XCTRL
static final Type XCTRL
Definition: Type.java:327
com.cliffc.aa.GVNGCM
Definition: GVNGCM.java:12
com.cliffc.aa.node.CallEpiNode._is_copy
boolean _is_copy
Definition: CallEpiNode.java:25
com.cliffc.aa.type.Type.sharptr
Type sharptr(Type ptr)
Definition: Type.java:930
com.cliffc.aa.node.Node.unuse
Node unuse(Node old)
Definition: Node.java:178
com.cliffc.aa.node.Node.OP_NEWOBJ
static final byte OP_NEWOBJ
Definition: Node.java:34
com.cliffc.aa.type.TypeFunPtr.make_no_disp
TypeFunPtr make_no_disp()
Definition: TypeFunPtr.java:77
com.cliffc.aa.node.Node._INIT0_CNT
static int _INIT0_CNT
Definition: Node.java:58
com.cliffc.aa.type.Type.simple_ptr
Type simple_ptr()
Definition: Type.java:358
com.cliffc.aa.node.FunNode.noinline
boolean noinline()
Definition: FunNode.java:179
com.cliffc.aa.type.BitsAlias.EMPTY
static BitsAlias EMPTY
Definition: BitsAlias.java:27
com.cliffc.aa.util.VBitSet
Definition: VBitSet.java:5
com.cliffc.aa.node.Node.add_reduce_extra
void add_reduce_extra()
Definition: Node.java:517
com.cliffc.aa.node.Node.more_flow
final int more_flow(boolean lifting)
Definition: Node.java:747
com.cliffc.aa.type.BitsFun
Definition: BitsFun.java:7
com.cliffc.aa.node.Node.insert
Node insert(int idx, Node n)
Definition: Node.java:165
com.cliffc.aa.util.SB
Tight/tiny StringBuilder wrapper.
Definition: SB.java:8
com.cliffc.aa.node.CallNode.ctl
Node ctl()
Definition: CallNode.java:118
com.cliffc.aa.type.Type.NIL
static final Type NIL
Definition: Type.java:332
com.cliffc.aa.node.Node.con
static Node con(Type t)
Definition: Node.java:670
com.cliffc.aa.node.Node._uses
Ary< Node > _uses
Definition: Node.java:245
com.cliffc.aa.node.Node.OP_NEWSTR
static final byte OP_NEWSTR
Definition: Node.java:36
com.cliffc.aa.node.FunNode.nargs
int nargs()
Definition: FunNode.java:190
com.cliffc.aa.node.Node.ideal_grow
Node ideal_grow()
Definition: Node.java:450
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa.node.Node._header
static void _header(FunNode fun, SB sb)
Definition: Node.java:380
com.cliffc.aa.node.Node.OP_CPROJ
static final byte OP_CPROJ
Definition: Node.java:22
com.cliffc.aa.node.Node.is_CFG
boolean is_CFG()
Definition: Node.java:356
com.cliffc.aa.node.Node.val
Type val(int idx)
Definition: Node.java:470
com.cliffc.aa.node.Node.LIVE
static final VBitSet LIVE
Definition: Node.java:60
com.cliffc.aa.node.Node.all_live
TypeMem all_live()
Definition: Node.java:509
com.cliffc.aa.util.SB.nl
SB nl()
Definition: SB.java:48
com.cliffc.aa.node.Node.xstr
String xstr()
Definition: Node.java:282
com.cliffc.aa.node.FunNode._sig
TypeFunSig _sig
Definition: FunNode.java:62
com.cliffc.aa.node.Node._elock
boolean _elock
Definition: Node.java:87
com.cliffc.aa.node.CallEpiNode.wired
RetNode wired(int x)
Definition: CallEpiNode.java:38
com.cliffc.aa.node.Node.is_forward_ref
boolean is_forward_ref()
Definition: Node.java:830
com.cliffc.aa.type.Bits.abit
int abit()
Definition: Bits.java:203
com.cliffc.aa.util.SB.p
SB p(String s)
Definition: SB.java:13
com.cliffc.aa.node.CallEpiNode.nwired
int nwired()
Definition: CallEpiNode.java:37
com.cliffc.aa.type.TypeMemPtr._aliases
BitsAlias _aliases
Definition: TypeMemPtr.java:16
com.cliffc.aa.type.TypeTuple.at
Type at(int idx)
Definition: TypeTuple.java:182
com.cliffc.aa.node.Node.set_def
Node set_def(int idx, Node n)
Definition: Node.java:154
com.cliffc.aa.node.CallEpiNode.sane_wiring
boolean sane_wiring()
Definition: CallEpiNode.java:379
com.cliffc.aa.node.Node.do_grow
Node do_grow()
Definition: Node.java:639
com.cliffc.aa.type.TypeTuple.CALLE
static final TypeTuple CALLE
Definition: TypeTuple.java:131
com.cliffc.aa.GVNGCM.add_reduce
public< N extends Node > N add_reduce(N n)
Definition: GVNGCM.java:49
com.cliffc.aa.node.Node.del
void del(int idx)
Definition: Node.java:169
com.cliffc.aa.type.Type.dual
final T dual()
Definition: Type.java:361
com.cliffc.aa.node.CallEpiNode.unwire
CallEpiNode unwire(CallNode call, RetNode ret)
Definition: CallEpiNode.java:416
com.cliffc.aa.node.Node._op
final byte _op
Definition: Node.java:85
com.cliffc.aa.node.Node.walkerr_def
void walkerr_def(HashSet< ErrMsg > errs, VBitSet bs)
Definition: Node.java:771
com.cliffc.aa.tvar.TV2
Definition: TV2.java:23
com.cliffc.aa.GVNGCM.Mode.Opto
Opto
Definition: GVNGCM.java:17
com.cliffc.aa.GVNGCM.add_flow_defs
void add_flow_defs(Node n)
Definition: GVNGCM.java:54
com.cliffc.aa.type.TypeRPC
Definition: TypeRPC.java:7
com.cliffc.aa.node.Node.OP_PARM
static final byte OP_PARM
Definition: Node.java:37
com.cliffc.aa.type.Type.oob
Type oob()
Definition: Type.java:635
com.cliffc.aa.type.TypeMem.all_reaching_aliases
BitsAlias all_reaching_aliases(BitsAlias aliases)
Definition: TypeMem.java:349
com.cliffc.aa.node.Node.is_multi_head
boolean is_multi_head()
Definition: Node.java:354
com.cliffc.aa.type.TypeTuple._ts
Type[] _ts
Definition: TypeTuple.java:13
com.cliffc.aa.node.Node.OP_RET
static final byte OP_RET
Definition: Node.java:42
com.cliffc.aa.GVNGCM._opt_mode
Mode _opt_mode
Definition: GVNGCM.java:22
com.cliffc.aa.type.Type.XNIL
static final Type XNIL
Definition: Type.java:333
com.cliffc.aa.node.Node.str
String str()
Definition: Node.java:283
com.cliffc.aa.node.Node.pop
Node pop()
Definition: Node.java:174
com.cliffc.aa.node.Node.newuid
int newuid()
Definition: Node.java:61
com.cliffc.aa.GVNGCM.add_flow
public< N extends Node > N add_flow(N n)
Definition: GVNGCM.java:50
com.cliffc.aa.util.SB.i
SB i(int d)
Definition: SB.java:38
com.cliffc.aa.GVNGCM.add_dead
void add_dead(Node n)
Definition: GVNGCM.java:48
com.cliffc.aa.node.Node.dump
String dump(int max)
Definition: Node.java:286
com.cliffc.aa.node.Node._tvar
TV2 _tvar
Definition: Node.java:94
com.cliffc.aa.node.Node.ideal_mono
Node ideal_mono()
Definition: Node.java:445
com.cliffc.aa.node.Node._uid
int _uid
Definition: Node.java:84
com.cliffc.aa.node.Node.tvar
TV2 tvar()
Definition: Node.java:96
com.cliffc.aa.node.CallNode.arg
Node arg(int x)
Definition: CallNode.java:127
com.cliffc.aa.type.TypeMemPtr.OOP0
static final TypeMemPtr OOP0
Definition: TypeMemPtr.java:93
com.cliffc.aa.node.FunNode
Definition: FunNode.java:58
com.cliffc.aa.node.CallNode.fdx
Node fdx()
Definition: CallNode.java:121
com.cliffc.aa.type.BitsAlias.NZERO
static BitsAlias NZERO
Definition: BitsAlias.java:27
com.cliffc.aa.node.CallNode._badargs
Parse[] _badargs
Definition: CallNode.java:94
com.cliffc.aa.node.Node.init1
Node init1()
Definition: Node.java:708
com.cliffc.aa.node.Node.check_vals
boolean check_vals()
Definition: Node.java:143
com.cliffc.aa.node.CallNode.is_pure_call
Node is_pure_call()
Definition: CallNode.java:785
com.cliffc.aa.Env.ANY
static ConNode ANY
Definition: Env.java:24
com.cliffc.aa.node.CallNode.err
ErrMsg err(boolean fast)
Definition: CallNode.java:694
com.cliffc.aa.node.Node.do_reduce
Node do_reduce()
Definition: Node.java:545
com.cliffc.aa.node.Node.replace
void replace(Node old, Node nnn)
Definition: Node.java:163
com.cliffc.aa.node.Node.new_tvar
TV2 new_tvar(String alloc_site)
Definition: Node.java:101
com.cliffc.aa.node.Node.OP_PHI
static final byte OP_PHI
Definition: Node.java:38
com.cliffc.aa.Env.DEFMEM
static DefMemNode DEFMEM
Definition: Env.java:19
com.cliffc.aa.type.TypeMem.at
TypeObj at(int alias)
Definition: TypeMem.java:135
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.node.FunNode.is_forward_ref
boolean is_forward_ref()
Definition: FunNode.java:886
com.cliffc.aa.util.SB.toString
String toString()
Definition: SB.java:62
com.cliffc.aa.node.Node.walk_opt
void walk_opt(VBitSet visit)
Definition: Node.java:797
com.cliffc.aa.GVNGCM.on_dead
boolean on_dead(Node n)
Definition: GVNGCM.java:39
com.cliffc.aa.node.Node.add_flow_extra
void add_flow_extra(Type old)
Definition: Node.java:513
com.cliffc.aa.node.Node._defs
Ary< Node > _defs
Definition: Node.java:124
com.cliffc.aa.tvar.TV2.find
TV2 find()
Definition: TV2.java:240
com.cliffc.aa.node.FunNode._thunk_rhs
final boolean _thunk_rhs
Definition: FunNode.java:68
com.cliffc.aa.type.TypeMemPtr
Definition: TypeMemPtr.java:14
com.cliffc.aa.node.Node.OP_REGION
static final byte OP_REGION
Definition: Node.java:41
com.cliffc.aa.Env.ALL_CTRL
static ConNode ALL_CTRL
Definition: Env.java:20
com.cliffc.aa.node.FunNode.ret
RetNode ret()
Definition: FunNode.java:900
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14
com.cliffc.aa.type.TypeFunSig._formals
TypeTuple _formals
Definition: TypeFunSig.java:15
com.cliffc.aa.node.Node.xliv
Node xliv(GVNGCM.Mode opt_mode)
Definition: Node.java:500