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 java.lang.runtime.CodeReflection;
 25 
 26 /*
 27  * @test
 28  * @summary Smoke test for code reflection with local variables.
 29  * @build LocalVarTest
 30  * @build CodeReflectionTester
 31  * @run main CodeReflectionTester LocalVarTest
 32  */
 33 
 34 public class LocalVarTest {
 35 
 36     @CodeReflection
 37     @IR("""
 38             func @"test1" (%0 : LocalVarTest)int -> {
 39                 %1 : int = constant @"1";
 40                 %2 : Var<int> = var %1 @"x";
 41                 %3 : int = constant @"2";
 42                 %4 : Var<int> = var %3 @"y";
 43                 %5 : int = var.load %2;
 44                 %6 : int = var.load %4;
 45                 %7 : int = add %5 %6;
 46                 return %7;
 47             };
 48             """)
 49     int test1() {
 50         int x = 1;
 51         int y = 2;
 52         return x + y;
 53     }
 54 
 55     @CodeReflection
 56     @IR("""
 57             func @"test2" (%0 : LocalVarTest, %1 : int, %2 : int)int -> {
 58                 %3 : Var<int> = var %1 @"x";
 59                 %4 : Var<int> = var %2 @"y";
 60                 %5 : int = var.load %3;
 61                 %6 : int = var.load %4;
 62                 %7 : int = add %5 %6;
 63                 return %7;
 64             };
 65             """)
 66     int test2(int x, int y) {
 67         return x + y;
 68     }
 69 
 70     @CodeReflection
 71     @IR("""
 72             func @"test3" (%0 : LocalVarTest)int -> {
 73                 %1 : int = constant @"0";
 74                 %2 : Var<int> = var %1 @"x";
 75                 %3 : int = constant @"0";
 76                 %4 : Var<int> = var %3 @"y";
 77                 %5 : int = constant @"1";
 78                 var.store %2 %5;
 79                 %6 : int = constant @"2";
 80                 var.store %4 %6;
 81                 %7 : int = var.load %2;
 82                 %8 : int = var.load %4;
 83                 %9 : int = add %7 %8;
 84                 return %9;
 85             };
 86             """)
 87     int test3() {
 88         int x;
 89         int y;
 90         x = 1;
 91         y = 2;
 92         return x + y;
 93     }
 94 
 95     @CodeReflection
 96     @IR("""
 97             func @"test4" (%0 : LocalVarTest)int -> {
 98                 %1 : int = constant @"1";
 99                 %2 : Var<int> = var %1 @"x";
100                 %3 : int = var.load %2;
101                 %4 : int = constant @"1";
102                 %5 : int = add %3 %4;
103                 %6 : Var<int> = var %5 @"y";
104                 %7 : int = var.load %6;
105                 return %7;
106             };
107             """)
108     int test4() {
109         int x = 1;
110         int y = x + 1;
111         return y;
112     }
113 
114     @CodeReflection
115     @IR("""
116             func @"test5" (%0 : LocalVarTest)int -> {
117                 %1 : int = constant @"1";
118                 %2 : Var<int> = var %1 @"x";
119                 %3 : int = var.load %2;
120                 %4 : Var<int> = var %3 @"y";
121                 %5 : int = var.load %4;
122                 return %5;
123             };
124             """)
125     int test5() {
126         int x = 1;
127         int y = x;
128         return y;
129     }
130 
131     @CodeReflection
132     @IR("""
133             func @"test6" (%0 : LocalVarTest)int -> {
134                 %1 : int = constant @"1";
135                 %2 : Var<int> = var %1 @"x";
136                 %3 : int = constant @"1";
137                 %4 : Var<int> = var %3 @"y";
138                 %5 : int = constant @"1";
139                 %6 : Var<int> = var %5 @"z";
140                 %7 : int = var.load %2;
141                 var.store %4 %7;
142                 var.store %6 %7;
143                 %8 : int = var.load %6;
144                 return %8;
145             };
146             """)
147     int test6() {
148         int x = 1;
149         int y = 1;
150         int z = 1;
151         z = y = x;
152         return z;
153     }
154 
155     @CodeReflection
156     @IR("""
157             func @"test7" (%0 : LocalVarTest)int -> {
158                 %1 : int = constant @"1";
159                 %2 : Var<int> = var %1 @"x";
160                 %3 : int = var.load %2;
161                 %4 : int = constant @"2";
162                 %5 : int = add %3 %4;
163                 var.store %2 %5;
164                 %6 : Var<int> = var %5 @"y";
165                 %7 : int = var.load %6;
166                 %8 : int = constant @"3";
167                 %9 : int = add %7 %8;
168                 var.store %6 %9;
169                 %10 : int = var.load %2;
170                 %11 : int = constant @"4";
171                 %12 : int = add %10 %11;
172                 var.store %2 %12;
173                 %13 : int = add %9 %12;
174                 return %13;
175             };
176             """)
177     int test7() {
178         int x = 1;
179         int y = x += 2;
180         return (y += 3) + (x += 4);
181     }
182 
183     @CodeReflection
184     @IR("""
185             func @"test8" (%0 : LocalVarTest, %1 : int)void -> {
186                 %2 : Var<int> = var %1 @"i";
187                 %3 : int = var.load %2;
188                 %4 : int = constant @"1";
189                 %5 : int = add %3 %4;
190                 var.store %2 %5;
191                 %6 : Var<int> = var %3 @"x";
192                 %7 : int = var.load %2;
193                 %8 : int = constant @"1";
194                 %9 : int = sub %7 %8;
195                 var.store %2 %9;
196                 %10 : Var<int> = var %7 @"y";
197                 return;
198             };
199             """)
200     void test8(int i) {
201         int x = i++;
202         int y = i--;
203     }
204 
205     @CodeReflection
206     @IR("""
207             func @"test9" (%0 : LocalVarTest, %1 : int)void -> {
208                 %2 : Var<int> = var %1 @"i";
209                 %3 : int = var.load %2;
210                 %4 : int = constant @"1";
211                 %5 : int = add %3 %4;
212                 var.store %2 %5;
213                 %6 : Var<int> = var %5 @"x";
214                 %7 : int = var.load %2;
215                 %8 : int = constant @"1";
216                 %9 : int = sub %7 %8;
217                 var.store %2 %9;
218                 %10 : Var<int> = var %9 @"y";
219                 return;
220             };
221             """)
222     void test9(int i) {
223         int x = ++i;
224         int y = --i;
225     }
226 }