1 /*
2 * Copyright (c) 2024, 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.CodeReflection;
25 import java.util.List;
26
27 /*
28 * @test
29 * @summary Smoke test for code reflection with for loops.
30 * @modules jdk.incubator.code
31 * @build BreakContinueTest
32 * @build CodeReflectionTester
33 * @run main CodeReflectionTester BreakContinueTest
34 */
35
36
37 public class BreakContinueTest {
38 @CodeReflection
39 @IR("""
40 func @"test1" (%0 : java.type:"BreakContinueTest")java.type:"void" -> {
41 java.for
42 ()Var<java.type:"int"> -> {
43 %1 : java.type:"int" = constant @0;
44 %2 : Var<java.type:"int"> = var %1 @"i";
45 yield %2;
46 }
47 (%3 : Var<java.type:"int">)java.type:"boolean" -> {
48 %4 : java.type:"int" = var.load %3;
49 %5 : java.type:"int" = constant @10;
50 %6 : java.type:"boolean" = lt %4 %5;
51 yield %6;
52 }
53 (%7 : Var<java.type:"int">)java.type:"void" -> {
54 %8 : java.type:"int" = var.load %7;
55 %9 : java.type:"int" = constant @1;
56 %10 : java.type:"int" = add %8 %9;
57 var.store %7 %10;
58 yield;
59 }
60 (%11 : Var<java.type:"int">)java.type:"void" -> {
61 java.if
62 ()java.type:"boolean" -> {
63 %12 : java.type:"boolean" = constant @true;
64 yield %12;
65 }
66 ()java.type:"void" -> {
67 java.continue;
68 }
69 ()java.type:"void" -> {
70 yield;
71 };
72 java.if
73 ()java.type:"boolean" -> {
74 %13 : java.type:"boolean" = constant @true;
75 yield %13;
76 }
77 ()java.type:"void" -> {
78 java.break;
79 }
80 ()java.type:"void" -> {
81 yield;
82 };
83 java.for
84 ()Var<java.type:"int"> -> {
85 %14 : java.type:"int" = constant @0;
86 %15 : Var<java.type:"int"> = var %14 @"j";
87 yield %15;
88 }
89 (%16 : Var<java.type:"int">)java.type:"boolean" -> {
90 %17 : java.type:"int" = var.load %16;
91 %18 : java.type:"int" = constant @10;
92 %19 : java.type:"boolean" = lt %17 %18;
93 yield %19;
94 }
95 (%20 : Var<java.type:"int">)java.type:"void" -> {
96 %21 : java.type:"int" = var.load %20;
97 %22 : java.type:"int" = constant @1;
98 %23 : java.type:"int" = add %21 %22;
99 var.store %20 %23;
100 yield;
101 }
102 (%24 : Var<java.type:"int">)java.type:"void" -> {
103 java.if
104 ()java.type:"boolean" -> {
105 %25 : java.type:"boolean" = constant @true;
106 yield %25;
107 }
108 ()java.type:"void" -> {
109 java.continue;
110 }
111 ()java.type:"void" -> {
112 yield;
113 };
114 java.if
115 ()java.type:"boolean" -> {
116 %26 : java.type:"boolean" = constant @true;
117 yield %26;
118 }
119 ()java.type:"void" -> {
120 java.break;
121 }
122 ()java.type:"void" -> {
123 yield;
124 };
125 java.continue;
126 };
127 java.continue;
128 };
129 return;
130 };
131 """)
132 void test1() {
133 for (int i = 0; i < 10; i++) {
134 if (true) {
135 continue;
136 }
137 if (true) {
138 break;
139 }
140 for (int j = 0; j < 10; j++) {
141 if (true) {
142 continue;
143 }
144 if (true) {
145 break;
146 }
147 }
148 }
149 }
150
151 @CodeReflection
152 @IR("""
153 func @"test2" (%0 : java.type:"BreakContinueTest")java.type:"void" -> {
154 java.labeled ()java.type:"void" -> {
155 %1 : java.type:"java.lang.String" = constant @"outer";
156 java.for
157 ()Var<java.type:"int"> -> {
158 %2 : java.type:"int" = constant @0;
159 %3 : Var<java.type:"int"> = var %2 @"i";
160 yield %3;
161 }
162 (%4 : Var<java.type:"int">)java.type:"boolean" -> {
163 %5 : java.type:"int" = var.load %4;
164 %6 : java.type:"int" = constant @10;
165 %7 : java.type:"boolean" = lt %5 %6;
166 yield %7;
167 }
168 (%8 : Var<java.type:"int">)java.type:"void" -> {
169 %9 : java.type:"int" = var.load %8;
170 %10 : java.type:"int" = constant @1;
171 %11 : java.type:"int" = add %9 %10;
172 var.store %8 %11;
173 yield;
174 }
175 (%12 : Var<java.type:"int">)java.type:"void" -> {
176 java.if
177 ()java.type:"boolean" -> {
178 %13 : java.type:"boolean" = constant @true;
179 yield %13;
180 }
181 ()java.type:"void" -> {
182 java.continue %1;
183 }
184 ()java.type:"void" -> {
185 yield;
186 };
187 java.if
188 ()java.type:"boolean" -> {
189 %14 : java.type:"boolean" = constant @true;
190 yield %14;
191 }
192 ()java.type:"void" -> {
193 java.break %1;
194 }
195 ()java.type:"void" -> {
196 yield;
197 };
198 java.labeled ()java.type:"void" -> {
199 %15 : java.type:"java.lang.String" = constant @"inner";
200 java.for
201 ()Var<java.type:"int"> -> {
202 %16 : java.type:"int" = constant @0;
203 %17 : Var<java.type:"int"> = var %16 @"j";
204 yield %17;
205 }
206 (%18 : Var<java.type:"int">)java.type:"boolean" -> {
207 %19 : java.type:"int" = var.load %18;
208 %20 : java.type:"int" = constant @10;
209 %21 : java.type:"boolean" = lt %19 %20;
210 yield %21;
211 }
212 (%22 : Var<java.type:"int">)java.type:"void" -> {
213 %23 : java.type:"int" = var.load %22;
214 %24 : java.type:"int" = constant @1;
215 %25 : java.type:"int" = add %23 %24;
216 var.store %22 %25;
217 yield;
218 }
219 (%26 : Var<java.type:"int">)java.type:"void" -> {
220 java.if
221 ()java.type:"boolean" -> {
222 %27 : java.type:"boolean" = constant @true;
223 yield %27;
224 }
225 ()java.type:"void" -> {
226 java.continue;
227 }
228 ()java.type:"void" -> {
229 yield;
230 };
231 java.if
232 ()java.type:"boolean" -> {
233 %28 : java.type:"boolean" = constant @true;
234 yield %28;
235 }
236 ()java.type:"void" -> {
237 java.break;
238 }
239 ()java.type:"void" -> {
240 yield;
241 };
242 java.if
243 ()java.type:"boolean" -> {
244 %29 : java.type:"boolean" = constant @true;
245 yield %29;
246 }
247 ()java.type:"void" -> {
248 java.continue %1;
249 }
250 ()java.type:"void" -> {
251 yield;
252 };
253 java.if
254 ()java.type:"boolean" -> {
255 %30 : java.type:"boolean" = constant @true;
256 yield %30;
257 }
258 ()java.type:"void" -> {
259 java.break %1;
260 }
261 ()java.type:"void" -> {
262 yield;
263 };
264 java.continue;
265 };
266 yield;
267 };
268 java.continue;
269 };
270 yield;
271 };
272 return;
273 };
274 """)
275 void test2() {
276 outer:
277 for (int i = 0; i < 10; i++) {
278 if (true) {
279 continue outer;
280 }
281 if (true) {
282 break outer;
283 }
284 inner:
285 for (int j = 0; j < 10; j++) {
286 if (true) {
287 continue;
288 }
289 if (true) {
290 break;
291 }
292 if (true) {
293 continue outer;
294 }
295 if (true) {
296 break outer;
297 }
298 }
299 }
300 }
301
302 @CodeReflection
303 @IR("""
304 func @"test3" (%0 : java.type:"BreakContinueTest")java.type:"void" -> {
305 java.labeled ()java.type:"void" -> {
306 %1 : java.type:"java.lang.String" = constant @"b1";
307 java.block ()java.type:"void" -> {
308 java.labeled ()java.type:"void" -> {
309 %2 : java.type:"java.lang.String" = constant @"b2";
310 java.block ()java.type:"void" -> {
311 java.if
312 ()java.type:"boolean" -> {
313 %3 : java.type:"boolean" = constant @true;
314 yield %3;
315 }
316 ()java.type:"void" -> {
317 java.break %1;
318 }
319 ()java.type:"void" -> {
320 yield;
321 };
322 java.if
323 ()java.type:"boolean" -> {
324 %4 : java.type:"boolean" = constant @true;
325 yield %4;
326 }
327 ()java.type:"void" -> {
328 java.break %2;
329 }
330 ()java.type:"void" -> {
331 yield;
332 };
333 yield;
334 };
335 yield;
336 };
337 yield;
338 };
339 yield;
340 };
341 return;
342 };
343 """)
344 void test3() {
345 b1:
346 {
347 b2:
348 {
349 if (true) {
350 break b1;
351 }
352 if (true) {
353 break b2;
354 }
355 }
356 }
357 }
358
359 @CodeReflection
360 @IR("""
361 func @"test4" (%0 : java.type:"BreakContinueTest")java.type:"void" -> {
362 java.labeled ()java.type:"void" -> {
363 %1 : java.type:"java.lang.String" = constant @"b";
364 java.break %1;
365 };
366 %2 : java.type:"int" = constant @0;
367 %3 : Var<java.type:"int"> = var %2 @"i";
368 java.labeled ()java.type:"void" -> {
369 %4 : java.type:"java.lang.String" = constant @"b";
370 %5 : java.type:"int" = var.load %3;
371 %6 : java.type:"int" = constant @1;
372 %7 : java.type:"int" = add %5 %6;
373 var.store %3 %7;
374 yield;
375 };
376 java.labeled ()java.type:"void" -> {
377 %8 : java.type:"java.lang.String" = constant @"a";
378 java.labeled ()java.type:"void" -> {
379 %9 : java.type:"java.lang.String" = constant @"b";
380 java.block ()java.type:"void" -> {
381 yield;
382 };
383 yield;
384 };
385 yield;
386 };
387 return;
388 };
389 """)
390 void test4() {
391 b:
392 break b;
393
394 int i = 0;
395 b:
396 i++;
397
398 a: b: {
399 }
400 }
401 }