aa
com.cliffc.aa.GVNGCM Class Reference
Collaboration diagram for com.cliffc.aa.GVNGCM:
[legend]

Classes

class  Build
 
enum  Mode
 

Public Member Functions

void add_dead (Node n)
 
void add_flow (UQNodes deps)
 
void add_flow_defs (Node n)
 
void add_flow_uses (Node n)
 
void add_grow (Node n)
 
void add_inline (FunNode n)
 
void add_reduce_uses (Node n)
 
Node add_unuse (Node n)
 
Node add_work_all (Node n)
 
void gcp (Mode mode, ScopeNode rez)
 
void iter (Mode opt_mode)
 
Node iter (Node x, Work[] works)
 
boolean on_dead (Node n)
 
boolean on_flow (Node n)
 
boolean on_reduce (Node n)
 
void revalive (Node... ns)
 
Node xform (Node n)
 
Node xreduce (Node n)
 

Static Public Member Functions

static void add_work_defs (Work work, Node n)
 
static void add_work_uses (Work work, Node n)
 
static void retype_mem (BitSet aliases, Node mem, Node exit, boolean skip_calls)
 

Public Attributes

Mode _opt_mode =Mode.Parse
 
final Work[] _reduce_works = new Work[]{_work_dead,_work_flow,_work_reduce }
 
final Work _work_dom = new Work("dom" , false) { @Override public Node apply(Node n) { return n.do_mono (); } }
 

Package Functions

public< N extends Node > N add_flow (N n)
 
public< N extends Node > N add_mono (N n)
 
public< N extends Node > N add_reduce (N n)
 
public< N extends Node > N init (N n)
 
void init0 ()
 
void reset_to_init0 ()
 

Static Package Functions

static public< N extends Node > N add_work (Work work, N n)
 

Static Package Attributes

static int ITER_CNT
 
static int ITER_CNT_NOOP
 

Private Member Functions

void check_and_wire (CallEpiNode cepi)
 
boolean check_not_monotonic (Node n, Type ot, Type nt)
 
void remove_ambi (CallNode call)
 

Private Attributes

final Work[] _all_works = new Work[]{_work_dead,_work_flow,_work_reduce,_work_mono,_work_grow,_work_inline}
 
final Work[] _new_works = new Work[]{ _work_flow,_work_reduce,_work_mono,_work_grow }
 
final Work _work_dead = new Work("dead" , false) { @Override public Node apply(Node n) { return n._keep==0 && n._uses._len == 0 ? n.kill() : null; } }
 
final Work _work_flow = new Work("flow" , false) { @Override public Node apply(Node n) { return n.do_flow (); } }
 
final Work _work_grow = new Work("grow" , true ) { @Override public Node apply(Node n) { return n.do_grow (); } }
 
final Work _work_inline = new Work("inline", false) { @Override public Node apply(Node n) { return ((FunNode)n).ideal_inline(false); } }
 
final Work _work_mono = new Work("mono" , true ) { @Override public Node apply(Node n) { return n.do_mono (); } }
 
final Work _work_reduce = new Work("reduce", true ) { @Override public Node apply(Node n) { return n.do_reduce(); } }
 

Static Private Attributes

static boolean HAS_WORK
 
static final VBitSet IDEAL_VISIT = new VBitSet()
 

Detailed Description

Definition at line 12 of file GVNGCM.java.

Member Function Documentation

◆ add_dead()

void com.cliffc.aa.GVNGCM.add_dead ( Node  n)

Definition at line 48 of file GVNGCM.java.

48 { add_work(_work_dead, n); }

References com.cliffc.aa.GVNGCM._work_dead, and com.cliffc.aa.GVNGCM.add_work().

Referenced by com.cliffc.aa.GVNGCM.add_unuse(), com.cliffc.aa.Env.close(), com.cliffc.aa.node.Node.do_grow(), com.cliffc.aa.node.FunNode.split_callers(), and com.cliffc.aa.Parse.term().

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

◆ add_flow() [1/2]

public<N extends Node> N com.cliffc.aa.GVNGCM.add_flow ( n)
package

Definition at line 50 of file GVNGCM.java.

50 { return add_work(_work_flow ,n); }

References com.cliffc.aa.GVNGCM._work_flow, and com.cliffc.aa.GVNGCM.add_work().

Referenced by com.cliffc.aa.tvar.TV2._fresh_unify(), com.cliffc.aa.Parse._short_circuit_expr(), com.cliffc.aa.node.CallNode.add_flow_def_extra(), com.cliffc.aa.node.CastNode.add_flow_extra(), com.cliffc.aa.node.FunPtrNode.add_flow_extra(), com.cliffc.aa.node.CallNode.add_flow_extra(), com.cliffc.aa.node.CProjNode.add_flow_use_extra(), com.cliffc.aa.node.MProjNode.add_flow_use_extra(), com.cliffc.aa.node.ParmNode.add_flow_use_extra(), com.cliffc.aa.node.NewStrNode.AddStrStr.add_flow_use_extra(), com.cliffc.aa.node.RegionNode.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.CallNode.add_flow_use_extra(), com.cliffc.aa.node.MemSplitNode.add_reduce_extra(), com.cliffc.aa.node.NewNode< TypeStruct >.add_reduce_extra(), com.cliffc.aa.node.CallNode.add_reduce_extra(), com.cliffc.aa.GVNGCM.add_unuse(), com.cliffc.aa.GVNGCM.check_not_monotonic(), com.cliffc.aa.Env.close_display(), com.cliffc.aa.node.Node.con(), com.cliffc.aa.node.NewNode< TypeStruct >.copy(), com.cliffc.aa.node.NewObjNode.create_active(), com.cliffc.aa.Parse.do_call0(), com.cliffc.aa.node.Node.do_flow(), com.cliffc.aa.node.Node.do_grow(), com.cliffc.aa.node.Node.do_mono(), com.cliffc.aa.node.FunPtrNode.forward_ref(), com.cliffc.aa.GVNGCM.gcp(), com.cliffc.aa.node.NewObjNode.ideal_mono(), com.cliffc.aa.Parse.ifex(), com.cliffc.aa.GVNGCM.init(), com.cliffc.aa.node.MemSplitNode.insert_split(), com.cliffc.aa.node.FunNode.make_new_fun(), com.cliffc.aa.node.Node.merge(), com.cliffc.aa.GVNGCM.remove_ambi(), com.cliffc.aa.Parse.stmts(), com.cliffc.aa.node.CallNode.swap_new(), com.cliffc.aa.node.Node.unelock(), com.cliffc.aa.tvar.TV2.unify_at(), com.cliffc.aa.tvar.TV2.union(), com.cliffc.aa.node.FunNode.unwire(), com.cliffc.aa.node.CallEpiNode.unwire(), com.cliffc.aa.node.Node.walk_initype(), com.cliffc.aa.GVNGCM.xform(), and com.cliffc.aa.GVNGCM.xreduce().

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

