aa
LoadNode.java
Go to the documentation of this file.
1 package com.cliffc.aa.node;
2 
3 import com.cliffc.aa.*;
4 import com.cliffc.aa.type.*;
5 import com.cliffc.aa.tvar.*;
6 import com.cliffc.aa.util.Util;
7 import org.jetbrains.annotations.NotNull;
8 
9 import static com.cliffc.aa.AA.MEM_IDX;
10 
11 // Load a named field from a struct. Does it's own nil-check testing. Loaded
12 // value depends on the struct typing.
13 public class LoadNode extends Node {
14  private final String _fld;
15  private final Parse _bad;
16 
17  public LoadNode( Node mem, Node adr, String fld, Parse bad ) {
18  super(OP_LOAD,null,mem,adr);
19  _fld = fld;
20  _bad = bad;
21  }
22  @Override public String xstr() { return "."+_fld; } // Self short name
23  String str() { return xstr(); } // Inline short name
24  Node mem() { return in(MEM_IDX); }
25  Node adr() { return in(2); }
26  private Node set_mem(Node a) { return set_def(1,a); }
27  public int find(TypeStruct ts) { return ts.fld_find(_fld); }
28 
29  // Strictly reducing optimizations
30  @Override public Node ideal_reduce() {
31  Node adr = adr();
32  Type tadr = adr._val;
33  BitsAlias aliases = tadr instanceof TypeMemPtr ? ((TypeMemPtr)tadr)._aliases : null;
34 
35  // If we can find an exact previous store, fold immediately to the value.
36  Node st = find_previous_store(mem(),adr(),aliases,_fld,true);
37  if( st!=null ) {
38  Node rez = st instanceof StoreNode
39  ? (( StoreNode)st).rez()
40  : ((NewObjNode)st).get(_fld);
41  return rez==this ? null : rez;
42  }
43  return null;
44  }
45 
46  // Changing edges to bypass, but typically not removing nodes nor edges
47  @Override public Node ideal_mono() {
48  Node mem = mem();
49  // Bypass unrelated Stores, but only if the Address predates the Store. If
50  // the Load address depends on the Store memory, then the Load cannot
51  // bypass the Store.
52  if( mem instanceof StoreNode ) {
53  StoreNode st2 = (StoreNode)mem;
54  if( st2.adr()==adr() && !Util.eq(st2._fld,_fld) ) // Very weak "Address must predate" test
55  return set_mem(st2.mem());
56  }
57 
58  Node adr = adr();
59  Type tadr = adr._val;
60  BitsAlias aliases = tadr instanceof TypeMemPtr ? ((TypeMemPtr)tadr)._aliases : null;
61 
62  // Load can move past a Join if all aliases align.
63  if( mem instanceof MemJoinNode && aliases != null ) {
64  Node jmem = ((MemJoinNode)mem).can_bypass(aliases);
65  if( jmem != null ) {
66  jmem.xval();
67  return set_mem(jmem);
68  }
69  }
70 
71  // Load can move out of a Call, if the function has no Parm:mem - happens
72  // for single target calls that do not (have not yet) inlined.
73  if( mem instanceof MProjNode && mem.in(0) instanceof CallNode )
74  return set_mem(((CallNode)mem.in(0)).mem());
75 
76  // Load can bypass a New or Store if the address does not depend on the New/St.
77  if( aliases != null && mem instanceof MrgProjNode ) {
78  NewNode nnn = ((MrgProjNode)mem).nnn();
79  // Bypass if aliases do not overlap
80  if( !aliases.test_recur(nnn._alias) )
81  return set_mem(mem.in(1));
82  // Also bypass if address predates the allocation. Here we just see that
83  // the address comes from the function Parm, and the New is made in the
84  // function.
85  Node adr2 = adr instanceof CastNode ? adr.in(1) : adr;
86  if( adr2 instanceof ParmNode )
87  return set_mem(mem.in(1));
88  }
89 
90  return null;
91  }
92 
93  @Override public Node ideal_grow() {
94  Node mem = mem();
95  Node adr = adr();
96  // Load from a memory Phi; split through in an effort to sharpen the memory.
97  // TODO: Only split thru function args if no unknown_callers, and must make a Parm not a Phi
98  // TODO: Hoist out of loops.
99  if( mem._op == OP_PHI && mem.in(0)._op != OP_LOOP && adr.in(0) instanceof NewNode ) {
100  Node lphi = new PhiNode(Type.SCALAR,((PhiNode)mem)._badgc,mem.in(0));
101  for( int i=1; i<mem._defs._len; i++ )
103  return lphi;
104  }
105 
106  return null;
107  }
108 
109  // Find a matching prior Store or NewObj - matching field name and address.
110  // Returns null if highest available memory does not match name & address.
111  static Node find_previous_store(Node mem, Node adr, BitsAlias aliases, String fld, boolean is_load ) {
112  Type tmem = mem._val;
113  if( !(tmem instanceof TypeMem) || aliases==null ) return null;
114  // Walk up the memory chain looking for an exact matching Store or New
115  int cnt=0;
116  while(true) {
117  cnt++; assert cnt < 100; // Infinite loop?
118  if( mem instanceof StoreNode ) {
119  StoreNode st = (StoreNode)mem;
120  if( Util.eq(st._fld,fld) ) {
121  if( st.adr()==adr ) return st.err(true)== null ? st : null; // Exact matching store
122  // Matching field, wrong address. Look for no-overlap in aliases
123  Type tst = st.adr()._val;
124  if( !(tst instanceof TypeMemPtr) ) return null; // Store has weird address
125  BitsAlias st_alias = ((TypeMemPtr)tst)._aliases;
126  if( aliases.join(st_alias) != BitsAlias.EMPTY )
127  return null; // Aliases not disjoint, might overlap but wrong address
128  } // Wrong field name, cannot match
129  if( mem == st.mem() ) return null;
130  mem = st.mem(); // Advance past
131 
132  } else if( mem instanceof MemPrimNode.LValueWrite ) {
133  // Array stores and field loads never alias
134  mem = ((MemPrimNode)mem).mem();
135 
136  } else if( mem instanceof MProjNode ) {
137  Node mem0 = mem.in(0);
138  if( mem0 instanceof CallEpiNode ) { // Bypass an entire function call
139  if( ((CallEpiNode)mem0)._is_copy ) return null;
140  Type tmem0 = mem._val;
141  Type tmem1 = ((CallEpiNode)mem0).call().mem()._val;
142  if( !(tmem0 instanceof TypeMem) || !(tmem1 instanceof TypeMem) ) return null;
143  mem = _find_previous_store_call(aliases,(TypeMem)tmem0,(TypeMem)tmem1,(CallEpiNode)mem0,fld,is_load);
144  if( mem==null ) return null;
145  } else if( mem0 instanceof MemSplitNode ) { // Lifting out of a split/join region
146  mem = ((MemSplitNode)mem0).mem();
147  } else if( mem0 instanceof CallNode ) { // Lifting out of a Call
148  mem = ((CallNode)mem0).mem();
149  } else {
150  throw com.cliffc.aa.AA.unimpl(); // decide cannot be equal, and advance, or maybe-equal and return null
151  }
152  } else if( mem instanceof MrgProjNode ) {
153  MrgProjNode mrg = (MrgProjNode)mem;
154  NewNode nnn = mrg.nnn();
155  if( nnn instanceof NewObjNode ) {
156  int idx = ((NewObjNode)nnn)._ts.fld_find(fld);
157  if( idx >= 0 && adr instanceof ProjNode && adr.in(0) == nnn ) return nnn; // Direct hit
158  } // wrong field name or wrong alias, cannot match
159  if( aliases.test_recur(nnn._alias) ) return null; // Overlapping, but wrong address - dunno, so must fail
160  mem = mrg.mem(); // Advance past
161  } else if( mem instanceof MemJoinNode ) {
162  Node jmem = ((MemJoinNode)mem).can_bypass(aliases);
163  if( jmem == null ) return null;
164  mem = jmem;
165 
166  } else if( mem instanceof PhiNode ||
167  mem instanceof StartMemNode ||
168  mem instanceof ConNode) {
169  return null; // Would have to match on both sides, and Phi the results
170  } else {
171  throw com.cliffc.aa.AA.unimpl(); // decide cannot be equal, and advance, or maybe-equal and return null
172  }
173  }
174  }
175 
176  // Can bypass call? Return null if cannot or call.mem if can.
177  static private Node _find_previous_store_call( BitsAlias aliases, TypeMem tmem0, TypeMem tmem1, CallEpiNode cepi, String fld, boolean is_load ) {
178  // TODO: Strengthen this. Global no-esc can bypass, IF during inline/clone
179  // each clone body updates both aliases everywhere.
180  if( !is_load ) return null; // For now, Store types NEVER bypass a call.
181  CallNode call = cepi.call();
182  if( !tmem0.fld_is_mod(aliases,fld) && !tmem1.fld_is_mod(aliases,fld) )
183  return call.mem(); // Loads from final memory can bypass calls. Stores cannot, store-over-final is in error.
184  TypeMemPtr escs = CallNode.tesc(call._val);
185  if( escs._aliases.join(aliases)==BitsAlias.EMPTY )
186  return call.mem(); // Load from call; if memory is made *in* the call this will fail later on an address mismatch.
187  return null; // Stuck behind call
188  }
189 
190 
191  @Override public Type value(GVNGCM.Mode opt_mode) {
192  Node adr = adr();
193  Type tadr = adr._val;
194  if( !(tadr instanceof TypeMemPtr) ) return tadr.oob();
195 
196  // Loading from TypeMem - will get a TypeObj out.
197  Node mem = mem();
198  Type tmem = mem._val, tfld; // Memory
199  if( !(tmem instanceof TypeMem) ) return tmem.oob(); // Nothing sane
200  TypeObj tobj = ((TypeMem)tmem).ld((TypeMemPtr)tadr);
201  if( tobj instanceof TypeStruct )
202  // TODO: NOT DOING THIS IN VALUE, BECAUSE NEED TO FLOW AVAIL VALUES FORWARDS ALWAYS
203  return get_fld(tobj);
204  return tobj.oob(); // No loading from e.g. Strings
205  }
206 
207  @Override public void add_flow_use_extra(Node chg) {
208  if( chg==adr() ) Env.GVN.add_flow(mem()); // Address into a Load changes, the Memory can be more alive.
209  if( chg==mem() ) Env.GVN.add_flow(mem()); // Memory value lifts to ANY, memory live lifts also.
210  if( chg==mem() ) Env.GVN.add_flow(adr()); // Memory value lifts to an alias, address is more alive
211  // Memory improves, perhaps Load can bypass Call
212  if( chg==mem() && mem().in(0) instanceof CallEpiNode ) Env.GVN.add_reduce(this);
213  // Memory becomes a MrgProj, maybe Load can bypass MrgProj
214  if( chg==mem() && chg instanceof MrgProjNode ) Env.GVN.add_mono(this);
215  }
216 
217  // The only memory required here is what is needed to support the Load
218  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) {
219  TypeMem live = _live_use(opt_mode,def);
220  return def==adr()
222  : live;
223  }
224  public TypeMem _live_use(GVNGCM.Mode opt_mode, Node def ) {
225  Type tmem = mem()._val;
226  Type tptr = adr()._val;
227  if( !(tmem instanceof TypeMem ) ) return tmem.oob(TypeMem.ALLMEM); // Not a memory?
228  if( !(tptr instanceof TypeMemPtr) ) return tptr.oob(TypeMem.ALLMEM); // Not a pointer?
229  if( tptr.above_center() ) return TypeMem.ANYMEM; // Loaded from nothing
230 
231  // If the load is of a constant, no memory nor address is needed
232  Type tfld = get_fld2(((TypeMem)tmem).ld((TypeMemPtr)tptr));
233  if( tfld.is_con() && err(true)==null )
234  return TypeMem.DEAD;
235 
236  if( def==adr() ) // Load is sane, so address is alive
237  return tfld.above_center() ? TypeMem.DEAD : TypeMem.ALIVE;
238 
239  // Only named the named field from the named aliases is live.
241  return ((TypeMem)tmem).remove_no_escapes(((TypeMemPtr)tptr)._aliases,_fld, ldef);
242  }
243 
244  // Load the value
245  private @NotNull Type get_fld( TypeObj tobj ) {
246  if( !(tobj instanceof TypeStruct) )
247  return tobj.oob();
248  // Struct; check for field
249  TypeStruct ts = (TypeStruct)tobj;
250  int idx = ts.fld_find(_fld); // Find the named field
251  if( idx == -1 ) return tobj.oob();
252  return ts.at(idx); // Field type
253  }
254  // Upgrade, if !dsp and a function pointer
255  private @NotNull Type get_fld2( TypeObj tobj ) {
256  Type tfld = get_fld(tobj);
257  TypeFunPtr tfp;
258  if( tfld instanceof TypeFunPtr &&
259  (tfp=(TypeFunPtr)tfld)._disp!=TypeMemPtr.NO_DISP && // Display not alive
260  err(true)==null &&
261  _live.live_no_disp() )
262  tfld = tfp.make_no_disp();
263  return tfld;
264  }
265 
266 
267  @Override public boolean unify( boolean test ) {
268  // Input should be a TMem
269  TV2 tmem = tvar(1);
270  if( !tmem.isa("Mem") ) return false;
271  // Address needs to name the aliases
272  Type tadr = val(2);
273  if( !(tadr instanceof TypeMemPtr) ) return false; // Wait until types are sharper
274  TypeMemPtr tmp = (TypeMemPtr)tadr;
275 
276  // Make a Obj["fld":self] type.
277  // Make a Ptr:[0:Obj] and unify with the address.
278  // Make a Mem:[alias:Obj] and unify with all aliases.
279 
280  // Make a Obj["fld":self] type.
281  TV2 tobj = TV2.make("Obj",(UQNodes) null,"Load_unify");
282  tobj.args_put(_fld,tvar());
283 
284  // Make a Ptr:[0:Obj] and unify with the address.
285  TV2 tptr = TV2.make("Ptr",adr(),"Load_unify");
286  tptr.args_put(0,tobj);
287  boolean progress = adr().tvar().unify(tptr,test);
288  if( test && progress ) return progress;
289 
290  // Make a Mem:[alias:Obj] and unify with all aliases.
291  for( int alias : tmp._aliases ) {
292  // TODO: Probably wrong, as no reason to believe that as soon as alias
293  // sharpens above AARY that it has hit its best sane value.
294  if( alias <= BitsAlias.AARY ) continue; // No unify on parser-specific values
295  progress |= tmem.unify_at(alias,tobj.find(),test);
296  if( test && progress ) return progress;
297  }
298  return progress;
299  }
300 
301  public static boolean unify( Node n, String fld, boolean test, String alloc_site) {
302  // Input should be a TMem
303  TV2 tmem = n.tvar(1);
304  if( !tmem.isa("Mem") ) return false;
305  // Address needs to name the aliases
306  Type tadr = n.val(2);
307  if( !(tadr instanceof TypeMemPtr) ) return false; // Wait until types are sharper
308  TypeMemPtr tmp = (TypeMemPtr)tadr;
309 
310  // Unify the given aliases and field against the loaded type
311  return tmem.unify_alias_fld(n,tmp._aliases,fld,n.tvar(),test,alloc_site);
312  }
313 
314  @Override public ErrMsg err( boolean fast ) {
315  Type tadr = adr()._val;
316  if( tadr.must_nil() ) return fast ? ErrMsg.FAST : ErrMsg.niladr(_bad,"Struct might be nil when reading",_fld);
317  if( tadr==Type.ANY ) return null; // No error, since might fall to any valid thing
318  if( !(tadr instanceof TypeMemPtr) )
319  return bad(fast,null); // Not a pointer nor memory, cannot load a field
320  TypeMemPtr ptr = (TypeMemPtr)tadr;
321  Type tmem = mem()._val;
322  if( tmem==Type.ALL ) return bad(fast,null);
323  if( tmem==Type.ANY ) return null; // No error
324  TypeObj objs = tmem instanceof TypeMem
325  ? ((TypeMem)tmem).ld(ptr) // General load from memory
326  : ((TypeObj)tmem);
327  if( objs==TypeObj.UNUSED ) return null; // No error, since might fall to anything
328  if( !(objs instanceof TypeStruct) || find((TypeStruct)objs) == -1 )
329  return bad(fast,objs);
330  return null;
331  }
332  private ErrMsg bad( boolean fast, TypeObj to ) {
333  boolean is_closure = adr() instanceof ProjNode && adr().in(0) instanceof NewObjNode && ((NewObjNode)adr().in(0))._is_closure;
334  return fast ? ErrMsg.FAST : ErrMsg.field(_bad,"Unknown",_fld,is_closure,to);
335  }
336  @Override public int hashCode() { return super.hashCode()+_fld.hashCode(); }
337  @Override public boolean equals(Object o) {
338  if( this==o ) return true;
339  if( !super.equals(o) ) return false;
340  return (o instanceof LoadNode) && Util.eq(_fld,((LoadNode)o)._fld);
341  }
342 
343 }
com.cliffc.aa.type.Type.NSCALR
static final Type NSCALR
Definition: Type.java:330
com.cliffc.aa.node.LoadNode.equals
boolean equals(Object o)
Definition: LoadNode.java:337
com.cliffc.aa.node.MrgProjNode.nnn
NewNode nnn()
Definition: MrgProjNode.java:14
com.cliffc.aa.type.TypeMemPtr.NO_DISP
static final Type NO_DISP
Definition: TypeMemPtr.java:80
com.cliffc.aa.tvar.TV2.unify_at
boolean unify_at(Comparable key, TV2 tv2, boolean test)
Definition: TV2.java:105
com.cliffc.aa.tvar.TV2.unify
boolean unify(TV2 that, boolean test)
Definition: TV2.java:288
com.cliffc.aa.node.MemPrimNode
Definition: MemPrimNode.java:10
com.cliffc.aa.type.TypeMem.ld
TypeObj ld(TypeMemPtr ptr)
Definition: TypeMem.java:325
com.cliffc.aa.node.MrgProjNode.mem
Node mem()
Definition: MrgProjNode.java:15
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.call
CallNode call()
Definition: CallEpiNode.java:35
com.cliffc.aa.node.StoreNode.adr
Node adr()
Definition: StoreNode.java:31
com.cliffc.aa.type.TypeMem.live_no_disp
boolean live_no_disp()
Definition: TypeMem.java:320
com.cliffc.aa.node.Node.live
TypeMem live(GVNGCM.Mode opt_mode)
Definition: Node.java:478
com.cliffc.aa.node.CallNode.mem
Node mem()
Definition: CallNode.java:119
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.util.Util.eq
static boolean eq(String s0, String s1)
Definition: Util.java:16
com.cliffc.aa.GVNGCM.add_mono
public< N extends Node > N add_mono(N n)
Definition: GVNGCM.java:51
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.node.LoadNode.ideal_reduce
Node ideal_reduce()
Definition: LoadNode.java:30
com.cliffc.aa.type.Type.SCALAR
static final Type SCALAR
Definition: Type.java:328
com.cliffc
com.cliffc.aa.type.BitsAlias.AARY
static final int AARY
Definition: BitsAlias.java:25
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.tvar.TV2.args_put
void args_put(Comparable key, TV2 tv)
Definition: TV2.java:99
com.cliffc.aa.GVNGCM.add_work_all
Node add_work_all(Node n)
Definition: GVNGCM.java:73
com.cliffc.aa.tvar
Definition: TV2.java:1
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.MemJoinNode
Definition: MemJoinNode.java:15
com.cliffc.aa.node.StoreNode
Definition: StoreNode.java:14
com.cliffc.aa.node.PhiNode
Definition: PhiNode.java:9
com.cliffc.aa.AA.MEM_IDX
static final int MEM_IDX
Definition: AA.java:14
com.cliffc.aa.type.BitsAlias
Definition: BitsAlias.java:8
com.cliffc.aa.node.LoadNode._live_use
TypeMem _live_use(GVNGCM.Mode opt_mode, Node def)
Definition: LoadNode.java:224
com.cliffc.aa.node.LoadNode._find_previous_store_call
static Node _find_previous_store_call(BitsAlias aliases, TypeMem tmem0, TypeMem tmem1, CallEpiNode cepi, String fld, boolean is_load)
Definition: LoadNode.java:177
com.cliffc.aa.node.LoadNode.unify
static boolean unify(Node n, String fld, boolean test, String alloc_site)
Definition: LoadNode.java:301
com.cliffc.aa.node.Node.ErrMsg.niladr
static ErrMsg niladr(Parse loc, String msg, String fld)
Definition: Node.java:934
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.LoadNode
Definition: LoadNode.java:13
com.cliffc.aa.node.StartMemNode
Definition: StartMemNode.java:8
com.cliffc.aa.type.Type.ANY
static final Type ANY
Definition: Type.java:325
com.cliffc.aa.node.Node.ErrMsg
Definition: Node.java:888
com.cliffc.aa.node.ConNode
Definition: ConNode.java:9
com.cliffc.aa.node.LoadNode.hashCode
int hashCode()
Definition: LoadNode.java:336
com.cliffc.aa.node.Node.add_def
Node add_def(Node n)
Definition: Node.java:152
com.cliffc.aa.node.LoadNode._fld
final String _fld
Definition: LoadNode.java:14
com.cliffc.aa.type.TypeStruct
A memory-based collection of optionally named fields.
Definition: TypeStruct.java:50
com.cliffc.aa.type.Bits.test_recur
boolean test_recur(int i)
Definition: Bits.java:232
com.cliffc.aa.node.CallNode
Definition: CallNode.java:86
com.cliffc.aa.AA.unimpl
static RuntimeException unimpl()
Definition: AA.java:10
com.cliffc.aa.node.MProjNode
Definition: MProjNode.java:10
com.cliffc.aa.type.TypeMem.ANYMEM
static final TypeMem ANYMEM
Definition: TypeMem.java:228
com.cliffc.aa.type.TypeStruct.at
Type at(int idx)
Definition: TypeStruct.java:1013
com.cliffc.aa.type.TypeMem.above_center
boolean above_center()
Definition: TypeMem.java:548
com.cliffc.aa.type.Type.ALL
static final Type ALL
Definition: Type.java:324
com.cliffc.aa.tvar.TV2.make
static TV2 make(@NotNull String name, Node n, @NotNull String alloc_site)
Definition: TV2.java:154
com.cliffc.aa.tvar.TV2.unify_alias_fld
boolean unify_alias_fld(Node ldst, BitsAlias aliases, String fld, TV2 tv, boolean test, String alloc_site)
Definition: TV2.java:488
com.cliffc.aa.node.LoadNode.bad
ErrMsg bad(boolean fast, TypeObj to)
Definition: LoadNode.java:332
com.cliffc.aa.node.StoreNode._fld
final String _fld
Definition: StoreNode.java:15
com.cliffc.aa.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.node.LoadNode.LoadNode
LoadNode(Node mem, Node adr, String fld, Parse bad)
Definition: LoadNode.java:17
com.cliffc.aa.type.TypeObj
Definition: TypeObj.java:15
com.cliffc.aa.node.LoadNode.get_fld
Type get_fld(TypeObj tobj)
Definition: LoadNode.java:245
com.cliffc.aa.type.Type.is_con
boolean is_con()
Definition: Type.java:776
com.cliffc.aa.type.Type.above_center
boolean above_center()
Definition: Type.java:741
com.cliffc.aa.node.LoadNode.ideal_mono
Node ideal_mono()
Definition: LoadNode.java:47
com.cliffc.aa.type.Bits.join
static void join(Tree tree, long[] bits0, long[] bits1, long[] bits2)
Definition: Bits.java:349
com.cliffc.aa.util.Util
Definition: Util.java:5
com.cliffc.aa.type.TypeMem.fld_is_mod
boolean fld_is_mod(BitsAlias aliases, String fld)
Definition: TypeMem.java:508
com.cliffc.aa.type.TypeObj.UNUSED
static final TypeObj UNUSED
Definition: TypeObj.java:46
com.cliffc.aa.node.StoreNode.err
ErrMsg err(boolean fast)
Definition: StoreNode.java:142
com.cliffc.aa.node.Node.ErrMsg.FAST
static final ErrMsg FAST
Definition: Node.java:893
com.cliffc.aa.node.Node.in
Node in(int i)
Definition: Node.java:126
com.cliffc.aa.node.LoadNode._bad
final Parse _bad
Definition: LoadNode.java:15
com.cliffc.aa.node.LoadNode.add_flow_use_extra
void add_flow_use_extra(Node chg)
Definition: LoadNode.java:207
com.cliffc.aa.type.Type.must_nil
boolean must_nil()
Definition: Type.java:845
com.cliffc.aa.node.Node.OP_LOAD
static final byte OP_LOAD
Definition: Node.java:31
com.cliffc.aa.node.LoadNode.str
String str()
Definition: LoadNode.java:23
com.cliffc.aa.type.TypeMem.ALIVE
static final TypeMem ALIVE
Definition: TypeMem.java:226
com.cliffc.aa.GVNGCM
Definition: GVNGCM.java:12
com.cliffc.aa.type.TypeFunPtr.make_no_disp
TypeFunPtr make_no_disp()
Definition: TypeFunPtr.java:77
com.cliffc.aa.type.BitsAlias.EMPTY
static BitsAlias EMPTY
Definition: BitsAlias.java:27
com.cliffc.aa.node.ProjNode
Definition: ProjNode.java:11
com.cliffc.aa.node.NewNode._ts
T _ts
Definition: NewNode.java:25
com.cliffc.aa.node.LoadNode.xstr
String xstr()
Definition: LoadNode.java:22
com.cliffc.aa.node.NewObjNode
Definition: NewObjNode.java:20
com.cliffc.aa.tvar.TV2.isa
boolean isa(String s)
Definition: TV2.java:77
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa.node.LoadNode.mem
Node mem()
Definition: LoadNode.java:24
com.cliffc.aa.type.TypeStruct.fld_find
int fld_find(String fld)
Definition: TypeStruct.java:1038
com.cliffc.aa.node.Node.val
Type val(int idx)
Definition: Node.java:470
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.node.NewNode
Definition: NewNode.java:17
com.cliffc.aa.node.CastNode
Definition: CastNode.java:11
com.cliffc.aa.tvar.UQNodes
Definition: UQNodes.java:8
com.cliffc.aa.node.MrgProjNode
Definition: MrgProjNode.java:10
com.cliffc.aa.node.LoadNode.find
int find(TypeStruct ts)
Definition: LoadNode.java:27
com.cliffc.aa.type.TypeMemPtr._aliases
BitsAlias _aliases
Definition: TypeMemPtr.java:16
com.cliffc.aa.node.Node.set_def
Node set_def(int idx, Node n)
Definition: Node.java:154
com.cliffc.aa.GVNGCM.add_reduce
public< N extends Node > N add_reduce(N n)
Definition: GVNGCM.java:49
com.cliffc.aa.node.LoadNode.ideal_grow
Node ideal_grow()
Definition: LoadNode.java:93
com.cliffc.aa.node.CallEpiNode
Definition: CallEpiNode.java:24
com.cliffc.aa.node.Node._op
final byte _op
Definition: Node.java:85
com.cliffc.aa.node.LoadNode.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: LoadNode.java:218
com.cliffc.aa.node.ParmNode
Definition: ParmNode.java:14
com.cliffc.aa.tvar.TV2
Definition: TV2.java:23
com.cliffc.aa.node.MemSplitNode
Definition: MemSplitNode.java:19
com.cliffc.aa.type.Type.oob
Type oob()
Definition: Type.java:635
com.cliffc.aa.node.Node.xval
Type xval()
Definition: Node.java:460
com.cliffc.aa.node.StoreNode.rez
Node rez()
Definition: StoreNode.java:32
com.cliffc.aa.GVNGCM.add_flow
public< N extends Node > N add_flow(N n)
Definition: GVNGCM.java:50
com.cliffc.aa.node.NewNode._alias
int _alias
Definition: NewNode.java:20
com.cliffc.aa.node.Node.tvar
TV2 tvar()
Definition: Node.java:96
com
com.cliffc.aa.node.LoadNode.get_fld2
Type get_fld2(TypeObj tobj)
Definition: LoadNode.java:255
com.cliffc.aa.node.Node.OP_PHI
static final byte OP_PHI
Definition: Node.java:38
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.node.MemPrimNode.LValueWrite
Definition: MemPrimNode.java:200
com.cliffc.aa.node.Node._defs
Ary< Node > _defs
Definition: Node.java:124
com.cliffc.aa.node.StoreNode.mem
Node mem()
Definition: StoreNode.java:30
com.cliffc.aa.tvar.TV2.find
TV2 find()
Definition: TV2.java:240
com.cliffc.aa.node.LoadNode.set_mem
Node set_mem(Node a)
Definition: LoadNode.java:26
com.cliffc.aa.type.TypeMemPtr
Definition: TypeMemPtr.java:14
com.cliffc.aa.Parse
an implementation of language AA
Definition: Parse.java:68
com.cliffc.aa.node.LoadNode.err
ErrMsg err(boolean fast)
Definition: LoadNode.java:314
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14
com.cliffc.aa.node.CallNode.tesc
static TypeMemPtr tesc(Type tcall)
Definition: CallNode.java:151
com.cliffc.aa.node.LoadNode.adr
Node adr()
Definition: LoadNode.java:25
com.cliffc.aa.node.LoadNode.find_previous_store
static Node find_previous_store(Node mem, Node adr, BitsAlias aliases, String fld, boolean is_load)
Definition: LoadNode.java:111
com.cliffc.aa.node.Node.ErrMsg.field
static ErrMsg field(Parse loc, String msg, String fld, boolean closure, TypeObj to)
Definition: Node.java:929
com.cliffc.aa.node.LoadNode.unify
boolean unify(boolean test)
Definition: LoadNode.java:267
com.cliffc.aa.node.LoadNode.value
Type value(GVNGCM.Mode opt_mode)
Definition: LoadNode.java:191