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 
 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     @CodeReflection
 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                     ()java.type:"void" -> {
 53                         yield;
 54                     };
 55                 return;
 56             };
 57             """)
 58     void test1(int i) {
 59         if (i < 1) {
 60             i = 1;
 61         }
 62     }
 63 
 64     @CodeReflection
 65     @IR("""
 66             func @"test2" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
 67                 %2 : Var<java.type:"int"> = var %1 @"i";
 68                 java.if
 69                     ()java.type:"boolean" -> {
 70                         %3 : java.type:"int" = var.load %2;
 71                         %4 : java.type:"int" = constant @1;
 72                         %5 : java.type:"boolean" = lt %3 %4;
 73                         yield %5;
 74                     }
 75                     ()java.type:"void" -> {
 76                         %6 : java.type:"int" = constant @1;
 77                         var.store %2 %6;
 78                         yield;
 79                     }
 80                     ()java.type:"void" -> {
 81                         %7 : java.type:"int" = constant @2;
 82                         var.store %2 %7;
 83                         yield;
 84                     };
 85                 return;
 86             };
 87             """)
 88     void test2(int i) {
 89         if (i < 1) {
 90             i = 1;
 91         } else {
 92             i = 2;
 93         }
 94     }
 95 
 96     @CodeReflection
 97     @IR("""
 98             func @"test3" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
 99                 %2 : Var<java.type:"int"> = var %1 @"i";
