aa
TestLive.java
Go to the documentation of this file.
1 package com.cliffc.aa;
2 
3 import com.cliffc.aa.node.*;
4 import com.cliffc.aa.type.*;
5 import org.junit.Test;
6 
7 import static com.cliffc.aa.AA.REZ_IDX;
8 import static com.cliffc.aa.type.TypeFld.Access;
9 import static org.junit.Assert.assertEquals;
10 import static org.junit.Assert.assertTrue;
11 
12 public class TestLive {
13  @Test public void testBasic() {
14  GVNGCM gvn = new GVNGCM();
16 
17  // Liveness is a backwards flow. Scope always demands all return results.
18  ScopeNode scope = new ScopeNode(null,false);
19 
20  Node fullmem = new ConNode<>(TypeMem.FULL);
21  fullmem._val = TypeMem.FULL;
22  scope.set_mem(fullmem);
23 
24  // Return the number '5' - should be alive with no special memory.
25  Node rez = new ConNode<>(TypeInt.con(5));
26  rez._val = TypeInt.con(5);
27  scope.set_rez(rez);
28 
29  // Check liveness base case
30  scope.xliv(gvn._opt_mode);
31  assertEquals(TypeMem.ANYMEM,scope._live);
32 
33  // Check liveness recursive back one step
34  rez.xliv(GVNGCM.Mode.PesiCG);
35  assertEquals(TypeMem.ESCAPE,rez._live);
36  }
37 
38  @SuppressWarnings("unchecked")
39  @Test public void testNewObj() {
40  Env env = Env.top_scope();
41  GVNGCM gvn = Env.GVN;
42  Node._INIT0_CNT = 1; // No prims
43  // Always memory for the NewObj
44  Node mmm = new ConNode<>(TypeMem.ANYMEM).keep();
45  mmm._val = TypeMem.ANYMEM;
46 
47  // Fields
48  Type ti5 = TypeInt.con(5);
49  ConNode fdx = new ConNode(ti5);
50  fdx._val = ti5;
51  Type ti9 = TypeInt.con(9);
52  ConNode<Type> fdy = new ConNode<>(ti9);
53  fdy._val = ti9;
54 
55  // New object, fields x,y holding ints
57  nnn.create_active("x",fdx,Access.Final);
58  nnn.create_active("y",fdy,Access.Final);
59  nnn._val = Type.ANY;
60  nnn.no_more_fields();
61  nnn.xval();
62  nnn._live = TypeMem.LIVE_BOT;
63 
64  // Proj, OProj
65  Node mem = new MrgProjNode(nnn,mmm);
66  mem.xval();
67  Node ptr = new ProjNode(REZ_IDX, nnn);
68  ptr.xval();
69 
70  // Use the object for scope exit
71  ScopeNode scope = new ScopeNode(null,false);
72  scope.set_mem(mem);
73  scope.set_rez(ptr);
74  scope._val = Type.ALL;
75 
76  // Check 'live' is stable on creation, except for mem & scope
77  // which are 'turning around' liveness.
78  // Value was computed in a forwards flow.
79  for( Node n : new Node[]{mmm,fdx,fdy,nnn,mem,ptr,scope} ) {
80  if( n != mem && n != scope )
81  assertTrue(n.live(gvn._opt_mode).isa(n._live));
82  assertEquals(n._val,n.value(gvn._opt_mode));
83  }
84 
85  // Check liveness base case
86  scope.xliv(GVNGCM.Mode.PesiNoCG);
87  // Since simple forwards-flow, the default memory is known UNUSED.
88  // However, we got provided at least one object.
89  TypeMem expected_live = ((TypeMem) mem._val).flatten_fields();
90  assertEquals(scope._live,expected_live);
91 
92  // Check liveness recursive back one step
93  ptr.xliv(GVNGCM.Mode.PesiNoCG);
94  assertEquals(TypeMem.ESCAPE,ptr._live); // Ptr is all_type, conservative so all memory alive
95  mem.xliv(GVNGCM.Mode.PesiNoCG);
96  assertEquals(mem._live,expected_live); // Object demands of OProj, but OProj passes along request to NewObj
97  nnn.xliv(GVNGCM.Mode.PesiNoCG);
98  assertEquals(expected_live,nnn._live); // NewObj supplies object, needs what its input needs
99  mmm.xliv(GVNGCM.Mode.PesiNoCG);
100  assertEquals(TypeMem.ALIVE,mmm._live); // Since ptr is scalar, all memory is alive
101  fdx.xliv(GVNGCM.Mode.PesiNoCG);
102  assertEquals(TypeMem.ESCAPE,fdx._live); // Since ptr is scalar, all memory is alive
103 
104  }
105 }
com.cliffc.aa.type.TypeFld.Access.Final
Final
Definition: TypeFld.java:112
com.cliffc.aa.TestLive.testNewObj
void testNewObj()
Definition: TestLive.java:39
com.cliffc.aa.node.NewObjNode.no_more_fields
void no_more_fields()
Definition: NewObjNode.java:48
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.Mode.PesiCG
PesiCG
Definition: GVNGCM.java:18
com.cliffc.aa.node.Node._live
TypeMem _live
Definition: Node.java:89
com.cliffc
com.cliffc.aa.Env.top_scope
static Env top_scope()
Definition: Env.java:72
com.cliffc.aa.type.TypeFld
Definition: TypeFld.java:12
com.cliffc.aa.node.ScopeNode
Definition: ScopeNode.java:17
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.type.TypeInt
Definition: TypeInt.java:9
com.cliffc.aa.type.TypeMem.ESCAPE
static final TypeMem ESCAPE
Definition: TypeMem.java:227
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.Node.keep
public< N extends Node > N keep()
Definition: Node.java:228
com.cliffc.aa.type.TypeInt.con
static TypeInt con(long con)
Definition: TypeInt.java:37
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.ConNode
Definition: ConNode.java:9
Test
com.cliffc.aa.type.TypeMem.ANYMEM
static final TypeMem ANYMEM
Definition: TypeMem.java:228
com.cliffc.aa.GVNGCM.Mode.PesiNoCG
PesiNoCG
Definition: GVNGCM.java:16
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.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.type.TypeMemPtr.DISPLAY
static final TypeStruct DISPLAY
Definition: TypeMemPtr.java:78
com.cliffc.aa.type.TypeMem.FULL
static final TypeMem FULL
Definition: TypeMem.java:222
com.cliffc.aa.AA.REZ_IDX
static final int REZ_IDX
Definition: AA.java:16
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.node.Node._INIT0_CNT
static int _INIT0_CNT
Definition: Node.java:58
com.cliffc.aa.node.ProjNode
Definition: ProjNode.java:11
com.cliffc.aa.node.NewObjNode
Definition: NewObjNode.java:20
com.cliffc.aa.type.Type.NIL
static final Type NIL
Definition: Type.java:332
com.cliffc.aa.node.Node.con
static Node con(Type t)
Definition: Node.java:670
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.node.ScopeNode.set_rez
void set_rez(Node n)
Definition: ScopeNode.java:51
com.cliffc.aa.node.MrgProjNode
Definition: MrgProjNode.java:10
com.cliffc.aa.TestLive
Definition: TestLive.java:12
com.cliffc.aa.node.NewObjNode.create_active
void create_active(String name, Node val, Access mutable)
Definition: NewObjNode.java:57
com.cliffc.aa.node.Node.xval
Type xval()
Definition: Node.java:460
com.cliffc.aa.GVNGCM._opt_mode
Mode _opt_mode
Definition: GVNGCM.java:22
com.cliffc.aa.type.TypeFld.Access
Definition: TypeFld.java:109
com
com.cliffc.aa.Env
Definition: Env.java:12
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.type.TypeMemPtr
Definition: TypeMemPtr.java:14
com.cliffc.aa.node
Definition: AssertNode.java:1
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14
com.cliffc.aa.node.Node.xliv
Node xliv(GVNGCM.Mode opt_mode)
Definition: Node.java:500
com.cliffc.aa.TestLive.testBasic
void testBasic()
Definition: TestLive.java:13