aa
ScopeNode.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.util.Ary;
6 
7 import java.util.HashMap;
8 import java.util.function.Predicate;
9 
10 import static com.cliffc.aa.type.TypeFld.Access;
11 import static com.cliffc.aa.AA.MEM_IDX;
12 
13 // Lexical-Scope Node. Tracks control & phat memory, plus a stack frame (which
14 // is just a NewNode). The stack frame maps local variable names to Nodes and
15 // is modeled as a true memory indirection - for true closures. Unless there
16 // is an upwards funarg the stack frame will optimize away.
17 public class ScopeNode extends Node {
18 
19  // Mapping from type-variables to Types. Types have a scope lifetime like values.
20  private final HashMap<String,ConTypeNode> _types; // user-typing type names
21  private Ary<IfScope> _ifs; // Nested set of IF-exprs used to track balanced new-refs
22 
23  public ScopeNode(Parse open, boolean closure) {
24  super(OP_SCOPE,null,null,null,null);
25  if( closure ) { add_def(null); add_def(null); add_def(null); } // Wire up an early-function-exit path
26  _types = new HashMap<>();
27  _ifs = null;
28  keep();
29  }
30  public ScopeNode(HashMap<String,ConTypeNode> types, Node ctl, Node mem, Node ptr, Node rez) {
31  super(OP_SCOPE,ctl,mem,ptr,rez);
32  _types = types;
33  keep();
34  }
35 
36  // Add base types on startup
37  public void init() {
38  HashMap<String,Type> ts = new HashMap<>();
39  Type.init0(ts);
40  for( String tname : ts.keySet() )
41  _types.put(tname,Env.GVN.init(new ConTypeNode(tname,ts.get(tname),Env.SCP_0)));
42  }
43 
44  public Node ctrl() { return in(0); }
45  public Node mem () { return in(MEM_IDX); }
46  public Node ptr () { return in(2); }
47  public Node rez () { return in(3); }
48  public NewObjNode stk () { return (NewObjNode)ptr().in(0); }
49  public <N extends Node> N set_ctrl( N n ) { set_def(0,n); return n; }
50  public void set_ptr ( Node n) { set_def(2,n); }
51  public void set_rez ( Node n) { set_def(3,n); }
52 
53  // Set a new deactive GVNd memory, ready for nested Node.ideal() calls.
54  public Node set_mem( Node n) {
55  assert n._val instanceof TypeMem || n._val ==Type.ANY || n._val ==Type.ALL;
56  Node old = mem();
57  set_def(MEM_IDX,n);
58  if( old!=null ) {
59  Env.GVN.add_work_all(old);
60  if( old._uses._len <= 2 ) // DEFMEM and a MemSplit
61  for( Node use : old._uses )
62  if( use instanceof MemSplitNode )
63  Env.GVN.add_mono(((MemSplitNode)use).join());
64  old.add_flow_def_extra(n); // old loses a use, triggers extra
65  Env.GVN.add_work_all(n);
66  }
67  return this;
68  }
69  public void replace_mem(Node st) {
70  set_def(MEM_IDX,null);
71  Node mem = Env.GVN.xform(st);
72  set_def(MEM_IDX,mem);
73  }
74  @Override public boolean is_mem() { return true; }
75 
76  public Node get(String name) { return stk().get(name); }
77  public boolean is_mutable(String name) { return stk().is_mutable(name); }
78 
79  public RegionNode early_ctrl() { return (RegionNode)in(4); }
80  public PhiNode early_mem () { return ( PhiNode)in(5); }
81  public PhiNode early_val () { return ( PhiNode)in(6); }
82  public void early_kill() { pop(); pop(); pop(); }
83 
84  // Name to type lookup, or null
85  public ConTypeNode get_type(String name) { return _types.get(name); }
86 
87  // Alias to TypeMemPtr lookup, or null
88  public ConTypeNode get_type(int alias) {
89  for( ConTypeNode ctn : _types.values() )
90  if( ctn._t instanceof TypeMemPtr &&
91  ((TypeMemPtr)ctn._t)._aliases.test(alias) )
92  return ctn;
93  return null;
94  }
95 
96  // Extend the current Scope with a new type; cannot override existing name.
97  public void add_type( String name, ConTypeNode t ) {
98  assert _types.get(name)==null;
99  _types.put( name, t );
100  }
101 
102  public boolean is_closure() { assert _defs._len==4 || _defs._len==7; return _defs._len==7; }
103 
104  @Override public Node ideal_reduce() {
105  Node ctrl = in(0).is_copy(0);
106  if( ctrl != null ) { set_ctrl(ctrl); return this; }
107 
108  Node mem = mem();
109  Node rez = rez();
110  Type trez = rez==null ? null : rez._val;
111  if( Env.GVN._opt_mode != GVNGCM.Mode.Parse && // Past parsing
112  rez != null && // Have a return result
113  // If type(rez) can never lift to any TMP, then we will not return a
114  // pointer, and do not need the memory state on exit.
115  (!TypeMemPtr.OOP0.dual().isa(trez) || trez==Type.XNIL) &&
116  // And not already wiped it out
117  !(mem instanceof ConNode && mem._val ==TypeMem.XMEM) )
118  // Wipe out return memory
119  return set_mem(Node.con(TypeMem.XMEM));
120 
121  return null;
122  }
123  @Override public Type value(GVNGCM.Mode opt_mode) { return Type.ALL; }
124  @Override public TypeMem all_live() { return TypeMem.ALLMEM; }
125 
126  // From a memory and a possible pointer-to-memory, find all the reachable
127  // aliases and fold them into 'live'. This is unlike other live_use
128  // because this "turns around" the incoming live memory to also be the
129  // demanded/used memory.
131  Type tmem = mem._val;
132  Type trez = rez._val;
133  if( !(tmem instanceof TypeMem ) ) return tmem.oob(TypeMem.ALLMEM); // Not a memory?
134  if( TypeMemPtr.OOP.isa(trez) ) return ((TypeMem)tmem).flatten_fields(); // All possible pointers, so all memory is alive
135  if( !(trez instanceof TypeMemPtr) ) return TypeMem.ANYMEM; // Not a pointer, basic live only
136  if( trez.above_center() ) return TypeMem.ANYMEM; // Have infinite choices still, report basic live only
137  // Find everything reachable from the pointer and memory, and report it all
138  TypeMem tmem0 = (TypeMem)tmem;
139  BitsAlias aliases = tmem0.all_reaching_aliases(((TypeMemPtr)trez)._aliases);
140  return tmem0.slice_reaching_aliases(aliases).flatten_fields();
141  }
142 
143  @Override public TypeMem live(GVNGCM.Mode opt_mode) {
144  // Prim scope is not used past Call-Graph discovery
145  if( this==Env.SCP_0 ) return opt_mode._CG ? TypeMem.DEAD : TypeMem.ALLMEM;
146  if( opt_mode == GVNGCM.Mode.Parse ) return TypeMem.MEM;
147  assert _uses._len==0;
148  // All fields in all reachable pointers from rez() will be marked live
149  return compute_live_mem(mem(),rez());
150  }
151 
152  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) {
153  // The top scope is always alive, and represents what all future unparsed
154  // code MIGHT do.
155  if( this==Env.SCP_0 && opt_mode._CG )
156  return TypeMem.DEAD;
157  // Basic liveness ("You are Alive!") for control and returned value
158  if( def == ctrl() ) return TypeMem.ALIVE;
159  if( def == rez () ) return def.all_live().basic_live() ? TypeMem.LIVE_BOT : TypeMem.ANYMEM;
160  // Returned display is dead in a whole program.
161  // In a partial-program, whats in the display is exported to the next step.
162  if( def == ptr () ) return opt_mode._CG ? TypeMem.DEAD : TypeMem.LIVE_BOT; // Returned display is dead after CG
163  // Memory returns the compute_live_mem state in _live. If rez() is a
164  // pointer, this will include the memory slice.
165  if( def == mem() )
166  return opt_mode==GVNGCM.Mode.Parse ? TypeMem.ALLMEM : _live.flatten_fields();
167  // Merging exit path
168  return def._live;
169  }
170 
171  @Override public int hashCode() { return 123456789; }
172  // ScopeNodes are never equal
173  @Override public boolean equals(Object o) { return this==o; }
174  // End of dominator tree; do not walk past
175  @Override Node walk_dom_last(Predicate<Node> P) { return P.test(this) ? this : null; }
176 
177  // Create an if-scope and start tracking vars
178  public void push_if() {
179  if( _ifs == null ) _ifs = new Ary<>(new IfScope[1],0);
180  _ifs.push(new IfScope());
181  }
182  // Flip true-arm for false-arm
183  public void flip_if() { _ifs.last().flip(); }
184 
185  // Pop ifscope
186  public void pop_if() { _ifs.pop(); }
187 
188  // Test for being inside a ?: expression
189  public boolean test_if() { return _ifs!=null && !_ifs.isEmpty(); }
190 
191  public void def_if( String name, Access mutable, boolean create ) {
192  if( _ifs == null || _ifs._len==0 ) return; // Not inside an If
193  _ifs.last().def(name,mutable,create); // Var defined in arm of if
194  }
195 
196  public Node check_if( boolean arm, Parse bad, GVNGCM gvn, Node ctrl, Node mem ) { return _ifs.last().check(this,arm,bad,gvn,ctrl,mem); }
197 
198  private static class IfScope {
199  HashMap<String,Access> _tvars, _fvars;
200  boolean _arm = true;
201  void flip() { _arm = !_arm; }
202  // Record creation on either arm of an if
203  void def(String name, Access mutable, boolean create) {
204  if( _tvars == null ) { _tvars = new HashMap<>(); _fvars = new HashMap<>(); }
205  // If there was no prior create inside the same if, then this update
206  // predates the if and is not involved in a partial-creation error
207  if( !create && !_arm && _tvars.get(name) != null )
208  _fvars.put(name,mutable);
209  if( create ) {
210  HashMap<String,Access> vars = _arm ? _tvars : _fvars;
211  Access res = vars.put(name,mutable);
212  assert res==null; // No double-creation
213  }
214  }
215  // Check for balanced creation, and insert errors on unbalanced
216  Node check(ScopeNode scope, boolean arm, Parse bad, GVNGCM gvn, Node ctrl, Node mem) {
217  if( _tvars == null ) return mem; // No new vars on either arm
218  // Pull from both variable sets names that are common to both
219  if( arm ) { // Only do it first time
220  Ary<String> names = new Ary<>(String.class).addAll(_tvars.keySet());
221  while( !names.isEmpty() ) {
222  String name = names.pop();
223  if( _fvars.remove(name)!=null ) _tvars.remove(name);
224  }
225  }
226  // Everything in this set is a partially-created variable error
227  HashMap<String,Access> vars = arm ? _fvars : _tvars;
228  if( vars.isEmpty() ) return mem;
229  mem.unkeep(2); // Passed-in 'hooked' memory
230  for( String name : vars.keySet() ) {
231  String msg = "'"+name+"' not defined on "+arm+" arm of trinary";
232  Node err = gvn.xform(new ErrNode(ctrl,bad,msg));
233  // Exactly like a parser store of an error, on the missing side
234  mem = gvn.xform(new StoreNode(mem,scope.ptr(),err,Access.Final,name,bad));
235  }
236  return mem.keep(2); // Return 'hooked' memory
237  }
238  }
239 }
com.cliffc.aa.node.ScopeNode.add_type
void add_type(String name, ConTypeNode t)
Definition: ScopeNode.java:97
com.cliffc.aa.type.TypeFld.Access.Final
Final
Definition: TypeFld.java:112
com.cliffc.aa.node.ScopeNode.IfScope._fvars
HashMap< String, Access > _fvars
Definition: ScopeNode.java:199
com.cliffc.aa.type.TypeMem.DEAD
static final TypeMem DEAD
Definition: TypeMem.java:226
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.ScopeNode.check_if
Node check_if(boolean arm, Parse bad, GVNGCM gvn, Node ctrl, Node mem)
Definition: ScopeNode.java:196
com.cliffc.aa.node.ScopeNode.def_if
void def_if(String name, Access mutable, boolean create)
Definition: ScopeNode.java:191
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.TypeMem.XMEM
static final TypeMem XMEM
Definition: TypeMem.java:225
com.cliffc.aa.type.TypeMemPtr.OOP
static final TypeMemPtr OOP
Definition: TypeMemPtr.java:94
com.cliffc.aa.node.Node._live
TypeMem _live
Definition: Node.java:89
com.cliffc
com.cliffc.aa.node.ScopeNode._ifs
Ary< IfScope > _ifs
Definition: ScopeNode.java:21
com.cliffc.aa.node.ScopeNode.early_kill
void early_kill()
Definition: ScopeNode.java:82
com.cliffc.aa.util.Ary.pop
E pop()
Definition: Ary.java:41
com.cliffc.aa.node.ScopeNode.ScopeNode
ScopeNode(Parse open, boolean closure)
Definition: ScopeNode.java:23
com.cliffc.aa.type.TypeFld
Definition: TypeFld.java:12
com.cliffc.aa.node.ScopeNode
Definition: ScopeNode.java:17
com.cliffc.aa.util.Ary.addAll
Ary< E > addAll(Collection<? extends E > c)
Definition: Ary.java:151
com.cliffc.aa.type.TypeMem.LIVE_BOT
static final TypeMem LIVE_BOT
Definition: TypeMem.java:226
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.node.ScopeNode.ctrl
Node ctrl()
Definition: ScopeNode.java:44
com.cliffc.aa.node.ScopeNode.test_if
boolean test_if()
Definition: ScopeNode.java:189
com.cliffc.aa.GVNGCM.add_work_all
Node add_work_all(Node n)
Definition: GVNGCM.java:73
com.cliffc.aa.node.ScopeNode.hashCode
int hashCode()
Definition: ScopeNode.java:171
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.StoreNode
Definition: StoreNode.java:14
com.cliffc.aa.util.Ary
Definition: Ary.java:11
com.cliffc.aa.node.Node.add_flow_def_extra
void add_flow_def_extra(Node chg)
Definition: Node.java:515
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.Node.keep
public< N extends Node > N keep()
Definition: Node.java:228
com.cliffc.aa.node.Node.err
ErrMsg err(boolean fast)
Definition: Node.java:526
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.ScopeNode.rez
Node rez()
Definition: ScopeNode.java:47
com.cliffc.aa.type.Type.ANY
static final Type ANY
Definition: Type.java:325
com.cliffc.aa.node.ScopeNode.live
TypeMem live(GVNGCM.Mode opt_mode)
Definition: ScopeNode.java:143
com.cliffc.aa.node.ConNode
Definition: ConNode.java:9
com.cliffc.aa.node.Node.add_def
Node add_def(Node n)
Definition: Node.java:152
com.cliffc.aa.node.ScopeNode.ptr
Node ptr()
Definition: ScopeNode.java:46
com.cliffc.aa.type.Bits.test
static boolean test(long[] bits, int i)
Definition: Bits.java:224
com.cliffc.aa.node.ScopeNode.is_mem
boolean is_mem()
Definition: ScopeNode.java:74
com.cliffc.aa.type.TypeMem.ANYMEM
static final TypeMem ANYMEM
Definition: TypeMem.java:228
com.cliffc.aa.type.TypeMem.flatten_fields
TypeMem flatten_fields()
Definition: TypeMem.java:522
com.cliffc.aa.type.Type.ALL
static final Type ALL
Definition: Type.java:324
com.cliffc.aa.GVNGCM.xform
Node xform(Node n)
Definition: GVNGCM.java:126
com.cliffc.aa.node.ScopeNode.flip_if
void flip_if()
Definition: ScopeNode.java:183
com.cliffc.aa.node.ScopeNode.IfScope._arm
boolean _arm
Definition: ScopeNode.java:200
com.cliffc.aa.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.node.ScopeNode.equals
boolean equals(Object o)
Definition: ScopeNode.java:173
com.cliffc.aa.node.ScopeNode.ScopeNode
ScopeNode(HashMap< String, ConTypeNode > types, Node ctl, Node mem, Node ptr, Node rez)
Definition: ScopeNode.java:30
com.cliffc.aa.node.Node.unkeep
public< N extends Node > N unkeep()
Definition: Node.java:232
com.cliffc.aa.node.NewObjNode.get
Node get(String name)
Definition: NewObjNode.java:37
com.cliffc.aa.type.Type.above_center
boolean above_center()
Definition: Type.java:741
com.cliffc.aa.node.ScopeNode.get_type
ConTypeNode get_type(int alias)
Definition: ScopeNode.java:88
com.cliffc.aa.node.ScopeNode.ideal_reduce
Node ideal_reduce()
Definition: ScopeNode.java:104
com.cliffc.aa.type.Type.init0
static void init0(HashMap< String, Type > types)
Definition: Type.java:642
com.cliffc.aa.node.ScopeNode.mem
Node mem()
Definition: ScopeNode.java:45
com.cliffc.aa.node.ErrNode
Error nodes.
Definition: ErrNode.java:10
com.cliffc.aa.node.Node.is_copy
Node is_copy(int idx)
Definition: Node.java:827
com.cliffc.aa.type.TypeMem.basic_live
boolean basic_live()
Definition: TypeMem.java:561
com.cliffc.aa.node.ScopeNode._types
final HashMap< String, ConTypeNode > _types
Definition: ScopeNode.java:20
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.type.TypeMem.ALIVE
static final TypeMem ALIVE
Definition: TypeMem.java:226
com.cliffc.aa.node.ScopeNode.IfScope.flip
void flip()
Definition: ScopeNode.java:201
com.cliffc.aa.GVNGCM
Definition: GVNGCM.java:12
com.cliffc.aa.node.ScopeNode.is_closure
boolean is_closure()
Definition: ScopeNode.java:102
com.cliffc.aa.node.NewObjNode
Definition: NewObjNode.java:20
com.cliffc.aa.node.ScopeNode.IfScope.def
void def(String name, Access mutable, boolean create)
Definition: ScopeNode.java:203
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.ScopeNode.pop_if
void pop_if()
Definition: ScopeNode.java:186
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa.node.ScopeNode.early_mem
PhiNode early_mem()
Definition: ScopeNode.java:80
com.cliffc.aa.node.ScopeNode.value
Type value(GVNGCM.Mode opt_mode)
Definition: ScopeNode.java:123
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.node.ConTypeNode
Definition: ConTypeNode.java:18
com.cliffc.aa.node.Node.all_live
TypeMem all_live()
Definition: Node.java:509
com.cliffc.aa.node.ScopeNode.set_rez
void set_rez(Node n)
Definition: ScopeNode.java:51
com.cliffc.aa.node.ScopeNode.stk
NewObjNode stk()
Definition: ScopeNode.java:48
com.cliffc.aa.node.ScopeNode.set_ptr
void set_ptr(Node n)
Definition: ScopeNode.java:50
com.cliffc.aa.node.ScopeNode.is_mutable
boolean is_mutable(String name)
Definition: ScopeNode.java:77
com.cliffc.aa.node.ScopeNode.early_ctrl
RegionNode early_ctrl()
Definition: ScopeNode.java:79
com.cliffc.aa.node.ScopeNode.compute_live_mem
static TypeMem compute_live_mem(Node mem, Node rez)
Definition: ScopeNode.java:130
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.node.ScopeNode.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: ScopeNode.java:152
com.cliffc.aa.Env.SCP_0
static ScopeNode SCP_0
Definition: Env.java:18
com.cliffc.aa.type.Type.dual
final T dual()
Definition: Type.java:361
com.cliffc.aa.node.ScopeNode.walk_dom_last
Node walk_dom_last(Predicate< Node > P)
Definition: ScopeNode.java:175
com.cliffc.aa.node.MemSplitNode
Definition: MemSplitNode.java:19
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.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.ScopeNode.IfScope._tvars
HashMap< String, Access > _tvars
Definition: ScopeNode.java:199
com.cliffc.aa.node.Node.pop
Node pop()
Definition: Node.java:174
com.cliffc.aa.node.ScopeNode.push_if
void push_if()
Definition: ScopeNode.java:178
com.cliffc.aa.type.TypeFld.Access
Definition: TypeFld.java:109
com.cliffc.aa.node.ScopeNode.IfScope
Definition: ScopeNode.java:198
com.cliffc.aa.node.ScopeNode.set_ctrl
public< N extends Node > N set_ctrl(N n)
Definition: ScopeNode.java:49
com.cliffc.aa.type.TypeMemPtr.OOP0
static final TypeMemPtr OOP0
Definition: TypeMemPtr.java:93
com.cliffc.aa.node.NewObjNode.is_mutable
boolean is_mutable(String name)
Definition: NewObjNode.java:39
com.cliffc.aa.node.ScopeNode.all_live
TypeMem all_live()
Definition: ScopeNode.java:124
com.cliffc.aa.node.RegionNode
Definition: RegionNode.java:11
com.cliffc.aa.node.ScopeNode.get_type
ConTypeNode get_type(String name)
Definition: ScopeNode.java:85
com
com.cliffc.aa.node.ScopeNode.IfScope.check
Node check(ScopeNode scope, boolean arm, Parse bad, GVNGCM gvn, Node ctrl, Node mem)
Definition: ScopeNode.java:216
com.cliffc.aa.type.TypeMem.MEM
static final TypeMem MEM
Definition: TypeMem.java:224
com.cliffc.aa.node.ScopeNode.init
void init()
Definition: ScopeNode.java:37
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.GVNGCM.Mode.Parse
Parse
Definition: GVNGCM.java:15
com.cliffc.aa.node.ScopeNode.set_mem
Node set_mem(Node n)
Definition: ScopeNode.java:54
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.GVNGCM.init
public< N extends Node > N init(N n)
Definition: GVNGCM.java:99
com.cliffc.aa.node.Node._defs
Ary< Node > _defs
Definition: Node.java:124
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.type.TypeMem.slice_reaching_aliases
TypeMem slice_reaching_aliases(BitsAlias aliases)
Definition: TypeMem.java:392
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14
com.cliffc.aa.node.ScopeNode.replace_mem
void replace_mem(Node st)
Definition: ScopeNode.java:69
com.cliffc.aa.node.ScopeNode.early_val
PhiNode early_val()
Definition: ScopeNode.java:81