Mercurial > hg > truffle
annotate graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java @ 11450:bd1a12a78a51
add full canonicalization to EA tests
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Thu, 29 Aug 2013 15:35:17 +0200 |
parents | 58b72cc17109 |
children | c69df2e602f4 |
rev | line source |
---|---|
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
1 /* |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
4 * |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
8 * |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
13 * accompanied this code). |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
14 * |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
18 * |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
21 * questions. |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
22 */ |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
23 package com.oracle.graal.compiler.test.ea; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
24 |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
25 import java.util.concurrent.*; |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
26 |
10088
9d0c16df0bc7
junit.framework package is deprecated
Andreas Woess <andreas.woess@jku.at>
parents:
10047
diff
changeset
|
27 import org.junit.*; |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
28 |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6711
diff
changeset
|
29 import com.oracle.graal.api.code.*; |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
30 import com.oracle.graal.compiler.test.*; |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
31 import com.oracle.graal.debug.*; |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
32 import com.oracle.graal.graph.*; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
33 import com.oracle.graal.nodes.*; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
34 import com.oracle.graal.nodes.java.*; |
9238
8f01fe16e473
refactorings and cleanups for the removal of FixedNode.probability
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9234
diff
changeset
|
35 import com.oracle.graal.nodes.util.*; |
9501
bef43373de39
coalesce allocations during escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
9265
diff
changeset
|
36 import com.oracle.graal.nodes.virtual.*; |
6525
2c913b643422
rename packages in graal.phases to match project name
Doug Simon <doug.simon@oracle.com>
parents:
6524
diff
changeset
|
37 import com.oracle.graal.phases.*; |
6526
ee651c726397
split phases out of graal.phases project into graal.phases.common project
Doug Simon <doug.simon@oracle.com>
parents:
6525
diff
changeset
|
38 import com.oracle.graal.phases.common.*; |
9238
8f01fe16e473
refactorings and cleanups for the removal of FixedNode.probability
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9234
diff
changeset
|
39 import com.oracle.graal.phases.graph.*; |
9050
b393a023dd4e
Make PartialEscapeAnalysisPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
9049
diff
changeset
|
40 import com.oracle.graal.phases.tiers.*; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6649
diff
changeset
|
41 import com.oracle.graal.virtual.phases.ea.*; |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
42 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
43 /** |
9501
bef43373de39
coalesce allocations during escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
9265
diff
changeset
|
44 * The PartialEscapeAnalysisPhase is expected to remove all allocations and return the correct |
bef43373de39
coalesce allocations during escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
9265
diff
changeset
|
45 * values. |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
46 */ |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
47 public class PartialEscapeAnalysisTest extends GraalCompilerTest { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
48 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
49 public static class TestObject { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
50 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
51 public int x; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
52 public int y; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
53 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
54 public TestObject(int x, int y) { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
55 this.x = x; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
56 this.y = y; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
57 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
58 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
59 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
60 public static class TestObject2 { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
61 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
62 public Object x; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
63 public Object y; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
64 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
65 public TestObject2(Object x, Object y) { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
66 this.x = x; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
67 this.y = y; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
68 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
69 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
70 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
71 @Test |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
72 public void test1() { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
73 testMaterialize("test1Snippet", 0.25, 1); |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
74 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
75 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
76 @SuppressWarnings("all") |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
77 public static Object test1Snippet(int a, int b, Object x, Object y) { |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
78 TestObject2 obj = new TestObject2(x, y); |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
79 if (a < 0) { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
80 if (b < 0) { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
81 return obj; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
82 } else { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
83 return obj.y; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
84 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
85 } else { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
86 return obj.x; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
87 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
88 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
89 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
90 @Test |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
91 public void test2() { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
92 testMaterialize("test2Snippet", 1.5, 3, LoadIndexedNode.class); |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
93 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
94 |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
95 public static Object test2Snippet(int a, Object x, Object y, Object z) { |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
96 TestObject2 obj = new TestObject2(x, y); |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
97 obj.x = new TestObject2(obj, z); |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
98 if (a < 0) { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
99 ((TestObject2) obj.x).y = null; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
100 obj.y = null; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
101 return obj; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
102 } else { |
6711
ae13cc658b80
fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
6657
diff
changeset
|
103 ((TestObject2) obj.x).y = Integer.class; |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
104 ((TestObject2) obj.x).x = null; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
105 return obj.x; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
106 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
107 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
108 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
109 @Test |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
110 public void test3() { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
111 testMaterialize("test3Snippet", 0.5, 1, StoreFieldNode.class, LoadFieldNode.class); |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
112 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
113 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
114 public static Object test3Snippet(int a) { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
115 if (a < 0) { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
116 TestObject obj = new TestObject(1, 2); |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
117 obj.x = 123; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
118 obj.y = 234; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
119 obj.x = 123111; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
120 obj.y = new Integer(123).intValue(); |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
121 return obj; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
122 } else { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
123 return null; |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
124 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
125 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
126 |
11450
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
127 @Test |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
128 public void testCache() { |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
129 testMaterialize("testCacheSnippet", 0.5, 1); |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
130 } |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
131 |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
132 public static class CacheKey { |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
133 |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
134 private final int idx; |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
135 private final Object ref; |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
136 |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
137 public CacheKey(int idx, Object ref) { |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
138 this.idx = idx; |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
139 this.ref = ref; |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
140 } |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
141 |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
142 @Override |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
143 public int hashCode() { |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
144 return 31 * idx + ref.hashCode(); |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
145 } |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
146 |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
147 public synchronized boolean equals(CacheKey other) { |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
148 return idx == other.idx && ref == other.ref; |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
149 } |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
150 } |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
151 |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
152 public static CacheKey cacheKey = null; |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
153 public static Object value = null; |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
154 |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
155 private static native Object createValue(CacheKey key); |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
156 |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
157 public static Object testCacheSnippet(int idx, Object ref) { |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
158 CacheKey key = new CacheKey(idx, ref); |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
159 if (!key.equals(cacheKey)) { |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
160 cacheKey = key; |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
161 value = createValue(key); |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
162 } |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
163 return value; |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
164 } |
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
165 |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
166 @SafeVarargs |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
167 final void testMaterialize(final String snippet, double expectedProbability, int expectedCount, Class<? extends Node>... invalidNodeClasses) { |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
168 StructuredGraph result = processMethod(snippet); |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
169 try { |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
170 Assert.assertTrue("partial escape analysis should have removed all NewInstanceNode allocations", result.getNodes(NewInstanceNode.class).isEmpty()); |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
171 Assert.assertTrue("partial escape analysis should have removed all NewArrayNode allocations", result.getNodes(NewArrayNode.class).isEmpty()); |
9234
b9cf7d0b598e
removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9091
diff
changeset
|
172 |
9238
8f01fe16e473
refactorings and cleanups for the removal of FixedNode.probability
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9234
diff
changeset
|
173 NodesToDoubles nodeProbabilities = new ComputeProbabilityClosure(result).apply(); |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
174 double probabilitySum = 0; |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
175 int materializeCount = 0; |
9501
bef43373de39
coalesce allocations during escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
9265
diff
changeset
|
176 for (CommitAllocationNode materialize : result.getNodes(CommitAllocationNode.class)) { |
bef43373de39
coalesce allocations during escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
9265
diff
changeset
|
177 probabilitySum += nodeProbabilities.get(materialize) * materialize.getVirtualObjects().size(); |
bef43373de39
coalesce allocations during escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
9265
diff
changeset
|
178 materializeCount += materialize.getVirtualObjects().size(); |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
179 } |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
180 Assert.assertEquals("unexpected number of MaterializeObjectNodes", expectedCount, materializeCount); |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
181 Assert.assertEquals("unexpected probability of MaterializeObjectNodes", expectedProbability, probabilitySum, 0.01); |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
182 for (Node node : result.getNodes()) { |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
183 for (Class<? extends Node> clazz : invalidNodeClasses) { |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
184 Assert.assertFalse("instance of invalid class: " + clazz.getSimpleName(), clazz.isInstance(node) && node.usages().isNotEmpty()); |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
185 } |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
186 } |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
187 } catch (AssertionError e) { |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
188 TypeSystemTest.outputGraph(result, snippet + ": " + e.getMessage()); |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
189 throw e; |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
190 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
191 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
192 |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
193 private StructuredGraph processMethod(final String snippet) { |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
194 return Debug.scope("PartialEscapeAnalysisTest " + snippet, new DebugDumpScope(snippet), new Callable<StructuredGraph>() { |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
195 |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
196 @Override |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
197 public StructuredGraph call() { |
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
198 StructuredGraph graph = parse(snippet); |
9234
b9cf7d0b598e
removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9091
diff
changeset
|
199 |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
200 Assumptions assumptions = new Assumptions(false); |
10931
a9db73ccb7b9
Add more fields to HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents:
10088
diff
changeset
|
201 HighTierContext context = new HighTierContext(runtime(), assumptions, replacements, null, getDefaultPhasePlan(), OptimisticOptimizations.ALL); |
10933
9878214a0093
Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents:
10931
diff
changeset
|
202 new InliningPhase().apply(graph, context); |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
203 new DeadCodeEliminationPhase().apply(graph); |
11450
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
204 new CanonicalizerPhase(true).apply(graph, context); |
11437
58b72cc17109
incremental canonicalization for PartialEscapePhase / EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
10933
diff
changeset
|
205 new PartialEscapePhase(false).apply(graph, context); |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
206 |
10047
30499c84823d
remove CullFrameStatesPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9944
diff
changeset
|
207 for (MergeNode merge : graph.getNodes(MergeNode.class)) { |
30499c84823d
remove CullFrameStatesPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9944
diff
changeset
|
208 merge.setStateAfter(null); |
30499c84823d
remove CullFrameStatesPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9944
diff
changeset
|
209 } |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
210 new DeadCodeEliminationPhase().apply(graph); |
11450
bd1a12a78a51
add full canonicalization to EA tests
Lukas Stadler <lukas.stadler@jku.at>
parents:
11437
diff
changeset
|
211 new CanonicalizerPhase(true).apply(graph, context); |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
212 return graph; |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
213 } |
8928
5075e8f0a380
PEA: fix PartialEscapeAnalysisTest
Lukas Stadler <lukas.stadler@jku.at>
parents:
8622
diff
changeset
|
214 }); |
6360
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
215 } |
e5203e5843fc
first prototype of new PartialEscapeAnalysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
216 } |