◆ add_flow() [2/2]

void com.cliffc.aa.GVNGCM.add_flow ( UQNodes  deps)

Definition at line 56 of file GVNGCM.java.

56 { if( deps != null ) for( Node dep : deps.values() ) add_flow(dep); }

References com.cliffc.aa.GVNGCM.add_flow(), and com.cliffc.aa.util.NonBlockingHashMapLong< TypeV >.values().

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

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

◆ add_flow_defs()

void com.cliffc.aa.GVNGCM.add_flow_defs ( Node  n)

Definition at line 54 of file GVNGCM.java.

References com.cliffc.aa.GVNGCM._work_flow, and com.cliffc.aa.GVNGCM.add_work_defs().

Referenced by com.cliffc.aa.node.CallNode.add_flow_extra(), com.cliffc.aa.node.RegionNode.add_flow_use_extra(), com.cliffc.aa.node.CallNode.add_flow_use_extra(), com.cliffc.aa.node.Node.do_flow(), com.cliffc.aa.GVNGCM.gcp(), com.cliffc.aa.GVNGCM.revalive(), and com.cliffc.aa.node.CallEpiNode.unwire().

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

◆ add_flow_uses()

void com.cliffc.aa.GVNGCM.add_flow_uses ( Node  n)

Definition at line 55 of file GVNGCM.java.

References com.cliffc.aa.GVNGCM._work_flow, and com.cliffc.aa.GVNGCM.add_work_uses().

