blob: 865355ce974d4960f158d348dd4c9c61fd84787d [file] [log] [blame]
Calin Juravle10e244f2015-01-26 18:54:32 +00001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17public class Main {
18
David Brazdil4833f5a2015-12-16 10:37:39 +000019 /// CHECK-START: Main Main.keepTest(Main) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +010020 /// CHECK: NullCheck
21 /// CHECK: InvokeStaticOrDirect
Calin Juravle10e244f2015-01-26 18:54:32 +000022
David Brazdil4833f5a2015-12-16 10:37:39 +000023 /// CHECK-START: Main Main.keepTest(Main) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +010024 /// CHECK: NullCheck
25 /// CHECK: InvokeStaticOrDirect
Calin Juravle10e244f2015-01-26 18:54:32 +000026 public Main keepTest(Main m) {
27 return m.g();
28 }
29
Nicolas Geoffray454a4812015-06-09 10:37:32 +010030 /// CHECK-START: Main Main.thisTest() ssa_builder (after)
David Brazdila06d66a2015-05-28 11:14:54 +010031 /// CHECK: NullCheck
32 /// CHECK: InvokeStaticOrDirect
Calin Juravle10e244f2015-01-26 18:54:32 +000033
David Brazdil4833f5a2015-12-16 10:37:39 +000034 /// CHECK-START: Main Main.thisTest() instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +010035 /// CHECK-NOT: NullCheck
36 /// CHECK: InvokeStaticOrDirect
Calin Juravle10e244f2015-01-26 18:54:32 +000037 public Main thisTest() {
38 return g();
39 }
40
Nicolas Geoffray454a4812015-06-09 10:37:32 +010041 /// CHECK-START: Main Main.newInstanceRemoveTest() ssa_builder (after)
David Brazdila06d66a2015-05-28 11:14:54 +010042 /// CHECK: NewInstance
43 /// CHECK: NullCheck
44 /// CHECK: InvokeStaticOrDirect
45 /// CHECK: NullCheck
46 /// CHECK: InvokeStaticOrDirect
Calin Juravle10e244f2015-01-26 18:54:32 +000047
David Brazdil4833f5a2015-12-16 10:37:39 +000048 /// CHECK-START: Main Main.newInstanceRemoveTest() instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +010049 /// CHECK-NOT: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +000050 public Main newInstanceRemoveTest() {
51 Main m = new Main();
52 return m.g();
53 }
54
Nicolas Geoffray454a4812015-06-09 10:37:32 +010055 /// CHECK-START: Main Main.newArrayRemoveTest() ssa_builder (after)
David Brazdila06d66a2015-05-28 11:14:54 +010056 /// CHECK: NewArray
57 /// CHECK: NullCheck
58 /// CHECK: ArrayGet
Calin Juravle10e244f2015-01-26 18:54:32 +000059
David Brazdil4833f5a2015-12-16 10:37:39 +000060 /// CHECK-START: Main Main.newArrayRemoveTest() instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +010061 /// CHECK: NewArray
62 /// CHECK-NOT: NullCheck
63 /// CHECK: ArrayGet
Calin Juravle10e244f2015-01-26 18:54:32 +000064 public Main newArrayRemoveTest() {
65 Main[] ms = new Main[1];
66 return ms[0];
67 }
68
David Brazdil4833f5a2015-12-16 10:37:39 +000069 /// CHECK-START: Main Main.ifRemoveTest(boolean) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +010070 /// CHECK: NewInstance
71 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +000072
David Brazdil4833f5a2015-12-16 10:37:39 +000073 /// CHECK-START: Main Main.ifRemoveTest(boolean) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +010074 /// CHECK: NewInstance
75 /// CHECK-NOT: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +000076 public Main ifRemoveTest(boolean flag) {
77 Main m = null;
78 if (flag) {
79 m = new Main();
80 } else {
81 m = new Main(1);
82 }
83 return m.g();
84 }
85
David Brazdil4833f5a2015-12-16 10:37:39 +000086 /// CHECK-START: Main Main.ifKeepTest(boolean) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +010087 /// CHECK: NewInstance
88 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +000089
David Brazdil4833f5a2015-12-16 10:37:39 +000090 /// CHECK-START: Main Main.ifKeepTest(boolean) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +010091 /// CHECK: NewInstance
92 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +000093 public Main ifKeepTest(boolean flag) {
94 Main m = null;
95 if (flag) {
96 m = new Main(1);
97 }
98 return m.g();
99 }
100
David Brazdil4833f5a2015-12-16 10:37:39 +0000101 /// CHECK-START: Main Main.forRemoveTest(int) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +0100102 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000103
David Brazdil4833f5a2015-12-16 10:37:39 +0000104 /// CHECK-START: Main Main.forRemoveTest(int) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +0100105 /// CHECK-NOT: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000106 public Main forRemoveTest(int count) {
107 Main a = new Main();
108 Main m = new Main();
109 for (int i = 0; i < count; i++) {
110 if (i % 2 == 0) {
111 m = a;
112 }
113 }
114 return m.g();
115 }
116
David Brazdil4833f5a2015-12-16 10:37:39 +0000117 /// CHECK-START: Main Main.forKeepTest(int) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +0100118 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000119
David Brazdil4833f5a2015-12-16 10:37:39 +0000120 /// CHECK-START: Main Main.forKeepTest(int) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +0100121 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000122 public Main forKeepTest(int count) {
123 Main a = new Main();
124 Main m = new Main();
125 for (int i = 0; i < count; i++) {
126 if (i % 2 == 0) {
127 m = a;
128 } else {
129 m = null;
130 }
131 }
132 return m.g();
133 }
134
David Brazdil4833f5a2015-12-16 10:37:39 +0000135 /// CHECK-START: Main Main.phiFlowRemoveTest(int) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +0100136 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000137
David Brazdil4833f5a2015-12-16 10:37:39 +0000138 /// CHECK-START: Main Main.phiFlowRemoveTest(int) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +0100139 /// CHECK-NOT: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000140 public Main phiFlowRemoveTest(int count) {
141 Main a = new Main();
142 Main m = new Main();
143 for (int i = 0; i < count; i++) {
144 if (i % 2 == 0) {
145 m = a;
146 }
147 }
148 Main n = new Main();
149 for (int i = 0; i < count; i++) {
150 if (i % 3 == 0) {
151 n = m;
152 }
153 }
154 return n.g();
155 }
156
David Brazdil4833f5a2015-12-16 10:37:39 +0000157 /// CHECK-START: Main Main.phiFlowKeepTest(int) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +0100158 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000159
David Brazdil4833f5a2015-12-16 10:37:39 +0000160 /// CHECK-START: Main Main.phiFlowKeepTest(int) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +0100161 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000162 public Main phiFlowKeepTest(int count) {
163 Main a = new Main();
164 Main m = new Main();
165 for (int i = 0; i < count; i++) {
166 if (i % 2 == 0) {
167 m = a;
168 } else {
169 m = null;
170 }
171 }
172 Main n = new Main();
173 for (int i = 0; i < count; i++) {
174 if (i % 3 == 0) {
175 n = m;
176 }
177 }
178 return n.g();
179 }
180
Nicolas Geoffray454a4812015-06-09 10:37:32 +0100181 /// CHECK-START: Main Main.scopeRemoveTest(int, Main) ssa_builder (after)
David Brazdila06d66a2015-05-28 11:14:54 +0100182 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000183
David Brazdil4833f5a2015-12-16 10:37:39 +0000184 /// CHECK-START: Main Main.scopeRemoveTest(int, Main) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +0100185 /// CHECK-NOT: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000186 public Main scopeRemoveTest(int count, Main a) {
187 Main m = null;
188 for (int i = 0; i < count; i++) {
189 if (i % 2 == 0) {
190 m = new Main();
191 m.g();
192 } else {
193 m = a;
194 }
195 }
196 return m;
197 }
198
David Brazdil4833f5a2015-12-16 10:37:39 +0000199 /// CHECK-START: Main Main.scopeKeepTest(int, Main) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +0100200 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000201
David Brazdil4833f5a2015-12-16 10:37:39 +0000202 /// CHECK-START: Main Main.scopeKeepTest(int, Main) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +0100203 /// CHECK: NullCheck
Calin Juravle10e244f2015-01-26 18:54:32 +0000204 public Main scopeKeepTest(int count, Main a) {
205 Main m = new Main();
206 for (int i = 0; i < count; i++) {
207 if (i % 2 == 0) {
208 m = a;
209 } else {
210 m = a;
211 m.g();
212 }
213 }
214 return m;
215 }
216
David Brazdil4833f5a2015-12-16 10:37:39 +0000217 /// CHECK-START: Main Main.scopeIfNotNullRemove(Main) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +0100218 /// CHECK: NullCheck
Calin Juravle61d544b2015-02-23 16:46:57 +0000219
David Brazdil4833f5a2015-12-16 10:37:39 +0000220 /// CHECK-START: Main Main.scopeIfNotNullRemove(Main) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +0100221 /// CHECK-NOT: NullCheck
Calin Juravle61d544b2015-02-23 16:46:57 +0000222 public Main scopeIfNotNullRemove(Main m) {
223 if (m != null) {
224 return m.g();
225 }
226 return m;
227 }
228
David Brazdil4833f5a2015-12-16 10:37:39 +0000229 /// CHECK-START: Main Main.scopeIfKeep(Main) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +0100230 /// CHECK: NullCheck
Calin Juravle61d544b2015-02-23 16:46:57 +0000231
David Brazdil4833f5a2015-12-16 10:37:39 +0000232 /// CHECK-START: Main Main.scopeIfKeep(Main) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +0100233 /// CHECK: NullCheck
Calin Juravle61d544b2015-02-23 16:46:57 +0000234 public Main scopeIfKeep(Main m) {
235 if (m == null) {
236 m = new Main();
237 }
238 return m.g();
239 }
240
Calin Juravle10e244f2015-01-26 18:54:32 +0000241 public Main() {}
242 public Main(int dummy) {}
243
244 private Main g() {
245 // avoids inlining
246 throw new RuntimeException();
247 }
248
249 public static void main(String[] args) {
250 new Main();
251 }
252
253}
Calin Juravlea4f88312015-04-16 12:57:19 +0100254
255// Regression for when we created and kept equivalent phis with the same type.
256// The phi used in comparison would be different then the one used for access
257// so we could not safely discard it.
258class ListElement {
259 private ListElement next;
260
David Brazdil4833f5a2015-12-16 10:37:39 +0000261 /// CHECK-START: boolean ListElement.isShorter(ListElement, ListElement) instruction_simplifier (before)
David Brazdila06d66a2015-05-28 11:14:54 +0100262 /// CHECK: NullCheck
263 /// CHECK: NullCheck
Calin Juravlea4f88312015-04-16 12:57:19 +0100264
David Brazdil4833f5a2015-12-16 10:37:39 +0000265 /// CHECK-START: boolean ListElement.isShorter(ListElement, ListElement) instruction_simplifier (after)
David Brazdila06d66a2015-05-28 11:14:54 +0100266 /// CHECK-NOT: NullCheck
Calin Juravlea4f88312015-04-16 12:57:19 +0100267 static boolean isShorter(ListElement x, ListElement y) {
268 ListElement xTail = x;
269 ListElement yTail = y;
270 while (yTail != null) {
271 if (xTail == null) return true;
272 xTail = xTail.next;
273 yTail = yTail.next;
274 }
275 return false;
276 }
277}