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