Referenced by com.cliffc.aa.node.Node.do_reduce(), com.cliffc.aa.node.StoreNode.ideal_reduce(), com.cliffc.aa.node.NewNode< TypeStruct >.kill2(), 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.GVNGCM.retype_mem(), com.cliffc.aa.GVNGCM.revalive(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.node.CallNode.swap_new(), com.cliffc.aa.node.NewObjNode.update(), and com.cliffc.aa.node.Node.xval().

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

◆ add_grow()

void com.cliffc.aa.GVNGCM.add_grow ( Node  n)

Definition at line 52 of file GVNGCM.java.

52 { add_work(_work_grow ,n); }

References com.cliffc.aa.GVNGCM._work_grow, and com.cliffc.aa.GVNGCM.add_work().

Referenced by com.cliffc.aa.node.MrgProjNode.add_flow_def_extra(), and com.cliffc.aa.node.PrimNode.as_fun().

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

◆ add_inline()

void com.cliffc.aa.GVNGCM.add_inline ( FunNode  n)

Definition at line 53 of file GVNGCM.java.

53 { add_work(_work_inline, n); }

References com.cliffc.aa.GVNGCM._work_inline, and com.cliffc.aa.GVNGCM.add_work().

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

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

◆ add_mono()

public<N extends Node> N com.cliffc.aa.GVNGCM.add_mono ( n)
package

Definition at line 51 of file GVNGCM.java.

51 { return add_work(_work_mono ,n); }

References com.cliffc.aa.GVNGCM._work_mono, and com.cliffc.aa.GVNGCM.add_work().

Referenced by com.cliffc.aa.node.NewObjNode.add_flow_extra(), com.cliffc.aa.node.LoadNode.add_flow_use_extra(), com.cliffc.aa.node.StoreNode.add_reduce_extra(), com.cliffc.aa.node.Node.do_mono(), com.cliffc.aa.node.MemSplitNode.insert_split(), com.cliffc.aa.node.ScopeNode.set_mem(), and com.cliffc.aa.node.FunNode.split_callers().

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

◆ add_reduce()

public<N extends Node> N com.cliffc.aa.GVNGCM.add_reduce ( n)
package

Definition at line 49 of file GVNGCM.java.

49 { return add_work(_work_reduce,n); }

References com.cliffc.aa.GVNGCM._work_reduce, and com.cliffc.aa.GVNGCM.add_work().

Referenced by com.cliffc.aa.Parse._args(), com.cliffc.aa.node.MrgProjNode.add_flow_def_extra(), com.cliffc.aa.node.RegionNode.add_flow_def_extra(), com.cliffc.aa.node.NewNode< TypeStruct >.add_flow_def_extra(), com.cliffc.aa.node.FreshNode.add_flow_extra(), com.cliffc.aa.node.StoreNode.add_flow_extra(), com.cliffc.aa.node.CallNode.add_flow_extra(), com.cliffc.aa.node.AssertNode.add_flow_use_extra(), com.cliffc.aa.node.FunPtrNode.add_flow_use_extra(), com.cliffc.aa.node.RegionNode.add_flow_use_extra(), com.cliffc.aa.node.LoadNode.add_flow_use_extra(), com.cliffc.aa.node.CallNode.add_flow_use_extra(), com.cliffc.aa.node.StoreNode.add_reduce_extra(), com.cliffc.aa.node.CallNode.add_reduce_extra(), com.cliffc.aa.GVNGCM.add_unuse(), com.cliffc.aa.node.Node.do_flow(), com.cliffc.aa.node.Node.do_grow(), com.cliffc.aa.node.Node.do_mono(), com.cliffc.aa.node.Node.do_reduce(), com.cliffc.aa.node.RegionNode.ideal_reduce(), com.cliffc.aa.node.CallNode.ideal_reduce(), com.cliffc.aa.Parse.ifex(), com.cliffc.aa.GVNGCM.init(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.Parse.term(), com.cliffc.aa.node.Node.unelock(), com.cliffc.aa.tvar.TV2.union(), and com.cliffc.aa.node.CallEpiNode.unwire().

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

◆ add_reduce_uses()

void com.cliffc.aa.GVNGCM.add_reduce_uses ( Node  n)

Definition at line 57 of file GVNGCM.java.

References com.cliffc.aa.GVNGCM._work_reduce, and com.cliffc.aa.GVNGCM.add_work_uses().

Referenced by com.cliffc.aa.node.FunNode.ideal_reduce(), com.cliffc.aa.node.FunPtrNode.merge_ref_def(), com.cliffc.aa.node.CallEpiNode.set_is_copy(), and com.cliffc.aa.node.FunNode.set_is_copy().

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

◆ add_unuse()

Node com.cliffc.aa.GVNGCM.add_unuse ( Node  n)

Definition at line 59 of file GVNGCM.java.

59  {
60  if( n._uses._len==0 && n._keep==0 ) { add_dead(n); return n; } // might be dead
61  return add_reduce(add_flow(n));
62  }

References com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._uses, com.cliffc.aa.GVNGCM.add_dead(), com.cliffc.aa.GVNGCM.add_flow(), and com.cliffc.aa.GVNGCM.add_reduce().

Referenced by com.cliffc.aa.node.CallNode._ideal_grow(), com.cliffc.aa.GVNGCM.Build< N extends Node >.close(), com.cliffc.aa.node.FunNode.split_callers(), com.cliffc.aa.node.RetNode.tail_recursive(), and com.cliffc.aa.node.Node.unuse().

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

◆ add_work()

static public<N extends Node> N com.cliffc.aa.GVNGCM.add_work ( Work  work,
n 
)
staticpackage

Definition at line 43 of file GVNGCM.java.

43  {
44  if( n==null || n.is_dead() ) return n;
45  if( !HAS_WORK ) HAS_WORK = true; // Filtered set
46  return work.add(n);
47  }

References com.cliffc.aa.node.Work.add(), and com.cliffc.aa.GVNGCM.HAS_WORK.

Referenced by com.cliffc.aa.GVNGCM.add_dead(), com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.GVNGCM.add_grow(), com.cliffc.aa.GVNGCM.add_inline(), com.cliffc.aa.GVNGCM.add_mono(), com.cliffc.aa.GVNGCM.add_reduce(), com.cliffc.aa.GVNGCM.add_work_all(), com.cliffc.aa.GVNGCM.add_work_defs(), and com.cliffc.aa.GVNGCM.add_work_uses().

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

◆ add_work_all()

Node com.cliffc.aa.GVNGCM.add_work_all ( Node  n)

Definition at line 73 of file GVNGCM.java.

73  {
74  if( n.is_dead() ) return n;
75  if( !HAS_WORK ) HAS_WORK = true; // Filtered set
76  for( Work work : _new_works ) work.add(n);
77  if( n instanceof FunNode )
79  return n;
80  }

References com.cliffc.aa.GVNGCM._new_works, com.cliffc.aa.GVNGCM._work_inline, com.cliffc.aa.GVNGCM.add_work(), com.cliffc.aa.GVNGCM.HAS_WORK, and com.cliffc.aa.node.Node.is_dead().

Referenced by com.cliffc.aa.node.CallNode.add_flow_use_extra(), com.cliffc.aa.Env.close_display(), com.cliffc.aa.node.Node.copy(), com.cliffc.aa.Parse.do_call0(), com.cliffc.aa.node.LoadNode.ideal_grow(), com.cliffc.aa.Parse.ifex(), com.cliffc.aa.node.Node.init1(), com.cliffc.aa.node.MemSplitNode.insert_split(), com.cliffc.aa.node.ScopeNode.set_mem(), com.cliffc.aa.node.Node.unhook(), com.cliffc.aa.node.Node.walk_opt(), and com.cliffc.aa.GVNGCM.xform().

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

◆ add_work_defs()

static void com.cliffc.aa.GVNGCM.add_work_defs ( Work  work,
Node  n 
)
static

Definition at line 63 of file GVNGCM.java.

63  {
64  for( Node def : n._defs )
65  if( def != null && def != n )
66  add_work(work,def);
67  }

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

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

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

◆ add_work_uses()

static void com.cliffc.aa.GVNGCM.add_work_uses ( Work  work,
Node  n 
)
static

Definition at line 68 of file GVNGCM.java.

68  {
69  for( Node use : n._uses )
70  if( use != n )
71  add_work(work,use);
72  }

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

Referenced by com.cliffc.aa.GVNGCM.add_flow_uses(), and com.cliffc.aa.GVNGCM.add_reduce_uses().

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

◆ check_and_wire()

void com.cliffc.aa.GVNGCM.check_and_wire ( CallEpiNode  cepi)
private

Definition at line 311 of file GVNGCM.java.

311  {
312  if( !cepi.check_and_wire() ) return;
313  assert Env.START.more_flow(false)==0;
314  }

References com.cliffc.aa.node.CallEpiNode.check_and_wire(), com.cliffc.aa.node.Node.more_flow(), and com.cliffc.aa.Env.START.

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

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

◆ check_not_monotonic()

boolean com.cliffc.aa.GVNGCM.check_not_monotonic ( Node  n,
Type  ot,
Type  nt 
)
private

Definition at line 317 of file GVNGCM.java.

317  {
318  assert nt==nt.simple_ptr() || n instanceof ConTypeNode; // Only simple pointers in node types
319  if( ot.isa(nt) ) return false; // No bug
320  _work_flow.del(n); // Might be back on the lift
321  add_flow(n); // Setup for a re-run
322  System.out.println("Not monotonic");
323  return true; // Just single-step forward in debugging to re-run n.value
324  }

References com.cliffc.aa.GVNGCM._work_flow, com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.node.Work.del(), com.cliffc.aa.type.Type< T extends Type< T >.isa(), and com.cliffc.aa.type.Type< T extends Type< T >.simple_ptr().

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

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

◆ gcp()

void com.cliffc.aa.GVNGCM.gcp ( Mode  mode,
ScopeNode  rez 
)

Definition at line 217 of file GVNGCM.java.

217  {
218  _opt_mode = mode;
219  // Set all values to ALL and lives to DEAD, their most optimistic types.
220  VBitSet visit = new VBitSet();
221  Env.START.walk_initype(this,visit);
222  assert Env.START.more_flow(false)==0; // Initial conditions are correct
223  // Collect unresolved calls, and verify they get resolved.
224  Ary<CallNode> ambi_calls = new Ary<>(new CallNode[1],0);
225 
226  // Repeat, if we remove some ambiguous choices, and keep falling until the
227  // graph stabilizes without ambiguity.
228  while( !_work_flow.isEmpty() ) {
229  // Analysis phase.
230  // Work down list until all reachable nodes types quit falling
231  Node n;
232  while( (n=_work_flow.pop()) != null ) {
233  if( n.is_dead() ) continue; // Can be dead functions after removing ambiguous calls
234 
235  // Forwards flow
236  Type oval = n._val; // Old local type
237  Type nval = n.value(_opt_mode); // New type
238  if( oval != nval ) { // Progress
239  if( check_not_monotonic(n, oval, nval) ) continue; // Debugging hook
240  n._val = nval; // Record progress
241  for( Node use : n._uses ) // Classic forwards flow on change
242  add_flow(use).add_flow_use_extra(n);
243  n.add_flow_extra(oval);
244  if( n instanceof CallEpiNode ) check_and_wire((CallEpiNode)n);
245  for( Node use : n._uses )
246  if( use instanceof CallEpiNode ) check_and_wire((CallEpiNode)use);
247  // All liveness is skipped if may_be_con, since the possible constant
248  // has no inputs.
249  assert oval.may_be_con() || !nval.may_be_con(); // May_be_con is monotonic
250  if( oval.may_be_con() && !nval.may_be_con() )
251  add_flow_defs(n); // Now check liveness
252  }
253 
254  // Reverse flow
255  TypeMem oliv = n._live;
256  TypeMem nliv = n.live(_opt_mode);
257  if( oliv != nliv ) { // Liveness progress
258  if( check_not_monotonic(n, oliv, nliv) ) continue; // Debugging hook
259  n._live = nliv; // Record progress
260  n.add_flow_extra(nliv);
261  for( Node def : n._defs ) // Classic reverse flow on change
262  if( def!=null ) add_flow(def).add_flow_def_extra(n);
263  }
264  // See if we can resolve an unresolved
265  if( n instanceof CallNode && n._live != TypeMem.DEAD ) {
266  CallNode call = (CallNode)n;
267  if( call.ctl()._val == Type.CTRL && call._val instanceof TypeTuple ) { // Wait until the Call is reachable
268  // Track ambiguous calls: resolve after GCP gets stable, and if we
269  // can resolve we continue to let GCP fall.
270  BitsFun fidxs = CallNode.ttfp(call._val).fidxs();
271  if( fidxs.above_center() && fidxs.abit() == -1 && ambi_calls.find(call) == -1 )
272  ambi_calls.add(call);
273  }
274  }
275  // Very expensive assert
276  //assert Env.START.more_flow(false)==0; // Initial conditions are correct
277  }
278 
279  // Remove CallNode ambiguity after worklist runs dry. This makes a
280  // 'least_cost' choice on unresolved Calls, and lowers them in the
281  // lattice... allowing more GCP progress.
282  while( !ambi_calls.isEmpty() )
283  remove_ambi(ambi_calls.pop());
284  }
285 
286  assert Env.START.more_flow(false)==0; // Final conditions are correct
287  visit.clear();
288  Env.START.walk_opt(visit);
289  }

References com.cliffc.aa.node.Node._defs, 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._work_flow, com.cliffc.aa.type.Bits< B extends Bits< B >.abit(), com.cliffc.aa.type.Bits< B extends Bits< B >.above_center(), com.cliffc.aa.util.Ary< E >.add(), 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.check_and_wire(), com.cliffc.aa.GVNGCM.check_not_monotonic(), com.cliffc.aa.node.CallNode.ctl(), com.cliffc.aa.type.Type< T extends Type< T >.CTRL, com.cliffc.aa.type.TypeMem.DEAD, com.cliffc.aa.type.TypeFunPtr.fidxs(), com.cliffc.aa.util.Ary< E >.find(), com.cliffc.aa.node.Node.is_dead(), com.cliffc.aa.util.Ary< E >.isEmpty(), com.cliffc.aa.node.Work.isEmpty(), com.cliffc.aa.node.Node.live(), com.cliffc.aa.type.Type< T extends Type< T >.may_be_con(), com.cliffc.aa.node.Node.more_flow(), com.cliffc.aa.node.Work.pop(), com.cliffc.aa.util.Ary< E >.pop(), com.cliffc.aa.GVNGCM.remove_ambi(), com.cliffc.aa.Env.START, com.cliffc.aa.node.CallNode.ttfp(), com.cliffc.aa.node.Node.value(), com.cliffc.aa.node.Node.walk_initype(), and com.cliffc.aa.node.Node.walk_opt().

Referenced by com.cliffc.aa.Parse.go(), and com.cliffc.aa.node.TestNodeSmall.testRecursiveDisplay().

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

◆ init()

public<N extends Node> N com.cliffc.aa.GVNGCM.init ( n)
package

Definition at line 99 of file GVNGCM.java.

99 { return add_flow(add_reduce(n.keep(2))); }

References com.cliffc.aa.GVNGCM.add_flow(), and com.cliffc.aa.GVNGCM.add_reduce().

Referenced by com.cliffc.aa.node.TestNodeSmall.check(), com.cliffc.aa.node.FunPtrNode.forward_ref(), com.cliffc.aa.node.ScopeNode.init(), com.cliffc.aa.Parse.init(), com.cliffc.aa.node.MemSplitNode.insert_split(), com.cliffc.aa.node.TestNodeSmall.testCallNodeResolve(), com.cliffc.aa.node.TestNodeSmall.testCallNodeResolve2(), com.cliffc.aa.node.TestNodeSmall.testRecursiveDisplay(), and com.cliffc.aa.Env.top_scope().

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

◆ init0()

void com.cliffc.aa.GVNGCM.init0 ( )
package

Definition at line 83 of file GVNGCM.java.

83  {
84  for( Work work : _all_works ) assert work.isEmpty();
85  }

References com.cliffc.aa.GVNGCM._all_works.

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

Here is the caller graph for this function:

◆ iter() [1/2]

void com.cliffc.aa.GVNGCM.iter ( Mode  opt_mode)

Definition at line 147 of file GVNGCM.java.

147  {
148  _opt_mode = opt_mode;
149  boolean progress=true;
150  while( progress ) {
151  progress = false;
152  iter(null,_all_works);
153  // Only a very few nodes can make progress via dominance relations, and
154  // these can make progress "very far" in the graph. So instead of using
155  // a neighbors list, we bulk revisit them here.
156  for( int i=0; i<_work_dom.len(); i++ ) {
157  Node dom = _work_dom.at(i);
158  if( dom.is_dead() ) _work_dom.del(i--);
159  else progress |= _work_dom.apply(dom)!=null;
160  }
161  }
162  IDEAL_VISIT.clear();
163  // Expensive assert
164  assert !Env.START.more_ideal(IDEAL_VISIT);
165  }

References com.cliffc.aa.GVNGCM._all_works, com.cliffc.aa.GVNGCM._opt_mode, com.cliffc.aa.GVNGCM._work_dom, com.cliffc.aa.node.Work.apply(), com.cliffc.aa.node.Work.at(), com.cliffc.aa.node.Work.del(), com.cliffc.aa.GVNGCM.IDEAL_VISIT, com.cliffc.aa.node.Node.is_dead(), com.cliffc.aa.node.Work.len(), com.cliffc.aa.node.Node.more_ideal(), and com.cliffc.aa.Env.START.

Referenced by com.cliffc.aa.Env.close(), com.cliffc.aa.Parse.go(), com.cliffc.aa.node.FunPtrNode.merge_ref_def(), com.cliffc.aa.Env.top_scope(), and com.cliffc.aa.GVNGCM.xform().

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

◆ iter() [2/2]

Node com.cliffc.aa.GVNGCM.iter ( Node  x,
Work[]  works 
)

Definition at line 172 of file GVNGCM.java.

172  {
173  if( !HAS_WORK ) return x;
174  if( x!=null ) x.keep();
175  while( true ) {
176  Work W=null;
177  for( Work work : works )
178  if( !(W = work).isEmpty() )
179  break;
180  if( W.isEmpty() ) break; // All worklists empty
181  Node n = W.pop();
182  Node m = n.is_dead() ? null : W.apply(n);
183  if( m == null ) { // not-null is progress
184  ITER_CNT_NOOP++; // No progress
185  } else {
186  // VERY EXPENSIVE ASSERT
187  //assert W==_work_dead || Env.START.more_flow(true)==0; // Initial conditions are correct
188  ITER_CNT++; assert ITER_CNT < 35000; // Catch infinite ideal-loops
189  if( x==n ) x=m; // Keep track of the replacement for x, if any
190  }
191  }
192  HAS_WORK=false;
193  Node.roll_back_CNT(); // Can reclaim node numbers
194  if( x==null ) return null; // No special node to track
195  return x.unkeep();
196  }

References com.cliffc.aa.node.Work.apply(), com.cliffc.aa.GVNGCM.HAS_WORK, com.cliffc.aa.node.Node.is_dead(), com.cliffc.aa.node.Work.isEmpty(), com.cliffc.aa.GVNGCM.ITER_CNT, com.cliffc.aa.GVNGCM.ITER_CNT_NOOP, com.cliffc.aa.node.Node.keep(), com.cliffc.aa.node.Work.pop(), com.cliffc.aa.node.Node.roll_back_CNT(), and com.cliffc.aa.node.Node.unkeep().

Here is the call graph for this function:

◆ on_dead()

boolean com.cliffc.aa.GVNGCM.on_dead ( Node  n)

Definition at line 39 of file GVNGCM.java.

39 { return _work_dead .on(n); }

References com.cliffc.aa.GVNGCM._work_dead, and com.cliffc.aa.node.Work.on().

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

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

◆ on_flow()

boolean com.cliffc.aa.GVNGCM.on_flow ( Node  n)

Definition at line 40 of file GVNGCM.java.

40 { return _work_flow .on(n); }

References com.cliffc.aa.GVNGCM._work_flow, and com.cliffc.aa.node.Work.on().

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

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

◆ on_reduce()

boolean com.cliffc.aa.GVNGCM.on_reduce ( Node  n)

Definition at line 41 of file GVNGCM.java.

41 { return _work_reduce.on(n); }

References com.cliffc.aa.GVNGCM._work_reduce, and com.cliffc.aa.node.Work.on().

Here is the call graph for this function:

◆ remove_ambi()

void com.cliffc.aa.GVNGCM.remove_ambi ( CallNode  call)
private

Definition at line 291 of file GVNGCM.java.

291  {
292  TypeFunPtr tfp = CallNode.ttfpx(call._val);
293  FunPtrNode fptr = null;
294  BitsFun fidxs = tfp.fidxs();
295  if( !fidxs.above_center() ) return; // Resolved after all
296  if( fidxs!=BitsFun.ANY ) { // And have choices
297  // Pick least-cost among choices
298  fptr = call.least_cost(fidxs,call.fdx());
299  if( fptr==null ) { // Not resolving, program is in-error
300  call._not_resolved_by_gcp = true; // will drop fdx in lattice
301  add_flow(call);
302  return;
303  }
304  }
305  call.set_dsp(fptr.display());
306  call.set_fdx(fptr); // Set resolved edge
307  add_flow(call);
308  assert Env.START.more_flow(false)==0; // Post conditions are correct
309  }

References com.cliffc.aa.node.CallNode._not_resolved_by_gcp, com.cliffc.aa.node.Node._val, com.cliffc.aa.type.Bits< B extends Bits< B >.above_center(), com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.type.BitsFun.ANY, com.cliffc.aa.node.FunPtrNode.display(), com.cliffc.aa.node.CallNode.fdx(), com.cliffc.aa.type.TypeFunPtr.fidxs(), com.cliffc.aa.node.CallNode.least_cost(), com.cliffc.aa.node.Node.more_flow(), com.cliffc.aa.node.CallNode.set_dsp(), com.cliffc.aa.node.CallNode.set_fdx(), com.cliffc.aa.Env.START, and com.cliffc.aa.node.CallNode.ttfpx().

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

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

◆ reset_to_init0()

void com.cliffc.aa.GVNGCM.reset_to_init0 ( )
package

Definition at line 89 of file GVNGCM.java.

89  {
90  for( Work work : _all_works ) work.clear();
91  _work_dom.clear();
92  _opt_mode = Mode.Parse;
93  ITER_CNT = ITER_CNT_NOOP = 0;
94  }

References com.cliffc.aa.GVNGCM._all_works, com.cliffc.aa.GVNGCM._opt_mode, com.cliffc.aa.GVNGCM._work_dom, com.cliffc.aa.node.Work.clear(), com.cliffc.aa.GVNGCM.ITER_CNT, com.cliffc.aa.GVNGCM.ITER_CNT_NOOP, and com.cliffc.aa.GVNGCM.Mode.Parse.

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

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

◆ retype_mem()

static void com.cliffc.aa.GVNGCM.retype_mem ( BitSet  aliases,
Node  mem,
Node  exit,
boolean  skip_calls 
)
static

Definition at line 330 of file GVNGCM.java.

330  {
331  Ary<Node> work = new Ary<>(new Node[1],0);
332  work.push(mem);
333  // Update all memory ops
334  while( !work.isEmpty() ) {
335  Node wrk = work.pop();
336  if( !wrk.is_mem() && wrk!=mem ) continue; // Not a memory Node?
337  Type twrk = wrk._val;
338  Type tmem0 = twrk instanceof TypeTuple ? ((TypeTuple)twrk).at(1) : twrk;
339  if( !(tmem0 instanceof TypeMem) ) continue; // Node does have have a memory type?
340  if( aliases!=null && !((TypeMem)tmem0).has_used(aliases) ) continue; // Not does not use the listed memory?
341  if( wrk instanceof CallNode ) { // Do the CEPI for a Call, skipping in-between
342  CallEpiNode cepi = ((CallNode)wrk).cepi();
343  if( cepi != null ) work.push(cepi);
344  }
345  Type tval = wrk.value(Env.GVN._opt_mode); // Recompute memory value
346  if( twrk == tval ) continue; // No change
347  wrk._val = tval; // Progress!!!
348  Env.GVN.add_flow_uses(wrk); // Forwards flow the update
349  if( wrk==exit ) continue; // Stop at end
350  if( skip_calls && wrk instanceof MProjNode && wrk.in(0) instanceof CallNode )
351  continue; // Skip the inside of calls
352  work.addAll(wrk._uses);
353  }
354  }

References com.cliffc.aa.GVNGCM._opt_mode, com.cliffc.aa.node.Node._uses, com.cliffc.aa.node.Node._val, com.cliffc.aa.GVNGCM.add_flow_uses(), com.cliffc.aa.util.Ary< E >.addAll(), com.cliffc.aa.type.TypeTuple.at(), com.cliffc.aa.Env.GVN, com.cliffc.aa.node.Node.in(), com.cliffc.aa.node.Node.is_mem(), com.cliffc.aa.util.Ary< E >.isEmpty(), com.cliffc.aa.util.Ary< E >.pop(), com.cliffc.aa.util.Ary< E >.push(), and com.cliffc.aa.node.Node.value().

Referenced by com.cliffc.aa.node.MemJoinNode.ideal_reduce(), 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:

◆ revalive()

void com.cliffc.aa.GVNGCM.revalive ( Node...  ns)

Definition at line 103 of file GVNGCM.java.

103  {
104  for( Node n : ns ) {
105  if( n == null ) continue;
106  Type t = n.value(_opt_mode);
107  if( t != n._val ) {
108  n._val = t;
109  add_flow_uses(n);
110  }
111  }
112  for( int i=ns.length-1; i>=0; i-- ) {
113  Node n = ns[i];
114  if( n==null ) continue;
115  TypeMem t = n.live(_opt_mode);
116  if( t != n._live ) {
117  n._live=t;
118  add_flow_defs(n);
119  }
120  }
121  }

References com.cliffc.aa.node.Node._live, com.cliffc.aa.GVNGCM._opt_mode, com.cliffc.aa.GVNGCM.add_flow_defs(), com.cliffc.aa.GVNGCM.add_flow_uses(), and com.cliffc.aa.node.Node.live().

Referenced by com.cliffc.aa.node.MemSplitNode.insert_split(), com.cliffc.aa.node.NewNode< TypeStruct >.kill2(), and com.cliffc.aa.node.CallNode.swap_new().

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

◆ xform()

Node com.cliffc.aa.GVNGCM.xform ( Node  n)

Definition at line 126 of file GVNGCM.java.

126  {
127  assert n._uses._len==0 && n._keep==0; // New to GVN
129  assert !x.is_dead();
130  return add_flow(x); // No liveness (yet), since uses not known
131  }

References com.cliffc.aa.GVNGCM._all_works, com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._uses, com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.GVNGCM.add_work_all(), com.cliffc.aa.node.Node.is_dead(), and com.cliffc.aa.GVNGCM.iter().

Referenced by com.cliffc.aa.node.ScopeNode.IfScope.check(), com.cliffc.aa.node.TestNodeSmall.check(), com.cliffc.aa.node.UnresolvedNode.filter(), com.cliffc.aa.Parse.gvn(), com.cliffc.aa.Env.init(), com.cliffc.aa.Env.lookup_filter_fresh(), com.cliffc.aa.node.ScopeNode.replace_mem(), com.cliffc.aa.node.TestNodeSmall.testCallNodeResolve(), com.cliffc.aa.node.TestNodeSmall.testCallNodeResolve2(), com.cliffc.aa.node.TestNodeSmall.testRecursiveDisplay(), com.cliffc.aa.node.TestNodeSmall.testUnresolvedAdd(), and com.cliffc.aa.Env.top_scope().

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

◆ xreduce()

Node com.cliffc.aa.GVNGCM.xreduce ( Node  n)

Definition at line 135 of file GVNGCM.java.

135  {
136  assert n._uses._len==0 && n._keep==0; // New to GVN
137  n.do_flow(); // Compute _val (for finding constants)
138  Node x = n.do_reduce(); // Maybe find a more ideal Node
139  if( x==null ) x=n; // Ignore lack-of-progress
140  return add_flow(x); // No liveness (yet), since uses not known
141  }

References com.cliffc.aa.node.Node._keep, com.cliffc.aa.node.Node._uses, com.cliffc.aa.GVNGCM.add_flow(), com.cliffc.aa.node.Node.do_flow(), and com.cliffc.aa.node.Node.do_reduce().

Referenced by com.cliffc.aa.node.IfNode.flip(), and com.cliffc.aa.node.IfNode.ideal_reduce().

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

Member Data Documentation

◆ _all_works

◆ _new_works

final Work [] com.cliffc.aa.GVNGCM._new_works = new Work[]{ _work_flow,_work_reduce,_work_mono,_work_grow }
private

Definition at line 33 of file GVNGCM.java.

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

◆ _opt_mode

◆ _reduce_works

final Work [] com.cliffc.aa.GVNGCM._reduce_works = new Work[]{_work_dead,_work_flow,_work_reduce }

Definition at line 35 of file GVNGCM.java.

◆ _work_dead

final Work com.cliffc.aa.GVNGCM._work_dead = new Work("dead" , false) { @Override public Node apply(Node n) { return n._keep==0 && n._uses._len == 0 ? n.kill() : null; } }
private

Definition at line 25 of file GVNGCM.java.

Referenced by com.cliffc.aa.GVNGCM.add_dead(), and com.cliffc.aa.GVNGCM.on_dead().

◆ _work_dom

final Work com.cliffc.aa.GVNGCM._work_dom = new Work("dom" , false) { @Override public Node apply(Node n) { return n.do_mono (); } }

◆ _work_flow

final Work com.cliffc.aa.GVNGCM._work_flow = new Work("flow" , false) { @Override public Node apply(Node n) { return n.do_flow (); } }
private

◆ _work_grow

final Work com.cliffc.aa.GVNGCM._work_grow = new Work("grow" , true ) { @Override public Node apply(Node n) { return n.do_grow (); } }
private

Definition at line 29 of file GVNGCM.java.

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

◆ _work_inline

final Work com.cliffc.aa.GVNGCM._work_inline = new Work("inline", false) { @Override public Node apply(Node n) { return ((FunNode)n).ideal_inline(false); } }
private

◆ _work_mono

final Work com.cliffc.aa.GVNGCM._work_mono = new Work("mono" , true ) { @Override public Node apply(Node n) { return n.do_mono (); } }
private

Definition at line 28 of file GVNGCM.java.

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

◆ _work_reduce

final Work com.cliffc.aa.GVNGCM._work_reduce = new Work("reduce", true ) { @Override public Node apply(Node n) { return n.do_reduce(); } }
private

◆ HAS_WORK

boolean com.cliffc.aa.GVNGCM.HAS_WORK
staticprivate

◆ IDEAL_VISIT

final VBitSet com.cliffc.aa.GVNGCM.IDEAL_VISIT = new VBitSet()
staticprivate

Definition at line 146 of file GVNGCM.java.

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

◆ ITER_CNT

int com.cliffc.aa.GVNGCM.ITER_CNT
staticpackage

Definition at line 170 of file GVNGCM.java.

Referenced by com.cliffc.aa.GVNGCM.iter(), and com.cliffc.aa.GVNGCM.reset_to_init0().

◆ ITER_CNT_NOOP

int com.cliffc.aa.GVNGCM.ITER_CNT_NOOP
staticpackage

Definition at line 171 of file GVNGCM.java.

Referenced by com.cliffc.aa.GVNGCM.iter(), and com.cliffc.aa.GVNGCM.reset_to_init0().


The documentation for this class was generated from the following file:
com.cliffc.aa.node.Node.roll_back_CNT
static void roll_back_CNT()
Definition: Node.java:222
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.GVNGCM.ITER_CNT
static int ITER_CNT
Definition: GVNGCM.java:170
com.cliffc.aa.util.Ary.push
E push(E e)
Add element in amortized constant time.
Definition: Ary.java:58
com.cliffc.aa.util.Ary.isEmpty
boolean isEmpty()
Definition: Ary.java:20
com.cliffc.aa.type.Type.isa
boolean isa(Type t)
Definition: Type.java:623
com.cliffc.aa.node.Node.live
TypeMem live(GVNGCM.Mode opt_mode)
Definition: Node.java:478
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.node.Work
Definition: Work.java:8
com.cliffc.aa.GVNGCM._work_reduce
final Work _work_reduce
Definition: GVNGCM.java:26
com.cliffc.aa.node.Node._live
TypeMem _live
Definition: Node.java:89
com.cliffc.aa.GVNGCM.add_flow_uses
void add_flow_uses(Node n)
Definition: GVNGCM.java:55
com.cliffc.aa.util.Ary.pop
E pop()
Definition: Ary.java:41
com.cliffc.aa.node.Work.del
void del(int i)
Definition: Work.java:28
com.cliffc.aa.util.Ary.addAll
Ary< E > addAll(Collection<? extends E > c)
Definition: Ary.java:151
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.GVNGCM._work_inline
final Work _work_inline
Definition: GVNGCM.java:30
com.cliffc.aa.node.Node.do_flow
Node do_flow()
Definition: Node.java:592
com.cliffc.aa.node.Work.on
boolean on(Node n)
Definition: Work.java:36
com.cliffc.aa.GVNGCM.add_work_all
Node add_work_all(Node n)
Definition: GVNGCM.java:73
com.cliffc.aa.node.Node.more_ideal
final boolean more_ideal(VBitSet bs)
Definition: Node.java:722
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.GVNGCM.check_not_monotonic
boolean check_not_monotonic(Node n, Type ot, Type nt)
Definition: GVNGCM.java:317
com.cliffc.aa.util.Ary
Definition: Ary.java:11
com.cliffc.aa.type.TypeTuple
Definition: TypeTuple.java:11
com.cliffc.aa.node.Node.keep
public< N extends Node > N keep()
Definition: Node.java:228
com.cliffc.aa.GVNGCM._work_grow
final Work _work_grow
Definition: GVNGCM.java:29
com.cliffc.aa.node.CallNode.ttfpx
static TypeFunPtr ttfpx(Type tcall)
Definition: CallNode.java:162
com.cliffc.aa.type.TypeFunPtr.fidxs
BitsFun fidxs()
Definition: TypeFunPtr.java:127
com.cliffc.aa.node.Node._val
Type _val
Definition: Node.java:88
com.cliffc.aa.GVNGCM.check_and_wire
void check_and_wire(CallEpiNode cepi)
Definition: GVNGCM.java:311
com.cliffc.aa.GVNGCM._work_dead
final Work _work_dead
Definition: GVNGCM.java:25
com.cliffc.aa.node.FunPtrNode
Definition: FunPtrNode.java:40
com.cliffc.aa.node.CallEpiNode.check_and_wire
boolean check_and_wire()
Definition: CallEpiNode.java:179
com.cliffc.aa.GVNGCM.add_work_defs
static void add_work_defs(Work work, Node n)
Definition: GVNGCM.java:63
com.cliffc.aa.node.CallNode
Definition: CallNode.java:86
com.cliffc.aa.node.MProjNode
Definition: MProjNode.java:10
com.cliffc.aa.GVNGCM.add_work_uses
static void add_work_uses(Work work, Node n)
Definition: GVNGCM.java:68
com.cliffc.aa.Env.START
static StartNode START
Definition: Env.java:14
com.cliffc.aa.GVNGCM._work_flow
final Work _work_flow
Definition: GVNGCM.java:27
com.cliffc.aa.GVNGCM.add_work
static public< N extends Node > N add_work(Work work, N n)
Definition: GVNGCM.java:43
com.cliffc.aa.GVNGCM._all_works
final Work[] _all_works
Definition: GVNGCM.java:37
com.cliffc.aa.type.Bits.above_center
boolean above_center()
Definition: Bits.java:204
com.cliffc.aa.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.GVNGCM._new_works
final Work[] _new_works
Definition: GVNGCM.java:33
com.cliffc.aa.node.Node.unkeep
public< N extends Node > N unkeep()
Definition: Node.java:232
com.cliffc.aa.util.Ary.add
Ary< E > add(E e)
Add element in amortized constant time.
Definition: Ary.java:49
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.GVNGCM._work_mono
final Work _work_mono
Definition: GVNGCM.java:28
com.cliffc.aa.node.CallNode._not_resolved_by_gcp
boolean _not_resolved_by_gcp
Definition: CallNode.java:90
com.cliffc.aa.node.Node._keep
byte _keep
Definition: Node.java:86
com.cliffc.aa.node.Work.apply
abstract Node apply(Node n)
com.cliffc.aa.GVNGCM.HAS_WORK
static boolean HAS_WORK
Definition: GVNGCM.java:38
com.cliffc.aa.type.Type.CTRL
static final Type CTRL
Definition: Type.java:326
com.cliffc.aa.node.Node.in
Node in(int i)
Definition: Node.java:126
com.cliffc.aa.node.Work.clear
void clear()
Definition: Work.java:37
com.cliffc.aa.type.Type.may_be_con
boolean may_be_con()
Definition: Type.java:759
com.cliffc.aa.type.Type.simple_ptr
Type simple_ptr()
Definition: Type.java:358
com.cliffc.aa.node.Node.walk_initype
final void walk_initype(GVNGCM gvn, VBitSet bs)
Definition: Node.java:691
com.cliffc.aa.util.VBitSet
Definition: VBitSet.java:5
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.GVNGCM.remove_ambi
void remove_ambi(CallNode call)
Definition: GVNGCM.java:291
com.cliffc.aa.node.CallNode.least_cost
FunPtrNode least_cost(BitsFun choices, Node unk)
Definition: CallNode.java:624
com.cliffc.aa.node.CallNode.ctl
Node ctl()
Definition: CallNode.java:118
com.cliffc.aa.node.Node._uses
Ary< Node > _uses
Definition: Node.java:245
com.cliffc.aa.node.Node.is_mem
boolean is_mem()
Definition: Node.java:838
com.cliffc.aa.node.Work.at
Node at(int i)
Definition: Work.java:27
com.cliffc.aa.node.Work.add
public< N extends Node > N add(N n)
Definition: Work.java:15
com.cliffc.aa.node.ConTypeNode
Definition: ConTypeNode.java:18
com.cliffc.aa.type.BitsFun.ANY
static final BitsFun ANY
Definition: BitsFun.java:34
com.cliffc.aa.GVNGCM.IDEAL_VISIT
static final VBitSet IDEAL_VISIT
Definition: GVNGCM.java:146
com.cliffc.aa.GVNGCM.ITER_CNT_NOOP
static int ITER_CNT_NOOP
Definition: GVNGCM.java:171
com.cliffc.aa.type.Bits.abit
int abit()
Definition: Bits.java:203
com.cliffc.aa.node.CallNode.ttfp
static TypeFunPtr ttfp(Type tcall)
Definition: CallNode.java:157
com.cliffc.aa.type.TypeTuple.at
Type at(int idx)
Definition: TypeTuple.java:182
com.cliffc.aa.GVNGCM.add_reduce
public< N extends Node > N add_reduce(N n)
Definition: GVNGCM.java:49
com.cliffc.aa.node.CallEpiNode
Definition: CallEpiNode.java:24
com.cliffc.aa.node.Work.pop
Node pop()
Definition: Work.java:21
com.cliffc.aa.GVNGCM._work_dom
final Work _work_dom
Definition: GVNGCM.java:31
com.cliffc.aa.GVNGCM.add_flow_defs
void add_flow_defs(Node n)
Definition: GVNGCM.java:54
com.cliffc.aa.node.Work.isEmpty
boolean isEmpty()
Definition: Work.java:35
com.cliffc.aa.GVNGCM._opt_mode
Mode _opt_mode
Definition: GVNGCM.java:22
com.cliffc.aa.GVNGCM.add_flow
public< N extends Node > N add_flow(N n)
Definition: GVNGCM.java:50
com.cliffc.aa.node.CallNode.set_fdx
Node set_fdx(Node fun)
Definition: CallNode.java:132
com.cliffc.aa.node.CallNode.set_dsp
Node set_dsp(Node dsp)
Definition: CallNode.java:130
com.cliffc.aa.GVNGCM.add_dead
void add_dead(Node n)
Definition: GVNGCM.java:48
com.cliffc.aa.GVNGCM.iter
void iter(Mode opt_mode)
Definition: GVNGCM.java:147
com.cliffc.aa.util.Ary.find
int find(E e)
Find the first matching element using ==, or -1 if none.
Definition: Ary.java:192
com.cliffc.aa.node.FunNode
Definition: FunNode.java:58
com.cliffc.aa.node.FunPtrNode.display
Node display()
Definition: FunPtrNode.java:63
com.cliffc.aa.node.CallNode.fdx
Node fdx()
Definition: CallNode.java:121
com.cliffc.aa.node.Node.do_reduce
Node do_reduce()
Definition: Node.java:545
com.cliffc.aa.node.Work.len
int len()
Definition: Work.java:14
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.GVNGCM.Mode.Parse
Parse
Definition: GVNGCM.java:15
com.cliffc.aa.node.Node.walk_opt
void walk_opt(VBitSet visit)
Definition: Node.java:797
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