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