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 }