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 /*
 25  * @test
 26  * @summary Smoke test for code reflection with binary operations.
 27  * @modules jdk.incubator.code
 28  * @build BinopTest
 29  * @build CodeReflectionTester
 30  * @run main CodeReflectionTester BinopTest
 31  */
 32 
 33 import jdk.incubator.code.CodeReflection;
 34 
 35 public class BinopTest {
 36 
 37     @CodeReflection
 38     @IR("""
 39             func @"test" (%0 : java.type:"BinopTest")java.type:"int" -> {
 40                 %1 : java.type:"int" = constant @5;
 41                 %2 : java.type:"int" = constant @2;
 42                 %3 : java.type:"int" = constant @4;
 43                 %4 : java.type:"int" = mul %2 %3;
 44                 %5 : java.type:"int" = add %1 %4;
 45                 %6 : java.type:"int" = constant @3;
 46                 %7 : java.type:"int" = sub %5 %6;
 47                 return %7;
 48             };
 49             """)
 50     int test() {
 51         return 5 + 2 * 4 - 3;
 52     }
 53 
 54     @CodeReflection
 55     @IR("""
 56             func @"test2" (%0 : java.type:"BinopTest")java.type:"int" -> {
 57                 %1 : java.type:"int" = constant @1;
 58                 %2 : java.type:"int" = constant @2;
 59                 %3 : java.type:"int" = constant @3;
 60                 %4 : java.type:"int" = constant @4;
 61                 %5 : java.type:"int" = add %3 %4;
 62                 %6 : java.type:"int" = add %2 %5;
 63                 %7 : java.type:"int" = add %1 %6;
 64                 return %7;
 65             };
 66             """)
 67     int test2() {
 68         return 1 + (2 + (3 + 4));
 69     }
 70 
 71     @CodeReflection
 72     @IR("""
 73             func @"test3" (%0 : java.type:"BinopTest")java.type:"int" -> {
 74                 %1 : java.type:"int" = constant @1;
 75                 %2 : java.type:"int" = constant @2;
 76                 %3 : java.type:"int" = add %1 %2;
 77                 %4 : java.type:"int" = constant @3;
 78                 %5 : java.type:"int" = add %3 %4;
 79                 %6 : java.type:"int" = constant @4;
 80                 %7 : java.type:"int" = add %5 %6;
 81                 return %7;
 82             };
 83             """)
 84     int test3() {
 85         return ((1 + 2) + 3) + 4;
 86     }
 87 
 88     @CodeReflection
 89     @IR("""
 90             func @"test4" (%0 : java.type:"BinopTest", %1 : java.type:"int")java.type:"int" -> {
 91                 %2 : Var<java.type:"int"> = var %1 @"i";
 92                 %3 : java.type:"int" = var.load %2;
 93                 %4 : java.type:"int" = constant @1;
 94                 %5 : java.type:"int" = add %3 %4;
 95                 var.store %2 %5;
 96                 %6 : java.type:"int" = var.load %2;
 97                 %7 : java.type:"int" = constant @1;
 98                 %8 : java.type:"int" = mul %6 %7;
 99                 var.store %2 %8;
100                 %9 : java.type:"int" = add %5 %8;
101                 %10 : java.type:"int" = var.load %2;
102                 %11 : java.type:"int" = constant @1;
103                 %12 : java.type:"int" = div %10 %11;
104                 var.store %2 %12;
105                 %13 : java.type:"int" = add %9 %12;
106                 %14 : java.type:"int" = var.load %2;
107                 %15 : java.type:"int" = constant @1;
108                 %16 : java.type:"int" = sub %14 %15;
109                 var.store %2 %16;
110                 %17 : java.type:"int" = add %13 %16;
111                 %18 : java.type:"int" = var.load %2;
112                 %19 : java.type:"int" = constant @1;
113                 %20 : java.type:"int" = mod %18 %19;
114                 var.store %2 %20;
115                 %21 : java.type:"int" = add %17 %20;
116                 return %21;
117             };
118             """)
119     int test4(int i) {
120         return (i += 1) + (i *= 1) + (i /= 1) + (i -= 1) + (i %= 1);
121     }
122 
123     @CodeReflection
124     @IR("""
125             func @"test5" (%0 : java.type:"BinopTest", %1 : java.type:"int")java.type:"boolean" -> {
126                 %2 : Var<java.type:"int"> = var %1 @"i";
127                 %3 : java.type:"int" = var.load %2;
128                 %4 : java.type:"int" = constant @0;
129                 %5 : java.type:"boolean" = eq %3 %4;
130                 %6 : java.type:"boolean" = not %5;
131                 return %6;
132             };
133             """)
134     boolean test5(int i) {
135         return !(i == 0);
136     }
137 
138     @CodeReflection
139     @IR("""
140             func @"test6" (%0 : java.type:"BinopTest")java.type:"int" -> {
141                 %1 : java.type:"int" = constant @5;
142                 %2 : java.type:"int" = constant @2;
143                 %3 : java.type:"int" = mod %1 %2;
144                 return %3;
145             };
146             """)
147     int test6() {
148         return 5 % 2;
149     }
150 
151     @CodeReflection
152     @IR("""
153             func @"test7" (%0 : java.type:"BinopTest", %1 : java.type:"double")java.type:"void" -> {
154                 %2 : Var<java.type:"double"> = var %1 @"d";
155                 %3 : java.type:"double" = var.load %2;
156                 %4 : java.type:"int" = constant @1;
157                 %5 : java.type:"double" = conv %4;
158                 %6 : java.type:"double" = add %3 %5;
159                 var.store %2 %6;
160                 %7 : java.type:"long" = constant @1;
161                 %8 : java.type:"double" = conv %7;
162                 %9 : java.type:"double" = var.load %2;
163                 %10 : java.type:"double" = add %8 %9;
164                 var.store %2 %10;
165                 %11 : java.type:"double" = var.load %2;
166                 %12 : java.type:"long" = constant @1;
167                 %13 : java.type:"double" = conv %12;
168                 %14 : java.type:"double" = sub %11 %13;
169                 var.store %2 %14;
170                 %15 : java.type:"int" = constant @1;
171                 %16 : java.type:"double" = conv %15;
172                 %17 : java.type:"double" = var.load %2;
173                 %18 : java.type:"double" = sub %16 %17;
174                 var.store %2 %18;
175                 %19 : java.type:"double" = var.load %2;
176                 %20 : java.type:"int" = constant @1;
177                 %21 : java.type:"double" = conv %20;
178                 %22 : java.type:"double" = mul %19 %21;
179                 var.store %2 %22;
180                 %23 : java.type:"long" = constant @1;
181                 %24 : java.type:"double" = conv %23;
182                 %25 : java.type:"double" = var.load %2;
183                 %26 : java.type:"double" = mul %24 %25;
184                 var.store %2 %26;
185                 %27 : java.type:"double" = var.load %2;
186                 %28 : java.type:"long" = constant @1;
187                 %29 : java.type:"double" = conv %28;
188                 %30 : java.type:"double" = div %27 %29;
189                 var.store %2 %30;
190                 %31 : java.type:"int" = constant @1;
191                 %32 : java.type:"double" = conv %31;
192                 %33 : java.type:"double" = var.load %2;
193                 %34 : java.type:"double" = div %32 %33;
194                 var.store %2 %34;
195                 %35 : java.type:"double" = var.load %2;
196                 %36 : java.type:"int" = constant @1;
197                 %37 : java.type:"double" = conv %36;
198                 %38 : java.type:"double" = mod %35 %37;
199                 var.store %2 %38;
200                 %39 : java.type:"long" = constant @1;
201                 %40 : java.type:"double" = conv %39;
202                 %41 : java.type:"double" = var.load %2;
203                 %42 : java.type:"double" = mod %40 %41;
204                 var.store %2 %42;
205                 %43 : java.type:"int" = constant @-1;
206                 %44 : java.type:"double" = conv %43;
207                 var.store %2 %44;
208                 return;
209             };
210             """)
211     void test7(double d) {
212         d = d + 1;
213         d = 1L + d;
214 
215         d = d - 1L;
216         d = 1 - d;
217 
218         d = d * 1;
219         d = 1L * d;
220 
221         d = d / 1L;
222         d = 1 / d;
223 
224         d = d % 1;
225         d = 1L % d;
226 
227         d = -1;
228     }
229 
230     @CodeReflection
231     @IR("""
232             func @"test8" (%0 : java.type:"BinopTest", %1 : java.type:"double")java.type:"void" -> {
233                 %2 : Var<java.type:"double"> = var %1 @"d";
234                 %3 : java.type:"double" = var.load %2;
235                 %4 : java.type:"int" = constant @1;
236                 %5 : java.type:"double" = conv %4;
237                 %6 : java.type:"double" = add %3 %5;
238                 var.store %2 %6;
239                 %7 : java.type:"double" = var.load %2;
240                 %8 : java.type:"long" = constant @1;
241                 %9 : java.type:"double" = conv %8;
242                 %10 : java.type:"double" = sub %7 %9;
243                 var.store %2 %10;
244                 %11 : java.type:"double" = var.load %2;
245                 %12 : java.type:"int" = constant @1;
246                 %13 : java.type:"double" = conv %12;
247                 %14 : java.type:"double" = mul %11 %13;
248                 var.store %2 %14;
249                 %15 : java.type:"double" = var.load %2;
250                 %16 : java.type:"long" = constant @1;
251                 %17 : java.type:"double" = conv %16;
252                 %18 : java.type:"double" = div %15 %17;
253                 var.store %2 %18;
254                 %19 : java.type:"double" = var.load %2;
255                 %20 : java.type:"int" = constant @1;
256                 %21 : java.type:"double" = conv %20;
257                 %22 : java.type:"double" = mod %19 %21;
258                 var.store %2 %22;
259                 return;
260             };
261             """)
262     void test8(double d) {
263         d += 1;
264 
265         d -= 1L;
266 
267         d *= 1;
268 
269         d /= 1L;
270 
271         d %= 1;
272     }
273 
274     @CodeReflection
275     @IR("""
276             func @"test9" (%0 : java.type:"BinopTest", %1 : java.type:"byte", %2 : java.type:"byte", %3 : java.type:"short")java.type:"void" -> {
277                 %4 : Var<java.type:"byte"> = var %1 @"a";
278                 %5 : Var<java.type:"byte"> = var %2 @"b";
279                 %6 : Var<java.type:"short"> = var %3 @"s";
280                 %7 : java.type:"byte" = var.load %4;
281                 %8 : java.type:"byte" = var.load %5;
282                 %9 : java.type:"byte" = add %7 %8;
283                 var.store %4 %9;
284                 %10 : java.type:"byte" = var.load %4;
285                 %11 : java.type:"short" = var.load %6;
286                 %12 : java.type:"byte" = conv %11;
287                 %13 : java.type:"byte" = div %10 %12;
288                 var.store %4 %13;
289                 %14 : java.type:"byte" = var.load %4;
290                 %15 : java.type:"double" = constant @3.5d;
291                 %16 : java.type:"byte" = conv %15;
292                 %17 : java.type:"byte" = mul %14 %16;
293                 var.store %4 %17;
294                 %18 : java.type:"byte" = var.load %4;
295                 %19 : java.type:"byte" = var.load %5;
296                 %20 : java.type:"byte" = lshl %18 %19;
297                 var.store %4 %20;
298                 %21 : java.type:"byte" = var.load %4;
299                 %22 : java.type:"int" = constant @1;
300                 %23 : java.type:"byte" = conv %22;
301                 %24 : java.type:"byte" = ashr %21 %23;
302                 var.store %4 %24;
303                 %25 : java.type:"byte" = var.load %4;
304                 %26 : java.type:"long" = constant @1;
305                 %27 : java.type:"byte" = conv %26;
306                 %28 : java.type:"byte" = ashr %25 %27;
307                 var.store %4 %28;
308                 return;
309             };
310             """)
311     void test9(byte a, byte b, short s) {
312         a += b;
313 
314         a /= s;
315 
316         a *= 3.5d;
317 
318         a <<= b;
319 
320         a >>= 1;
321 
322         a >>= 1L;
323     }
324 }