100                 java.if
101                     ()java.type:"boolean" -> {
102                         %3 : java.type:"int" = var.load %2;
103                         %4 : java.type:"int" = constant @1;
104                         %5 : java.type:"boolean" = lt %3 %4;
105                         yield %5;
106                     }
107                     ()java.type:"void" -> {
108                         %6 : java.type:"int" = constant @1;
109                         var.store %2 %6;
110                         yield;
111                     }
112                     ()java.type:"boolean" -> {
113                         %7 : java.type:"int" = var.load %2;
114                         %8 : java.type:"int" = constant @2;
115                         %9 : java.type:"boolean" = lt %7 %8;
116                         yield %9;
117                     }
118                     ()java.type:"void" -> {
119                         %10 : java.type:"int" = constant @2;
120                         var.store %2 %10;
121                         yield;
122                     }
123                     ()java.type:"void" -> {
124                         yield;
125                     };
126                 return;
127             };
128             """)
129     void test3(int i) {
130         if (i < 1) {
131             i = 1;
132         } else if (i < 2) {
133             i = 2;
134         }
135     }
136 
137     @CodeReflection
138     @IR("""
139             func @"test4" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
140                 %2 : Var<java.type:"int"> = var %1 @"i";
141                 java.if
142                     ()java.type:"boolean" -> {
143                         %3 : java.type:"int" = var.load %2;
144                         %4 : java.type:"int" = constant @1;
145                         %5 : java.type:"boolean" = lt %3 %4;
146                         yield %5;
147                     }
148                     ()java.type:"void" -> {
149                         %6 : java.type:"int" = constant @1;
150                         var.store %2 %6;
151                         yield;
152                     }
153                     ()java.type:"boolean" -> {
154                         %7 : java.type:"int" = var.load %2;
155                         %8 : java.type:"int" = constant @2;
156                         %9 : java.type:"boolean" = lt %7 %8;
157                         yield %9;
158                     }
159                     ()java.type:"void" -> {
160                         %10 : java.type:"int" = constant @2;
161                         var.store %2 %10;
162                         yield;
163                     }
164                     ()java.type:"void" -> {
165                         %11 : java.type:"int" = constant @3;
166                         var.store %2 %11;
167                         yield;
168                     };
169                 return;
170             };
171             """)
172     void test4(int i) {
173         if (i < 1) {
174             i = 1;
175         } else if (i < 2) {
176             i = 2;
177         } else {
178             i = 3;
179         }
180     }
181 
182     @IR("""
183             func @"test5" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"int" -> {
184                 %2 : Var<java.type:"int"> = var %1 @"i";
185                 java.if
186                     ()java.type:"boolean" -> {
187                         %3 : java.type:"int" = var.load %2;
188                         %4 : java.type:"int" = constant @1;
189                         %5 : java.type:"boolean" = lt %3 %4;
190                         yield %5;
191                     }
192                     ()java.type:"void" -> {
193                         %6 : java.type:"int" = constant @1;
194                         return %6;
195                     }
196                     ()java.type:"boolean" -> {
197                         %7 : java.type:"int" = var.load %2;
198                         %8 : java.type:"int" = constant @2;
199                         %9 : java.type:"boolean" = lt %7 %8;
200                         yield %9;
201                     }
202                     ()java.type:"void" -> {
203                         %10 : java.type:"int" = constant @2;
204                         return %10;
205                     }
206                     ()java.type:"void" -> {
207                         %11 : java.type:"int" = constant @3;
208                         return %11;
209                     };
210                 unreachable;
211             };
212             """)
213     @CodeReflection
214     int test5(int i) {
215         if (i < 1) {
216             return 1;
217         } else if (i < 2) {
218             return 2;
219         } else {
220             return 3;
221         }
222     }
223 
224     @CodeReflection
225     @IR("""
226             func @"test6" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
227                 %2 : Var<java.type:"int"> = var %1 @"i";
228                 java.if
229                     ()java.type:"boolean" -> {
230                         %3 : java.type:"int" = var.load %2;
231                         %4 : java.type:"int" = constant @1;
232                         %5 : java.type:"boolean" = lt %3 %4;
233                         yield %5;
234                     }
235                     ()java.type:"void" -> {
236                         %6 : java.type:"int" = constant @1;
237                         var.store %2 %6;
238                         yield;
239                     }
240                     ()java.type:"void" -> {
241                         yield;
242                     };
243                 return;
244             };
245             """)
246     void test6(int i) {
247         if (i < 1)
248             i = 1;
249     }
250 
251     @CodeReflection
252     @IR("""
253             func @"test7" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
254                 %2 : Var<java.type:"int"> = var %1 @"i";
255                 java.if
256                     ()java.type:"boolean" -> {
257                         %3 : java.type:"int" = var.load %2;
258                         %4 : java.type:"int" = constant @1;
259                         %5 : java.type:"boolean" = lt %3 %4;
260                         yield %5;
261                     }
262                     ()java.type:"void" -> {
263                         %6 : java.type:"int" = constant @1;
264                         var.store %2 %6;
265                         yield;
266                     }
267                     ()java.type:"void" -> {
268                         %7 : java.type:"int" = constant @2;
269                         var.store %2 %7;
270                         yield;
271                     };
272                 return;
273             };
274             """)
275     void test7(int i) {
276         if (i < 1)
277             i = 1;
278         else
279             i = 2;
280     }
281 
282     @CodeReflection
283     @IR("""
284             func @"test8" (%0 : java.type:"IfTest", %1 : java.type:"int")java.type:"void" -> {
285                 %2 : Var<java.type:"int"> = var %1 @"i";
286                 java.if
287                     ()java.type:"boolean" -> {
288                         %3 : java.type:"int" = var.load %2;
289                         %4 : java.type:"int" = constant @1;
290                         %5 : java.type:"boolean" = lt %3 %4;
291                         yield %5;
292                     }
293                     ()java.type:"void" -> {
294                         %6 : java.type:"int" = constant @1;
295                         var.store %2 %6;
296                         yield;
297                     }
298                     ()java.type:"boolean" -> {
299                         %7 : java.type:"int" = var.load %2;
300                         %8 : java.type:"int" = constant @2;
301                         %9 : java.type:"boolean" = lt %7 %8;
302                         yield %9;
303                     }
304                     ()java.type:"void" -> {
305                         %10 : java.type:"int" = constant @2;
306                         var.store %2 %10;
307                         yield;
308                     }
309                     ()java.type:"void" -> {
310                         %11 : java.type:"int" = constant @3;
311                         var.store %2 %11;
312                         yield;
313                     };
314                 return;
315             };
316             """)
317     void test8(int i) {
318         if (i < 1)
319             i = 1;
320         else if (i < 2)
321             i = 2;
322         else
323             i = 3;
324     }
325 
326     @IR("""
327             func @"test9" (%0 : java.type:"java.lang.Boolean")java.type:"void" -> {
328                 %1 : Var<java.type:"java.lang.Boolean"> = var %0 @"b";
329                 %2 : Var<java.type:"int"> = var @"i";
330                 java.if
331                     ()java.type:"boolean" -> {
332                         %3 : java.type:"java.lang.Boolean" = var.load %1;
333                         %4 : java.type:"boolean" = invoke %3 @java.ref:"java.lang.Boolean::booleanValue():boolean";
334                         yield %4;
335                     }
336                     ()java.type:"void" -> {
337                         %5 : java.type:"int" = constant @1;
338                         var.store %2 %5;
339                         yield;
340                     }
341                     ()java.type:"void" -> {
342                         %6 : java.type:"int" = constant @2;
343                         var.store %2 %6;
344                         yield;
345                     };
346                 return;
347             };
348             """)
349     @CodeReflection
350     static void test9(Boolean b) {
351         int i;
352         if (b) {
353             i = 1;
354         } else {
355             i = 2;
356         }
357     }
358 }