1 /*
2 * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 import jdk.incubator.code.Reflect;
25
26 /*
27 * @test
28 * @summary Smoke test for code reflection with if statements.
29 * @modules jdk.incubator.code
30 * @build IfTest
31 * @build CodeReflectionTester
32 * @run main CodeReflectionTester IfTest
33 */
34
35 public class IfTest {
36 @Reflect
37 @IR("""
38 func @"test1" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
39 %2 : Var<java.type:"int"> = var %1 @"i";
40 java.if
41 ()java.type:"boolean" -> {
42 %3 : java.type:"int" = var.load %2;
43 %4 : java.type:"int" = constant @1;
44 %5 : java.type:"boolean" = lt %3 %4;
45 yield %5;
46 }
47 ()java.type:"void" -> {
48 %6 : java.type:"int" = constant @1;
49 var.store %2 %6;
50 yield;
51 };
52 return;
53 };
54 """)
55 void test1(int i) {
56 if (i < 1) {
57 i = 1;
58 }
59 }
60
61 @Reflect
62 @IR("""
63 func @"test2" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
64 %2 : Var<java.type:"int"> = var %1 @"i";
65 java.if
66 ()java.type:"boolean" -> {
67 %3 : java.type:"int" = var.load %2;
68 %4 : java.type:"int" = constant @1;
69 %5 : java.type:"boolean" = lt %3 %4;
70 yield %5;
71 }
72 ()java.type:"void" -> {
73 %6 : java.type:"int" = constant @1;
74 var.store %2 %6;
75 yield;
76 }
77 ()java.type:"void" -> {
78 %7 : java.type:"int" = constant @2;
79 var.store %2 %7;
80 yield;
81 };
82 return;
83 };
84 """)
85 void test2(int i) {
86 if (i < 1) {
87 i = 1;
88 } else {
89 i = 2;
90 }
91 }
92
93 @Reflect
94 @IR("""
95 func @"test3" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
96 %2 : Var<java.type:"int"> = var %1 @"i";
97 java.if
98 ()java.type:"boolean" -> {
99 %3 : java.type:"int" = var.load %2;
100 %4 : java.type:"int" = constant @1;
101 %5 : java.type:"boolean" = lt %3 %4;
102 yield %5;
103 }
104 ()java.type:"void" -> {
105 %6 : java.type:"int" = constant @1;
106 var.store %2 %6;
107 yield;
108 }
109 ()java.type:"boolean" -> {
110 %7 : java.type:"int" = var.load %2;
111 %8 : java.type:"int" = constant @2;
112 %9 : java.type:"boolean" = lt %7 %8;
113 yield %9;
114 }
115 ()java.type:"void" -> {
116 %10 : java.type:"int" = constant @2;
117 var.store %2 %10;
118 yield;
119 };
120 return;
121 };
122 """)
123 void test3(int i) {
124 if (i < 1) {
125 i = 1;
126 } else if (i < 2) {
127 i = 2;
128 }
129 }
130
131 @Reflect
132 @IR("""
133 func @"test4" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
134 %2 : Var<java.type:"int"> = var %1 @"i";
135 java.if
136 ()java.type:"boolean" -> {
137 %3 : java.type:"int" = var.load %2;
138 %4 : java.type:"int" = constant @1;
139 %5 : java.type:"boolean" = lt %3 %4;
140 yield %5;
141 }
142 ()java.type:"void" -> {
143 %6 : java.type:"int" = constant @1;
144 var.store %2 %6;
145 yield;
146 }
147 ()java.type:"boolean" -> {
148 %7 : java.type:"int" = var.load %2;
149 %8 : java.type:"int" = constant @2;
150 %9 : java.type:"boolean" = lt %7 %8;
151 yield %9;
152 }
153 ()java.type:"void" -> {
154 %10 : java.type:"int" = constant @2;
155 var.store %2 %10;
156 yield;
157 }
158 ()java.type:"void" -> {
159 %11 : java.type:"int" = constant @3;
160 var.store %2 %11;
161 yield;
162 };
163 return;
164 };
165 """)
166 void test4(int i) {
167 if (i < 1) {
168 i = 1;
169 } else if (i < 2) {
170 i = 2;
171 } else {
172 i = 3;
173 }
174 }
175
176 @IR("""
177 func @"test5" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"int" -> {
178 %2 : Var<java.type:"int"> = var %1 @"i";
179 java.if
180 ()java.type:"boolean" -> {
181 %3 : java.type:"int" = var.load %2;
182 %4 : java.type:"int" = constant @1;
183 %5 : java.type:"boolean" = lt %3 %4;
184 yield %5;
185 }
186 ()java.type:"void" -> {
187 %6 : java.type:"int" = constant @1;
188 return %6;
189 }
190 ()java.type:"boolean" -> {
191 %7 : java.type:"int" = var.load %2;
192 %8 : java.type:"int" = constant @2;
193 %9 : java.type:"boolean" = lt %7 %8;
194 yield %9;
195 }
196 ()java.type:"void" -> {
197 %10 : java.type:"int" = constant @2;
198 return %10;
199 }
200 ()java.type:"void" -> {
201 %11 : java.type:"int" = constant @3;
202 return %11;
203 };
204 unreachable;
205 };
206 """)
207 @Reflect
208 int test5(int i) {
209 if (i < 1) {
210 return 1;
211 } else if (i < 2) {
212 return 2;
213 } else {
214 return 3;
215 }
216 }
217
218 @Reflect
219 @IR("""
220 func @"test6" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
221 %2 : Var<java.type:"int"> = var %1 @"i";
222 java.if
223 ()java.type:"boolean" -> {
224 %3 : java.type:"int" = var.load %2;
225 %4 : java.type:"int" = constant @1;
226 %5 : java.type:"boolean" = lt %3 %4;
227 yield %5;
228 }
229 ()java.type:"void" -> {
230 %6 : java.type:"int" = constant @1;
231 var.store %2 %6;
232 yield;
233 };
234 return;
235 };
236 """)
237 void test6(int i) {
238 if (i < 1)
239 i = 1;
240 }
241
242 @Reflect
243 @IR("""
244 func @"test7" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
245 %2 : Var<java.type:"int"> = var %1 @"i";
246 java.if
247 ()java.type:"boolean" -> {
248 %3 : java.type:"int" = var.load %2;
249 %4 : java.type:"int" = constant @1;
250 %5 : java.type:"boolean" = lt %3 %4;
251 yield %5;
252 }
253 ()java.type:"void" -> {
254 %6 : java.type:"int" = constant @1;
255 var.store %2 %6;
256 yield;
257 }
258 ()java.type:"void" -> {
259 %7 : java.type:"int" = constant @2;
260 var.store %2 %7;
261 yield;
262 };
263 return;
264 };
265 """)
266 void test7(int i) {
267 if (i < 1)
268 i = 1;
269 else
270 i = 2;
271 }
272
273 @Reflect
274 @IR("""
275 func @"test8" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
276 %2 : Var<java.type:"int"> = var %1 @"i";
277 java.if
278 ()java.type:"boolean" -> {
279 %3 : java.type:"int" = var.load %2;
280 %4 : java.type:"int" = constant @1;
281 %5 : java.type:"boolean" = lt %3 %4;
282 yield %5;
283 }
284 ()java.type:"void" -> {
285 %6 : java.type:"int" = constant @1;
286 var.store %2 %6;
287 yield;
288 }
289 ()java.type:"boolean" -> {
290 %7 : java.type:"int" = var.load %2;
291 %8 : java.type:"int" = constant @2;
292 %9 : java.type:"boolean" = lt %7 %8;
293 yield %9;
294 }
295 ()java.type:"void" -> {
296 %10 : java.type:"int" = constant @2;
297 var.store %2 %10;
298 yield;
299 }
300 ()java.type:"void" -> {
301 %11 : java.type:"int" = constant @3;
302 var.store %2 %11;
303 yield;
304 };
305 return;
306 };
307 """)
308 void test8(int i) {
309 if (i < 1)
310 i = 1;
311 else if (i < 2)
312 i = 2;
313 else
314 i = 3;
315 }
316
317 @IR("""
318 func @"test9" (%0 : java.type:"java.lang.Boolean")java.type:"void" -> {
319 %1 : Var<java.type:"java.lang.Boolean"> = var %0 @"b";
320 %2 : Var<java.type:"int"> = var @"i";
321 java.if
322 ()java.type:"boolean" -> {
323 %3 : java.type:"java.lang.Boolean" = var.load %1;
324 %4 : java.type:"boolean" = invoke %3 @java.ref:"java.lang.Boolean::booleanValue():boolean";
325 yield %4;
326 }
327 ()java.type:"void" -> {
328 %5 : java.type:"int" = constant @1;
329 var.store %2 %5;
330 yield;
331 }
332 ()java.type:"void" -> {
333 %6 : java.type:"int" = constant @2;
334 var.store %2 %6;
335 yield;
336 };
337 return;
338 };
339 """)
340 @Reflect
341 static void test9(Boolean b) {
342 int i;
343 if (b) {
344 i = 1;
345 } else {
346 i = 2;
347 }
348 }
349 }