aa
MrgProjNode.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.type.*;
6 
7 import static com.cliffc.aa.AA.MEM_IDX;
8 
9 // Proj memory
10 public class MrgProjNode extends ProjNode {
11  public MrgProjNode( NewNode nnn, Node mem ) { super(MEM_IDX,nnn,mem); }
12  @Override public String xstr() { return "MrgProj"+_idx; }
13  @Override public boolean is_mem() { return true; }
14  NewNode nnn() { return (NewNode)in(0); }
15  Node mem() { return in(1); }
16 
17 
18  @Override public Node ideal_reduce() {
19  if( _keep >= 2 ) return null;
20  if( val(0).above_center() )
21  return mem();
22  NewNode nnn = nnn();
23  Node mem = mem();
24  Type t = mem._val;
25  // Alias is dead-on-entry. Then this MrgPrj no longer lifts
26  if( t instanceof TypeMem && ((TypeMem)t).at(nnn._alias)==TypeObj.UNUSED && nnn.is_unused() ) // New is dead for no pointers
27  return mem; // Kill MrgNode when it no longer lifts values
28 
29  // New is dead from below.
30  if( _live.at(nnn._alias)==TypeObj.UNUSED && nnn._keep==0 && !nnn.is_unused() && !is_prim() ) {
31  nnn.kill2(); // Killing a NewNode has to do more updates than normal
32  return this;
33  }
34 
35  // If is of a MemJoin and it can enter the split region, do so.
36  if( _keep==0 && mem instanceof MemJoinNode && mem._uses._len==1 ) {
37  MrgProjNode mprj = new MrgProjNode(nnn,mem);
38  MemJoinNode mjn = ((MemJoinNode)mem).add_alias_below_new(mprj,this);
39  Env.DEFMEM.set_def(nnn._alias,mprj);
40  return mjn;
41  }
42 
43  return null;
44  }
45 
46  @Override public Node ideal_mono() { return null; }
47 
48  @Override public Node ideal_grow() {
49  Node mem = mem();
50  // Look for back-to-back unrelated aliases and Split/Join
52  if( head2 != null && !head2.is_prim() ) {
53  BitsAlias escs1 = escapees();
54  if( MemSplitNode.check_split(this,escs1) )
55  return MemSplitNode.insert_split(this,escs1,this,head2,mem);
56  }
57  return null;
58  }
59  @Override public void add_flow_def_extra(Node chg) {
60  for( Node use : _uses ) { // Lost a use, could be a 2nd mem writer
61  if( use instanceof MrgProjNode ) // Look for back-to-back MrgProj
62  Env.GVN.add_grow(use);
63  if( use instanceof StoreNode ) // Look for a Store folding into a New
64  Env.GVN.add_reduce(use);
65  if( use instanceof MemSplitNode ) { //
66  MemJoinNode jn = ((MemSplitNode)use).join();
67  if( jn!=null ) Env.GVN.add_reduce(jn);
68  }
69  if( use instanceof CallNode )
70  Env.GVN.add_grow(use); // Swap Call & New
71  }
72  }
73  @Override public Type value(GVNGCM.Mode opt_mode) {
74  if( !(in(0) instanceof NewNode) ) return mem()._val;
75  NewNode nnn = nnn();
76  Type tn = nnn._val;
77  Type tm = mem()._val;
78  if( !(tm instanceof TypeMem ) ) return tm.oob();
79  if( !(tn instanceof TypeTuple) ) return tn.oob();
80  TypeObj to = (TypeObj)((TypeTuple)tn).at(MEM_IDX);
81  TypeMem tmem = (TypeMem)tm;
82  return nnn.is_unused() // This is a cycle-breaking lifting value
83  ? tmem.set (nnn._alias,TypeObj.UNUSED)
84  : tmem.st_new(nnn._alias, to);
85  }
86 
87  @Override BitsAlias escapees() { return in(0).escapees(); }
88  @Override public TypeMem all_live() { return TypeMem.ALLMEM; }
89  // Only called here if alive, and input is more-than-basic-alive
90  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) {
91  if( def==in(0) && in(0) instanceof NewNode && _live.at(nnn()._alias).above_center() )
92  return TypeMem.DEAD;
93  return _live;
94  }
95 
96  //@Override public TV2 new_tvar( String alloc_site) { return TV2.make_mem(this,alloc_site); }
97  //
98  //@Override public boolean unify( boolean test ) {
99  // if( !(in(0) instanceof NewNode) ) return false;
100  // TV2 tmem = mem().tvar();
101  // if( !tmem.isa("Mem") ) return false;
102  // TV2 tself = tvar();
103  // return tself.unify(tmem,test) | // Unify bulk memory
104  // tmem.unify_at(nnn()._alias,nnn().tvar(),test); // Unify at the alias
105  //}
106 
107 }
com.cliffc.aa.GVNGCM.add_grow
void add_grow(Node n)
Definition: GVNGCM.java:52
com.cliffc.aa.node.MrgProjNode.nnn
NewNode nnn()
Definition: MrgProjNode.java:14
com.cliffc.aa.node.Node.escapees
BitsAlias escapees()
Definition: Node.java:859
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.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
com.cliffc.aa.node.MrgProjNode.add_flow_def_extra
void add_flow_def_extra(Node chg)
Definition: MrgProjNode.java:59
com.cliffc.aa.node.Node
Definition: Node.java:16
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.AA.MEM_IDX
static final int MEM_IDX
Definition: AA.java:14
com.cliffc.aa.node.MrgProjNode.all_live
TypeMem all_live()
Definition: MrgProjNode.java:88
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.node.CallNode
Definition: CallNode.java:86
com.cliffc.aa.node.NewNode.kill2
void kill2()
Definition: NewNode.java:102
com.cliffc.aa.node.Node.is_prim
boolean is_prim()
Definition: Node.java:260
com.cliffc.aa.node.MrgProjNode.is_mem
boolean is_mem()
Definition: MrgProjNode.java:13
com.cliffc.aa.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.node.MrgProjNode.xstr
String xstr()
Definition: MrgProjNode.java:12
com.cliffc.aa.type.TypeObj
Definition: TypeObj.java:15
com.cliffc.aa.node.ProjNode._idx
int _idx
Definition: ProjNode.java:12
com.cliffc.aa.node.Node._keep
byte _keep
Definition: Node.java:86
com.cliffc.aa.type.TypeObj.UNUSED
static final TypeObj UNUSED
Definition: TypeObj.java:46
com.cliffc.aa.node.Node.in
Node in(int i)
Definition: Node.java:126
com.cliffc.aa.node.MemSplitNode.check_split
static boolean check_split(Node head1, BitsAlias head1_escs)
Definition: MemSplitNode.java:165
com.cliffc.aa.GVNGCM
Definition: GVNGCM.java:12
com.cliffc.aa.type.TypeMem.set
TypeMem set(int alias, TypeObj obj)
Definition: TypeMem.java:434
com.cliffc.aa.node.ProjNode
Definition: ProjNode.java:11
com.cliffc.aa.node.Node._uses
Ary< Node > _uses
Definition: Node.java:245
com.cliffc.aa.node.MrgProjNode.escapees
BitsAlias escapees()
Definition: MrgProjNode.java:87
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
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.MrgProjNode.ideal_reduce
Node ideal_reduce()
Definition: MrgProjNode.java:18
com.cliffc.aa.node.MrgProjNode
Definition: MrgProjNode.java:10
com.cliffc.aa.node.MemJoinNode.add_alias_below_new
MemJoinNode add_alias_below_new(Node nnn, Node old)
Definition: MemJoinNode.java:240
com.cliffc.aa.node.MrgProjNode.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: MrgProjNode.java:90
com.cliffc.aa.node.MrgProjNode.MrgProjNode
MrgProjNode(NewNode nnn, Node mem)
Definition: MrgProjNode.java:11
com.cliffc.aa.GVNGCM.add_reduce
public< N extends Node > N add_reduce(N n)
Definition: GVNGCM.java:49
com.cliffc.aa.node.MrgProjNode.ideal_grow
Node ideal_grow()
Definition: MrgProjNode.java:48
com.cliffc.aa.node.MemSplitNode
Definition: MemSplitNode.java:19
com.cliffc.aa.node.MrgProjNode.ideal_mono
Node ideal_mono()
Definition: MrgProjNode.java:46
com.cliffc.aa.type.TypeMem.st_new
TypeMem st_new(int alias, TypeObj obj)
Definition: TypeMem.java:446
com.cliffc.aa.type.Type.oob
Type oob()
Definition: Type.java:635
com.cliffc.aa.node.MrgProjNode.value
Type value(GVNGCM.Mode opt_mode)
Definition: MrgProjNode.java:73
com.cliffc.aa.node.NewNode._alias
int _alias
Definition: NewNode.java:20
com.cliffc.aa.node.MemJoinNode.find_sese_head
static Node find_sese_head(Node mem)
Definition: MemJoinNode.java:72
com
com.cliffc.aa.Env.DEFMEM
static DefMemNode DEFMEM
Definition: Env.java:19
com.cliffc.aa.node.MemSplitNode.insert_split
static Node insert_split(Node tail1, BitsAlias head1_escs, Node head1, Node tail2, Node head2)
Definition: MemSplitNode.java:142
com.cliffc.aa.type.TypeMem.at
TypeObj at(int alias)
Definition: TypeMem.java:135
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14
com.cliffc.aa.node.NewNode.is_unused
boolean is_unused()
Definition: NewNode.java:100