1 /*
2 * Copyright (c) 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.CodeReflection;
25 import jdk.incubator.code.Op;
26 import jdk.incubator.code.dialect.core.CoreOp;
27 import jdk.incubator.code.dialect.java.JavaOp;
28
29 import java.lang.invoke.MethodHandles;
30 import java.util.function.IntConsumer;
31 import java.util.function.Predicate;
32
33 /*
34 * @test
35 * @modules jdk.incubator.code
36 * @build TestPE
37 * @build CodeReflectionTester
38 * @run main CodeReflectionTester TestPE
39 * @enablePreview
40 */
41
42 public class TestPE {
43
44 public static MethodHandles.Lookup lookup() {
45 return MethodHandles.lookup();
46 }
47
48 public static Predicate<Op> opConstants() {
49 return op -> switch (op) {
50 case CoreOp.ConstantOp _ -> true;
51 case JavaOp.InvokeOp _ -> false;
52 case CoreOp.ReturnOp _ -> false;
53 default -> op.result() != null;
54 };
55 }
56
57 @CodeReflection
58 @EvaluatedModel("""
59 func @"ifStatement" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer")java.type:"void" -> {
60 %2 : Var<java.type:"java.util.function.IntConsumer"> = var %1 @"c";
61 %3 : java.type:"java.util.function.IntConsumer" = var.load %2;
62 %4 : java.type:"int" = constant @1;
63 invoke %3 %4 @java.ref:"java.util.function.IntConsumer::accept(int):void";
64 return;
65 };
66 """)
67 @EvaluatedModel(value = """
68 func @"ifStatement" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer")java.type:"void" -> {
69 %2 : java.type:"int" = constant @1;
70 invoke %1 %2 @java.ref:"java.util.function.IntConsumer::accept(int):void";
71 return;
72 };
73 """,
74 ssa = true
75 )
76 void ifStatement(IntConsumer c) {
77 if (true) {
78 c.accept(1);
79 } else {
80 c.accept(2);
81 }
82 }
83
84 @CodeReflection
85 @EvaluatedModel("""
86 func @"forStatement" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer")java.type:"void" -> {
87 %2 : Var<java.type:"java.util.function.IntConsumer"> = var %1 @"c";
88 %3 : java.type:"java.util.function.IntConsumer" = var.load %2;
89 %4 : java.type:"int" = constant @0;
90 invoke %3 %4 @java.ref:"java.util.function.IntConsumer::accept(int):void";
91 %5 : java.type:"java.util.function.IntConsumer" = var.load %2;
92 %6 : java.type:"int" = constant @2;
93 invoke %5 %6 @java.ref:"java.util.function.IntConsumer::accept(int):void";
94 %7 : java.type:"java.util.function.IntConsumer" = var.load %2;
95 %8 : java.type:"int" = constant @-4;
96 invoke %7 %8 @java.ref:"java.util.function.IntConsumer::accept(int):void";
97 %9 : java.type:"java.util.function.IntConsumer" = var.load %2;
98 %10 : java.type:"int" = constant @6;
99 invoke %9 %10 @java.ref:"java.util.function.IntConsumer::accept(int):void";
100 %11 : java.type:"java.util.function.IntConsumer" = var.load %2;
101 %12 : java.type:"int" = constant @-8;
102 invoke %11 %12 @java.ref:"java.util.function.IntConsumer::accept(int):void";
103 return;
104 };
105 """)
106 @EvaluatedModel(value = """
107 func @"forStatement" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer")java.type:"void" -> {
108 %2 : java.type:"int" = constant @0;
109 invoke %1 %2 @java.ref:"java.util.function.IntConsumer::accept(int):void";
110 %3 : java.type:"int" = constant @2;
111 invoke %1 %3 @java.ref:"java.util.function.IntConsumer::accept(int):void";
112 %4 : java.type:"int" = constant @-4;
113 invoke %1 %4 @java.ref:"java.util.function.IntConsumer::accept(int):void";
114 %5 : java.type:"int" = constant @6;
115 invoke %1 %5 @java.ref:"java.util.function.IntConsumer::accept(int):void";
116 %6 : java.type:"int" = constant @-8;
117 invoke %1 %6 @java.ref:"java.util.function.IntConsumer::accept(int):void";
118 return;
119 };
120 """,
121 ssa = true
122 )
123 void forStatement(IntConsumer c) {
124 for (int i = 0; i < 5; i++) {
125 int v;
126 if (i % 2 == 0) {
127 v = -i * 2;
128 } else {
129 v = i * 2;
130 }
131 c.accept(v);
132 }
133 }
134 //
135 @CodeReflection
136 @EvaluatedModel(value = """
137 func @"forStatementNonConstant" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer", %2 : java.type:"int")java.type:"void" -> {
138 %3 : Var<java.type:"java.util.function.IntConsumer"> = var %1 @"c";
139 %4 : Var<java.type:"int"> = var %2 @"n";
140 %5 : java.type:"int" = constant @0;
141 %6 : java.type:"int" = var.load %4;
142 %7 : java.type:"boolean" = lt %5 %6;
143 cbranch %7 ^block_1 ^block_4;
144
145 ^block_1:
146 %8 : java.type:"java.util.function.IntConsumer" = var.load %3;
147 %9 : java.type:"int" = constant @2;
148 invoke %8 %9 @java.ref:"java.util.function.IntConsumer::accept(int):void";
149 branch ^block_2;
150
151 ^block_2:
152 %10 : java.type:"int" = constant @1;
153 %11 : java.type:"int" = var.load %4;
154 %12 : java.type:"boolean" = lt %10 %11;
155 cbranch %12 ^block_3 ^block_4;
156
157 ^block_3:
158 %13 : java.type:"java.util.function.IntConsumer" = var.load %3;
159 %14 : java.type:"int" = constant @2;
160 invoke %13 %14 @java.ref:"java.util.function.IntConsumer::accept(int):void";
161 branch ^block_2;
162
163 ^block_4:
164 return;
165 };
166 """,
167 ssa = false
168 )
169 @EvaluatedModel(value = """
170 func @"forStatementNonConstant" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer", %2 : java.type:"int")java.type:"void" -> {
171 %3 : java.type:"int" = constant @0;
172 %4 : java.type:"boolean" = lt %3 %2;
173 cbranch %4 ^block_1 ^block_4;
174
175 ^block_1:
176 %5 : java.type:"int" = constant @2;
177 invoke %1 %5 @java.ref:"java.util.function.IntConsumer::accept(int):void";
178 %6 : java.type:"int" = constant @1;
179 branch ^block_2(%6);
180
181 ^block_2(%7 : java.type:"int"):
182 %8 : java.type:"boolean" = lt %7 %2;
183 cbranch %8 ^block_3 ^block_4;
184
185 ^block_3:
186 %9 : java.type:"int" = constant @2;
187 invoke %1 %9 @java.ref:"java.util.function.IntConsumer::accept(int):void";
188 %10 : java.type:"int" = constant @1;
189 %11 : java.type:"int" = add %7 %10;
190 branch ^block_2(%11);
191
192 ^block_4:
193 return;
194 };
195 """,
196 ssa = true
197 )
198 void forStatementNonConstant(IntConsumer c, int n) {
199 for (int i = 0; i < n; i++) {
200 int v;
201 if (false) {
202 v = -1;
203 } else {
204 v = 2;
205 }
206 c.accept(v);
207 }
208 }
209
210 boolean b = true;
211 int[] x = new int[10];
212
213 @CodeReflection
214 @EvaluatedModel("""
215 func @"f" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer")java.type:"void" -> {
216 %2 : Var<java.type:"java.util.function.IntConsumer"> = var %1 @"c";
217 %3 : java.type:"java.util.function.IntConsumer" = var.load %2;
218 %4 : java.type:"int" = constant @1;
219 invoke %3 %4 @java.ref:"java.util.function.IntConsumer::accept(int):void";
220 %5 : java.type:"java.util.function.IntConsumer" = var.load %2;
221 %6 : java.type:"int" = constant @3;
222 invoke %5 %6 @java.ref:"java.util.function.IntConsumer::accept(int):void";
223 %7 : java.type:"boolean" = field.load %0 @java.ref:"TestPE::b:boolean";
224 cbranch %7 ^block_1 ^block_2;
225
226 ^block_1:
227 %8 : java.type:"java.util.function.IntConsumer" = var.load %2;
228 %9 : java.type:"int" = constant @5;
229 invoke %8 %9 @java.ref:"java.util.function.IntConsumer::accept(int):void";
230 %10 : java.type:"java.util.function.IntConsumer" = var.load %2;
231 %11 : java.type:"int" = constant @0;
232 invoke %10 %11 @java.ref:"java.util.function.IntConsumer::accept(int):void";
233 %12 : java.type:"java.util.function.IntConsumer" = var.load %2;
234 %13 : java.type:"int" = constant @6;
235 invoke %12 %13 @java.ref:"java.util.function.IntConsumer::accept(int):void";
236 %14 : java.type:"java.util.function.IntConsumer" = var.load %2;
237 %15 : java.type:"int" = constant @1;
238 invoke %14 %15 @java.ref:"java.util.function.IntConsumer::accept(int):void";
239 %16 : java.type:"java.util.function.IntConsumer" = var.load %2;
240 %17 : java.type:"int" = constant @0;
241 %18 : java.type:"int[]" = field.load %0 @java.ref:"TestPE::x:int[]";
242 %19 : java.type:"int" = constant @0;
243 %20 : java.type:"int" = array.load %18 %19;
244 %21 : java.type:"int" = add %17 %20;
245 invoke %16 %21 @java.ref:"java.util.function.IntConsumer::accept(int):void";
246 %22 : java.type:"java.util.function.IntConsumer" = var.load %2;
247 %23 : java.type:"int" = constant @1;
248 invoke %22 %23 @java.ref:"java.util.function.IntConsumer::accept(int):void";
249 %24 : java.type:"java.util.function.IntConsumer" = var.load %2;
250 %25 : java.type:"int" = constant @7;
251 invoke %24 %25 @java.ref:"java.util.function.IntConsumer::accept(int):void";
252 %26 : java.type:"java.util.function.IntConsumer" = var.load %2;
253 %27 : java.type:"int" = constant @2;
254 invoke %26 %27 @java.ref:"java.util.function.IntConsumer::accept(int):void";
255 %28 : java.type:"java.util.function.IntConsumer" = var.load %2;
256 %29 : java.type:"int" = constant @1;
257 %30 : java.type:"int[]" = field.load %0 @java.ref:"TestPE::x:int[]";
258 %31 : java.type:"int" = constant @1;
259 %32 : java.type:"int" = array.load %30 %31;
260 %33 : java.type:"int" = add %29 %32;
261 invoke %28 %33 @java.ref:"java.util.function.IntConsumer::accept(int):void";
262 %34 : java.type:"java.util.function.IntConsumer" = var.load %2;
263 %35 : java.type:"int" = constant @2;
264 invoke %34 %35 @java.ref:"java.util.function.IntConsumer::accept(int):void";
265 %36 : java.type:"java.util.function.IntConsumer" = var.load %2;
266 %37 : java.type:"int" = constant @7;
267 invoke %36 %37 @java.ref:"java.util.function.IntConsumer::accept(int):void";
268 %38 : java.type:"java.util.function.IntConsumer" = var.load %2;
269 %39 : java.type:"int" = constant @2;
270 invoke %38 %39 @java.ref:"java.util.function.IntConsumer::accept(int):void";
271 %40 : java.type:"java.util.function.IntConsumer" = var.load %2;
272 %41 : java.type:"int" = constant @2;
273 %42 : java.type:"int[]" = field.load %0 @java.ref:"TestPE::x:int[]";
274 %43 : java.type:"int" = constant @2;
275 %44 : java.type:"int" = array.load %42 %43;
276 %45 : java.type:"int" = add %41 %44;
277 invoke %40 %45 @java.ref:"java.util.function.IntConsumer::accept(int):void";
278 %46 : java.type:"java.util.function.IntConsumer" = var.load %2;
279 %47 : java.type:"int" = constant @8;
280 invoke %46 %47 @java.ref:"java.util.function.IntConsumer::accept(int):void";
281 branch ^block_3;
282
283 ^block_2:
284 branch ^block_3;
285
286 ^block_3:
287 %48 : java.type:"java.util.function.IntConsumer" = var.load %2;
288 %49 : java.type:"int" = constant @9;
289 invoke %48 %49 @java.ref:"java.util.function.IntConsumer::accept(int):void";
290 return;
291 };
292 """)
293 @EvaluatedModel(value = """
294 func @"f" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer")java.type:"void" -> {
295 %2 : java.type:"int" = constant @1;
296 invoke %1 %2 @java.ref:"java.util.function.IntConsumer::accept(int):void";
297 %3 : java.type:"int" = constant @3;
298 invoke %1 %3 @java.ref:"java.util.function.IntConsumer::accept(int):void";
299 %4 : java.type:"boolean" = field.load %0 @java.ref:"TestPE::b:boolean";
300 cbranch %4 ^block_1 ^block_2;
301
302 ^block_1:
303 %5 : java.type:"int" = constant @5;
304 invoke %1 %5 @java.ref:"java.util.function.IntConsumer::accept(int):void";
305 %6 : java.type:"int" = constant @0;
306 invoke %1 %6 @java.ref:"java.util.function.IntConsumer::accept(int):void";
307 %7 : java.type:"int" = constant @6;
308 invoke %1 %7 @java.ref:"java.util.function.IntConsumer::accept(int):void";
309 %8 : java.type:"int" = constant @1;
310 invoke %1 %8 @java.ref:"java.util.function.IntConsumer::accept(int):void";
311 %9 : java.type:"int[]" = field.load %0 @java.ref:"TestPE::x:int[]";
312 %10 : java.type:"int" = array.load %9 %6;
313 %11 : java.type:"int" = add %6 %10;
314 invoke %1 %11 @java.ref:"java.util.function.IntConsumer::accept(int):void";
315 %12 : java.type:"int" = constant @1;
316 invoke %1 %12 @java.ref:"java.util.function.IntConsumer::accept(int):void";
317 %13 : java.type:"int" = constant @7;
318 invoke %1 %13 @java.ref:"java.util.function.IntConsumer::accept(int):void";
319 %14 : java.type:"int" = constant @2;
320 invoke %1 %14 @java.ref:"java.util.function.IntConsumer::accept(int):void";
321 %15 : java.type:"int[]" = field.load %0 @java.ref:"TestPE::x:int[]";
322 %16 : java.type:"int" = array.load %15 %12;
323 %17 : java.type:"int" = add %12 %16;
324 invoke %1 %17 @java.ref:"java.util.function.IntConsumer::accept(int):void";
325 %18 : java.type:"int" = constant @2;
326 invoke %1 %18 @java.ref:"java.util.function.IntConsumer::accept(int):void";
327 %19 : java.type:"int" = constant @7;
328 invoke %1 %19 @java.ref:"java.util.function.IntConsumer::accept(int):void";
329 %20 : java.type:"int" = constant @2;
330 invoke %1 %20 @java.ref:"java.util.function.IntConsumer::accept(int):void";
331 %21 : java.type:"int[]" = field.load %0 @java.ref:"TestPE::x:int[]";
332 %22 : java.type:"int" = array.load %21 %18;
333 %23 : java.type:"int" = add %18 %22;
334 invoke %1 %23 @java.ref:"java.util.function.IntConsumer::accept(int):void";
335 %24 : java.type:"int" = constant @8;
336 invoke %1 %24 @java.ref:"java.util.function.IntConsumer::accept(int):void";
337 branch ^block_3;
338
339 ^block_2:
340 branch ^block_3;
341
342 ^block_3:
343 %25 : java.type:"int" = constant @9;
344 invoke %1 %25 @java.ref:"java.util.function.IntConsumer::accept(int):void";
345 return;
346 };
347 """,
348 ssa = true
349 )
350 void f(IntConsumer c) {
351 c.accept(1);
352
353 if (false) {
354 c.accept(2);
355 } else if (true) {
356 c.accept(3);
357 } else {
358 c.accept(4);
359 }
360
361 if (b) {
362 c.accept(5);
363 for (int i = 0; i < 3; i++) {
364 c.accept(i);
365 int v;
366 if (i == 0) {
367 c.accept(6);
368 v = 1;
369 } else {
370 c.accept(7);
371 v = 2;
372 }
373 c.accept(v);
374 c.accept(i + x[i]);
375 }
376
377 c.accept(8);
378 }
379
380 c.accept(9);
381 }
382
383 @CodeReflection
384 @EvaluatedModel("""
385 func @"constantsInBranches" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer", %2 : java.type:"int")java.type:"void" -> {
386 %3 : Var<java.type:"java.util.function.IntConsumer"> = var %1 @"c";
387 %4 : Var<java.type:"int"> = var %2 @"arg";
388 %5 : java.type:"int" = var.load %4;
389 %6 : Var<java.type:"int"> = var %5 @"x";
390 %7 : java.type:"int" = var.load %6;
391 %8 : java.type:"int" = constant @0;
392 %9 : java.type:"boolean" = eq %7 %8;
393 cbranch %9 ^block_1 ^block_2;
394
395 ^block_1:
396 %10 : java.type:"int" = constant @1;
397 var.store %6 %10;
398 branch ^block_3;
399
400 ^block_2:
401 %11 : java.type:"int" = constant @2;
402 var.store %6 %11;
403 branch ^block_3;
404
405 ^block_3:
406 %12 : java.type:"java.util.function.IntConsumer" = var.load %3;
407 %13 : java.type:"int" = var.load %6;
408 invoke %12 %13 @java.ref:"java.util.function.IntConsumer::accept(int):void";
409 return;
410 };
411 """)
412 @EvaluatedModel(value = """
413 func @"constantsInBranches" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer", %2 : java.type:"int")java.type:"void" -> {
414 %3 : java.type:"int" = constant @0;
415 %4 : java.type:"boolean" = eq %2 %3;
416 cbranch %4 ^block_1 ^block_2;
417
418 ^block_1:
419 %5 : java.type:"int" = constant @1;
420 branch ^block_3(%5);
421
422 ^block_2:
423 %6 : java.type:"int" = constant @2;
424 branch ^block_3(%6);
425
426 ^block_3(%7 : java.type:"int"):
427 invoke %1 %7 @java.ref:"java.util.function.IntConsumer::accept(int):void";
428 return;
429 };
430 """,
431 ssa = true
432 )
433 void constantsInBranches(IntConsumer c, int arg) {
434 var x = arg;
435 if (x == 0) {
436 x = 1;
437 } else {
438 x = 2;
439 }
440 c.accept(x);
441 }
442
443 @CodeReflection
444 @EvaluatedModel("""
445 func @"nestedForStatement" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer")java.type:"void" -> {
446 %2 : Var<java.type:"java.util.function.IntConsumer"> = var %1 @"c";
447 %3 : java.type:"java.util.function.IntConsumer" = var.load %2;
448 %4 : java.type:"int" = constant @0;
449 invoke %3 %4 @java.ref:"java.util.function.IntConsumer::accept(int):void";
450 %5 : java.type:"java.util.function.IntConsumer" = var.load %2;
451 %6 : java.type:"int" = constant @1;
452 invoke %5 %6 @java.ref:"java.util.function.IntConsumer::accept(int):void";
453 %7 : java.type:"java.util.function.IntConsumer" = var.load %2;
454 %8 : java.type:"int" = constant @2;
455 invoke %7 %8 @java.ref:"java.util.function.IntConsumer::accept(int):void";
456 %9 : java.type:"java.util.function.IntConsumer" = var.load %2;
457 %10 : java.type:"int" = constant @1;
458 invoke %9 %10 @java.ref:"java.util.function.IntConsumer::accept(int):void";
459 %11 : java.type:"java.util.function.IntConsumer" = var.load %2;
460 %12 : java.type:"int" = constant @2;
461 invoke %11 %12 @java.ref:"java.util.function.IntConsumer::accept(int):void";
462 %13 : java.type:"java.util.function.IntConsumer" = var.load %2;
463 %14 : java.type:"int" = constant @3;
464 invoke %13 %14 @java.ref:"java.util.function.IntConsumer::accept(int):void";
465 %15 : java.type:"java.util.function.IntConsumer" = var.load %2;
466 %16 : java.type:"int" = constant @2;
467 invoke %15 %16 @java.ref:"java.util.function.IntConsumer::accept(int):void";
468 %17 : java.type:"java.util.function.IntConsumer" = var.load %2;
469 %18 : java.type:"int" = constant @3;
470 invoke %17 %18 @java.ref:"java.util.function.IntConsumer::accept(int):void";
471 %19 : java.type:"java.util.function.IntConsumer" = var.load %2;
472 %20 : java.type:"int" = constant @4;
473 invoke %19 %20 @java.ref:"java.util.function.IntConsumer::accept(int):void";
474 return;
475 };
476 """)
477 @EvaluatedModel(value = """
478 func @"nestedForStatement" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer")java.type:"void" -> {
479 %2 : java.type:"int" = constant @0;
480 invoke %1 %2 @java.ref:"java.util.function.IntConsumer::accept(int):void";
481 %3 : java.type:"int" = constant @1;
482 invoke %1 %3 @java.ref:"java.util.function.IntConsumer::accept(int):void";
483 %4 : java.type:"int" = constant @2;
484 invoke %1 %4 @java.ref:"java.util.function.IntConsumer::accept(int):void";
485 %5 : java.type:"int" = constant @1;
486 invoke %1 %5 @java.ref:"java.util.function.IntConsumer::accept(int):void";
487 %6 : java.type:"int" = constant @2;
488 invoke %1 %6 @java.ref:"java.util.function.IntConsumer::accept(int):void";
489 %7 : java.type:"int" = constant @3;
490 invoke %1 %7 @java.ref:"java.util.function.IntConsumer::accept(int):void";
491 %8 : java.type:"int" = constant @2;
492 invoke %1 %8 @java.ref:"java.util.function.IntConsumer::accept(int):void";
493 %9 : java.type:"int" = constant @3;
494 invoke %1 %9 @java.ref:"java.util.function.IntConsumer::accept(int):void";
495 %10 : java.type:"int" = constant @4;
496 invoke %1 %10 @java.ref:"java.util.function.IntConsumer::accept(int):void";
497 return;
498 };
499 """,
500 ssa = true
501 )
502 void nestedForStatement(IntConsumer c) {
503 for (int i = 0; i < 3; i++) {
504 for (int j = 0; j < 3; j++) {
505 c.accept(i + j);
506 }
507 }
508 }
509
510
511 @CodeReflection
512 @EvaluatedModel("""
513 func @"whileWithBreak" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer", %2 : java.type:"int")java.type:"void" -> {
514 %3 : Var<java.type:"java.util.function.IntConsumer"> = var %1 @"c";
515 %4 : Var<java.type:"int"> = var %2 @"n";
516 %5 : java.type:"java.util.function.IntConsumer" = var.load %3;
517 %6 : java.type:"int" = constant @0;
518 invoke %5 %6 @java.ref:"java.util.function.IntConsumer::accept(int):void";
519 %7 : java.type:"java.util.function.IntConsumer" = var.load %3;
520 %8 : java.type:"int" = constant @1;
521 invoke %7 %8 @java.ref:"java.util.function.IntConsumer::accept(int):void";
522 %9 : java.type:"int" = constant @2;
523 %10 : java.type:"int" = var.load %4;
524 %11 : java.type:"boolean" = ge %9 %10;
525 cbranch %11 ^block_3 ^block_1;
526
527 ^block_1:
528 %12 : java.type:"java.util.function.IntConsumer" = var.load %3;
529 %13 : java.type:"int" = constant @2;
530 invoke %12 %13 @java.ref:"java.util.function.IntConsumer::accept(int):void";
531 branch ^block_2;
532
533 ^block_2:
534 %14 : java.type:"int" = constant @3;
535 %15 : java.type:"int" = var.load %4;
536 %16 : java.type:"boolean" = ge %14 %15;
537 cbranch %16 ^block_3 ^block_4;
538
539 ^block_3:
540 %17 : java.type:"java.util.function.IntConsumer" = var.load %3;
541 %18 : java.type:"int" = constant @-1;
542 invoke %17 %18 @java.ref:"java.util.function.IntConsumer::accept(int):void";
543 return;
544
545 ^block_4:
546 %19 : java.type:"java.util.function.IntConsumer" = var.load %3;
547 %20 : java.type:"int" = constant @3;
548 invoke %19 %20 @java.ref:"java.util.function.IntConsumer::accept(int):void";
549 branch ^block_2;
550 };
551 """)
552 @EvaluatedModel(value = """
553 func @"whileWithBreak" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer", %2 : java.type:"int")java.type:"void" -> {
554 %3 : java.type:"int" = constant @0;
555 invoke %1 %3 @java.ref:"java.util.function.IntConsumer::accept(int):void";
556 %4 : java.type:"int" = constant @1;
557 invoke %1 %4 @java.ref:"java.util.function.IntConsumer::accept(int):void";
558 %5 : java.type:"int" = constant @2;
559 %6 : java.type:"boolean" = ge %5 %2;
560 cbranch %6 ^block_4 ^block_1;
561
562 ^block_1:
563 invoke %1 %5 @java.ref:"java.util.function.IntConsumer::accept(int):void";
564 %7 : java.type:"int" = constant @3;
565 branch ^block_2(%7);
566
567 ^block_2(%8 : java.type:"int"):
568 %9 : java.type:"int" = constant @2;
569 %10 : java.type:"boolean" = ge %8 %9;
570 cbranch %10 ^block_3 ^block_6;
571
572 ^block_3:
573 %11 : java.type:"boolean" = ge %8 %2;
574 cbranch %11 ^block_4 ^block_5;
575
576 ^block_4:
577 %12 : java.type:"int" = constant @-1;
578 invoke %1 %12 @java.ref:"java.util.function.IntConsumer::accept(int):void";
579 return;
580
581 ^block_5:
582 branch ^block_7;
583
584 ^block_6:
585 branch ^block_7;
586
587 ^block_7:
588 invoke %1 %8 @java.ref:"java.util.function.IntConsumer::accept(int):void";
589 %13 : java.type:"int" = constant @1;
590 %14 : java.type:"int" = add %8 %13;
591 branch ^block_2(%14);
592 };
593 """,
594 ssa = true
595 )
596 void whileWithBreak(IntConsumer c, int n) {
597 int i = 0;
598 while (true) {
599 if (i >= 2) {
600 if (i >= n) {
601 break;
602 }
603 }
604 c.accept(i);
605 i += 1;
606 }
607 c.accept(-1);
608 }
609
610 @CodeReflection
611 @EvaluatedModel("""
612 func @"whileWithBreakAndContinue" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer", %2 : java.type:"int")java.type:"void" -> {
613 %3 : Var<java.type:"java.util.function.IntConsumer"> = var %1 @"c";
614 %4 : Var<java.type:"int"> = var %2 @"n";
615 %5 : java.type:"int" = constant @2;
616 %6 : java.type:"int" = var.load %4;
617 %7 : java.type:"boolean" = ge %5 %6;
618 cbranch %7 ^block_3 ^block_1;
619
620 ^block_1:
621 branch ^block_2;
622
623 ^block_2:
624 %8 : java.type:"int" = constant @4;
625 %9 : java.type:"int" = var.load %4;
626 %10 : java.type:"boolean" = ge %8 %9;
627 cbranch %10 ^block_3 ^block_4;
628
629 ^block_3:
630 %11 : java.type:"java.util.function.IntConsumer" = var.load %3;
631 %12 : java.type:"int" = constant @-1;
632 invoke %11 %12 @java.ref:"java.util.function.IntConsumer::accept(int):void";
633 return;
634
635 ^block_4:
636 branch ^block_2;
637 };
638 """)
639 @EvaluatedModel(value = """
640 func @"whileWithBreakAndContinue" (%0 : java.type:"TestPE", %1 : java.type:"java.util.function.IntConsumer", %2 : java.type:"int")java.type:"void" -> {
641 %3 : java.type:"int" = constant @2;
642 %4 : java.type:"boolean" = ge %3 %2;
643 cbranch %4 ^block_4 ^block_1;
644
645 ^block_1:
646 %5 : java.type:"int" = constant @4;
647 branch ^block_2(%5);
648
649 ^block_2(%6 : java.type:"int"):
650 %7 : java.type:"int" = constant @2;
651 %8 : java.type:"boolean" = ge %6 %7;
652 cbranch %8 ^block_3 ^block_6;
653
654 ^block_3:
655 %9 : java.type:"boolean" = ge %6 %2;
656 cbranch %9 ^block_4 ^block_5;
657
658 ^block_4:
659 %10 : java.type:"int" = constant @-1;
660 invoke %1 %10 @java.ref:"java.util.function.IntConsumer::accept(int):void";
661 return;
662
663 ^block_5:
664 branch ^block_7;
665
666 ^block_6:
667 branch ^block_7;
668
669 ^block_7:
670 %11 : java.type:"int" = constant @5;
671 %12 : java.type:"boolean" = lt %6 %11;
672 cbranch %12 ^block_8 ^block_9;
673
674 ^block_8:
675 %13 : java.type:"int" = constant @2;
676 %14 : java.type:"int" = add %6 %13;
677 branch ^block_2(%14);
678
679 ^block_9:
680 invoke %1 %6 @java.ref:"java.util.function.IntConsumer::accept(int):void";
681 %15 : java.type:"int" = constant @1;
682 %16 : java.type:"int" = add %6 %15;
683 branch ^block_2(%16);
684 };
685 """,
686 ssa = true
687 )
688 void whileWithBreakAndContinue(IntConsumer c, int n) {
689 int i = 0;
690 while (true) {
691 if (i >= 2) {
692 if (i >= n) {
693 break;
694 }
695 }
696 if (i < 5) {
697 i += 2;
698 continue;
699 }
700 c.accept(i);
701 i += 1;
702 }
703 c.accept(-1);
704 }
705
706 }