aa
PhiNode.java
Go to the documentation of this file.
1 package com.cliffc.aa.node;
2 
3 import com.cliffc.aa.Env;
4 import com.cliffc.aa.GVNGCM;
5 import com.cliffc.aa.Parse;
6 import com.cliffc.aa.type.*;
7 
8 // Merge results; extended by ParmNode
9 public class PhiNode extends Node {
10  final Parse _badgc;
11  final Type _t; // Just a flag to signify scalar vs memory vs object
12  private PhiNode( byte op, Type t, Parse badgc, Node... vals ) {
13  super(op,vals);
14  if( t instanceof TypeMem ) _t = TypeMem.ALLMEM;
15  else if( t instanceof TypeObj ) _t = TypeObj.OBJ; // Need to check liveness
16  else if( t instanceof TypeTuple ) _t = Type.SCALAR;
17  else _t = Type.SCALAR;
18  _badgc = badgc;
19  _live = all_live(); // Recompute starting live after setting t
20  }
21  public PhiNode( Type t, Parse badgc, Node... vals ) { this(OP_PHI,t,badgc,vals); }
22  // For ParmNodes
23  PhiNode( byte op, Node fun, Type tdef, Node defalt, Parse badgc ) { this(op,tdef,badgc, fun,defalt); }
24  @Override public boolean is_mem() { return _t==TypeMem.ALLMEM; }
25  @Override public int hashCode() { return super.hashCode()+_t.hashCode(); }
26  @Override public boolean equals(Object o) {
27  if( this==o ) return true;
28  if( !super.equals(o) ) return false;
29  if( !(o instanceof PhiNode) ) return false;
30  PhiNode phi = (PhiNode)o;
31  return _t==phi._t;
32  }
33 
34  @Override public Node ideal_reduce() {
35  if( in(0)==null ) return null; // Mid-construction
36  if( val(0) == Type.XCTRL ) return null;
37  RegionNode r = (RegionNode) in(0);
38  assert r._defs._len==_defs._len;
39  if( r._val == Type.XCTRL ) return null; // All dead, c-prop will fold up
40  if( r._defs.len() > 1 && r.in(1) == Env.ALL_CTRL ) return null;
41  if( r instanceof FunNode && ((FunNode)r).noinline() )
42  return null; // Do not start peeling apart parameters to a no-inline function
43  // If only 1 unique live input, return that
44  Node live=null;
45  for( int i=1; i<_defs._len; i++ ) {
46  if( r.val(i)==Type.XCTRL ) continue; // Ignore dead path
47  Node n = in(i);
48  if( n==this || n==live ) continue; // Ignore self or duplicates
49  if( live==null ) live = n; // Found unique live input
50  else live=this; // Found 2nd live input, no collapse
51  }
52  if( live != this ) return live; // Single unique input
53 
54  return null;
55  }
56  @Override public Type value(GVNGCM.Mode opt_mode) {
57  if( in(0)==null ) return Type.ALL; // Conservative, mid-construction
58  Type ctl = val(0);
59  if( ctl != Type.CTRL ) return ctl.oob();
60  RegionNode r = (RegionNode) in(0);
61  assert r._defs._len==_defs._len;
62  if( r instanceof LoopNode &&
63  r.val(1)!=Type.XCTRL && r.val(1)!=Type.ANY &&
64  r.val(2)!=Type.XCTRL && r.val(2)!=Type.ANY )
65  return val(1).meet_loop(val(2)); // Optimize for backedges: no final-field updates.
66  Type t = Type.ANY;
67  for( int i=1; i<_defs._len; i++ )
68  if( r.val(i)!=Type.XCTRL && r.val(i)!=Type.ANY ) // Only meet alive paths
69  t = t.meet(val(i));
70  return t;
71  }
72 
73 
74  //@Override public TV2 new_tvar(String alloc_site) {
75  // if( _t==null ) return null;
76  // return _t==TypeMem.ALLMEM ? TV2.make_mem(this,alloc_site) : TV2.make_leaf(this,alloc_site);
77  //}
78  //
80  //@Override public boolean unify( boolean test ) {
81  // if( !(in(0) instanceof RegionNode) ) return false;
82  // RegionNode r = (RegionNode) in(0);
83  // boolean progress = false;
84  // for( int i=1; i<_defs._len; i++ ) {
85  // if( r.val(i)!=Type.XCTRL && r.val(i)!=Type.ANY ) { // Only unify alive paths
86  // progress |= tvar().unify(tvar(i), test);
87  // if( progress && test ) return true;
88  // }
89  // }
90  // return progress;
91  //}
92 
93  @Override BitsAlias escapees() { return BitsAlias.FULL; }
94  @Override public TypeMem all_live() {
96  }
97  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) {
98  Node r = in(0);
99  if( r==def ) return TypeMem.ALIVE;
100  if( r!=null ) {
101  // The same def can appear on several inputs; check them all.
102  int i; for( i=1; i<_defs._len; i++ )
103  if( in(i)==def && !r.val(i).above_center() )
104  break; // This input is live
105  if( i==_defs._len ) return TypeMem.DEAD; // All matching defs are not live on any path
106  }
107  // Def is alive (on some path)
108  return all_live().basic_live() && !def.all_live().basic_live() ? TypeMem.ANYMEM : _live;
109  }
110 
111  @Override public ErrMsg err( boolean fast ) {
112  if( !(in(0) instanceof FunNode && ((FunNode)in(0)).name(false).equals("!") ) && // Specifically "!" takes a Scalar
113  (_val !=null &&
114  (_val.contains(Type.SCALAR) ||
115  _val.contains(Type.NSCALR))) ) // Cannot have code that deals with unknown-GC-state
116  return ErrMsg.badGC(_badgc);
117  return null;
118  }
119 }
com.cliffc.aa.type.BitsAlias.FULL
static BitsAlias FULL
Definition: BitsAlias.java:27
com.cliffc.aa.type.Type.NSCALR
static final Type NSCALR
Definition: Type.java:330
com.cliffc.aa.node.PhiNode.PhiNode
PhiNode(Type t, Parse badgc, Node... vals)
Definition: PhiNode.java:21
com.cliffc.aa.type.TypeMem.DEAD
static final TypeMem DEAD
Definition: TypeMem.java:226
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.Node._live
TypeMem _live
Definition: Node.java:89
com.cliffc.aa.type.Type.SCALAR
static final Type SCALAR
Definition: Type.java:328
com.cliffc
com.cliffc.aa.node.PhiNode.err
ErrMsg err(boolean fast)
Definition: PhiNode.java:111
com.cliffc.aa.node.PhiNode.value
Type value(GVNGCM.Mode opt_mode)
Definition: PhiNode.java:56
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.node.PhiNode._badgc
final Parse _badgc
Definition: PhiNode.java:10
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.type.Type.hashCode
final int hashCode()
Definition: Type.java:106
com.cliffc.aa.node.PhiNode
Definition: PhiNode.java:9
com.cliffc.aa.type.BitsAlias
Definition: BitsAlias.java:8
com.cliffc.aa.type.TypeTuple
Definition: TypeTuple.java:11
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.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.PhiNode.hashCode
int hashCode()
Definition: PhiNode.java:25
com.cliffc.aa.type.Type.meet
final Type meet(Type t)
Definition: Type.java:412
com.cliffc.aa.node.PhiNode.equals
boolean equals(Object o)
Definition: PhiNode.java:26
com.cliffc.aa.type.TypeMem.ANYMEM
static final TypeMem ANYMEM
Definition: TypeMem.java:228
com.cliffc.aa.type.Type.ALL
static final Type ALL
Definition: Type.java:324
com.cliffc.aa.node.PhiNode.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: PhiNode.java:97
com.cliffc.aa.node.PhiNode.escapees
BitsAlias escapees()
Definition: PhiNode.java:93
com.cliffc.aa.type.TypeObj.OBJ
static final TypeObj OBJ
Definition: TypeObj.java:44
com.cliffc.aa.type.TypeObj
Definition: TypeObj.java:15
com.cliffc.aa.type.Type.above_center
boolean above_center()
Definition: Type.java:741
com.cliffc.aa.type.Type.meet_loop
Type meet_loop(Type t2)
Definition: Type.java:628
com.cliffc.aa.type.Type.contains
final boolean contains(Type t)
Definition: Type.java:926
com.cliffc.aa.type.Type.CTRL
static final Type CTRL
Definition: Type.java:326
com.cliffc.aa.type.TypeMem.basic_live
boolean basic_live()
Definition: TypeMem.java:561
com.cliffc.aa.node.Node.in
Node in(int i)
Definition: Node.java:126
com.cliffc.aa.node.PhiNode.ideal_reduce
Node ideal_reduce()
Definition: PhiNode.java:34
com.cliffc.aa.type.TypeMem.ALIVE
static final TypeMem ALIVE
Definition: TypeMem.java:226
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.FunNode.noinline
boolean noinline()
Definition: FunNode.java:179
com.cliffc.aa.node.PhiNode.is_mem
boolean is_mem()
Definition: PhiNode.java:24
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.Node.all_live
TypeMem all_live()
Definition: Node.java:509
com.cliffc.aa.node.PhiNode.PhiNode
PhiNode(byte op, Node fun, Type tdef, Node defalt, Parse badgc)
Definition: PhiNode.java:23
com.cliffc.aa.node.PhiNode._t
final Type _t
Definition: PhiNode.java:11
com.cliffc.aa.node.LoopNode
Definition: LoopNode.java:6
com.cliffc.aa.node.PhiNode.PhiNode
PhiNode(byte op, Type t, Parse badgc, Node... vals)
Definition: PhiNode.java:12
com.cliffc.aa.type.Type.oob
Type oob()
Definition: Type.java:635
com.cliffc.aa.node.FunNode
Definition: FunNode.java:58
com.cliffc.aa.node.RegionNode
Definition: RegionNode.java:11
com
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.node.PhiNode.all_live
TypeMem all_live()
Definition: PhiNode.java:94
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.node.Node._defs
Ary< Node > _defs
Definition: Node.java:124
com.cliffc.aa.Parse
an implementation of language AA
Definition: Parse.java:68
com.cliffc.aa.Env.ALL_CTRL
static ConNode ALL_CTRL
Definition: Env.java:20
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14
com.cliffc.aa.node.Node.ErrMsg.badGC
static ErrMsg badGC(Parse loc)
Definition: Node.java:938