1 /*
2 * Copyright (c) 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.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 : java.type:"ArrayAccessTest", %1 : java.type:"int[]")java.type:"int" -> {
39 %2 : Var<java.type:"int[]"> = var %1 @"ia";
40 %3 : java.type:"int[]" = var.load %2;
41 %4 : java.type:"int" = constant @0;
42 %5 : java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[]", %2 : java.type:"int")java.type:"int" -> {
53 %3 : Var<java.type:"int[]"> = var %1 @"ia";
54 %4 : Var<java.type:"int"> = var %2 @"i";
55 %5 : java.type:"int[]" = var.load %3;
56 %6 : java.type:"int" = var.load %4;
57 %7 : java.type:"int" = constant @1;
58 %8 : java.type:"int" = add %6 %7;
59 %9 : java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[]")java.type:"void" -> {
70 %2 : Var<java.type:"int[]"> = var %1 @"ia";
71 %3 : java.type:"int[]" = var.load %2;
72 %4 : java.type:"int" = constant @0;
73 %5 : java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[]", %2 : java.type:"int")java.type:"void" -> {
85 %3 : Var<java.type:"int[]"> = var %1 @"ia";
86 %4 : Var<java.type:"int"> = var %2 @"i";
87 %5 : java.type:"int[]" = var.load %3;
88 %6 : java.type:"int" = var.load %4;
89 %7 : java.type:"int" = constant @1;
90 %8 : java.type:"int" = add %6 %7;
91 %9 : java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[][]", %2 : java.type:"int")java.type:"int" -> {
103 %3 : Var<java.type:"int[][]"> = var %1 @"ia";
104 %4 : Var<java.type:"int"> = var %2 @"i";
105 %5 : java.type:"int[][]" = var.load %3;
106 %6 : java.type:"int" = var.load %4;
107 %7 : java.type:"int" = constant @1;
108 %8 : java.type:"int" = add %6 %7;
109 %9 : java.type:"int[]" = array.load %5 %8;
110 %10 : java.type:"int" = var.load %4;
111 %11 : java.type:"int" = constant @2;
112 %12 : java.type:"int" = add %10 %11;
113 %13 : java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[][]", %2 : java.type:"int")java.type:"void" -> {
124 %3 : Var<java.type:"int[][]"> = var %1 @"ia";
125 %4 : Var<java.type:"int"> = var %2 @"i";
126 %5 : java.type:"int[][]" = var.load %3;
127 %6 : java.type:"int" = var.load %4;
128 %7 : java.type:"int" = constant @1;
129 %8 : java.type:"int" = add %6 %7;
130 %9 : java.type:"int[]" = array.load %5 %8;
131 %10 : java.type:"int" = var.load %4;
132 %11 : java.type:"int" = constant @2;
133 %12 : java.type:"int" = add %10 %11;
134 %13 : java.type:"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 : java.type:"ArrayAccessTest")java.type:"int" -> {
148 %1 : java.type:"int[]" = field.load %0 @java.ref:"ArrayAccessTest::ia:int[]";
149 %2 : java.type:"int" = constant @0;
150 %3 : java.type:"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 : java.type:"ArrayAccessTest")java.type:"int" -> {
161 %1 : java.type:"int[]" = field.load %0 @java.ref:"ArrayAccessTest::ia:int[]";
162 %2 : java.type:"int" = constant @0;
163 %3 : java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"ArrayAccessTest$A[]")java.type:"int" -> {
178 %2 : Var<java.type:"ArrayAccessTest$A[]"> = var %1 @"aa";
179 %3 : java.type:"ArrayAccessTest$A[]" = var.load %2;
180 %4 : java.type:"int" = constant @0;
181 %5 : java.type:"ArrayAccessTest$A" = array.load %3 %4;
182 %6 : java.type:"int" = field.load %5 @java.ref:"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 : java.type:"ArrayAccessTest", %1 : java.type:"ArrayAccessTest$A[]")java.type:"void" -> {
193 %2 : Var<java.type:"ArrayAccessTest$A[]"> = var %1 @"aa";
194 %3 : java.type:"ArrayAccessTest$A[]" = var.load %2;
195 %4 : java.type:"int" = constant @0;
196 %5 : java.type:"ArrayAccessTest$A" = array.load %3 %4;
197 %6 : java.type:"int" = constant @1;
198 field.store %5 %6 @java.ref:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[]")java.type:"void" -> {
209 %2 : Var<java.type:"int[]"> = var %1 @"ia";
210 %3 : java.type:"int[]" = var.load %2;
211 %4 : java.type:"int" = constant @0;
212 %5 : java.type:"int" = array.load %3 %4;
213 %6 : java.type:"int" = constant @1;
214 %7 : java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[]", %2 : java.type:"int")java.type:"void" -> {
226 %3 : Var<java.type:"int[]"> = var %1 @"ia";
227 %4 : Var<java.type:"int"> = var %2 @"i";
228 %5 : java.type:"int[]" = var.load %3;
229 %6 : java.type:"int" = constant @1;
230 %7 : java.type:"int[]" = var.load %3;
231 %8 : java.type:"int" = var.load %4;
232 %9 : java.type:"int" = constant @2;
233 %10 : java.type:"int" = add %8 %9;
234 %11 : java.type:"int" = array.load %7 %10;
235 %12 : java.type:"int" = constant @1;
236 %13 : java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[]", %2 : java.type:"int")java.type:"void" -> {
249 %3 : Var<java.type:"int[]"> = var %1 @"ia";
250 %4 : Var<java.type:"int"> = var %2 @"i";
251 %5 : java.type:"int[]" = var.load %3;
252 %6 : java.type:"int" = constant @1;
253 %7 : java.type:"int" = array.load %5 %6;
254 %8 : java.type:"int[]" = var.load %3;
255 %9 : java.type:"int" = var.load %4;
256 %10 : java.type:"int" = constant @2;
257 %11 : java.type:"int" = add %9 %10;
258 %12 : java.type:"int" = array.load %8 %11;
259 %13 : java.type:"int" = constant @1;
260 %14 : java.type:"int" = add %12 %13;
261 array.store %8 %11 %14;
262 %15 : java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[]")java.type:"void" -> {
275 %2 : Var<java.type:"int[]"> = var %1 @"ia";
276 %3 : java.type:"int[]" = var.load %2;
277 %4 : java.type:"int" = constant @0;
278 %5 : java.type:"int" = array.load %3 %4;
279 %6 : java.type:"int" = constant @1;
280 %7 : java.type:"int" = add %5 %6;
281 array.store %3 %4 %7;
282 %8 : Var<java.type:"int"> = var %5 @"x";
283 %9 : java.type:"int[]" = var.load %2;
284 %10 : java.type:"int" = constant @0;
285 %11 : java.type:"int" = array.load %9 %10;
286 %12 : java.type:"int" = constant @1;
287 %13 : java.type:"int" = sub %11 %12;
288 array.store %9 %10 %13;
289 %14 : Var<java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[]")java.type:"void" -> {
301 %2 : Var<java.type:"int[]"> = var %1 @"ia";
302 %3 : java.type:"int[]" = var.load %2;
303 %4 : java.type:"int" = constant @0;
304 %5 : java.type:"int" = array.load %3 %4;
305 %6 : java.type:"int" = constant @1;
306 %7 : java.type:"int" = add %5 %6;
307 array.store %3 %4 %7;
308 %8 : Var<java.type:"int"> = var %7 @"x";
309 %9 : java.type:"int[]" = var.load %2;
310 %10 : java.type:"int" = constant @0;
311 %11 : java.type:"int" = array.load %9 %10;
312 %12 : java.type:"int" = constant @1;
313 %13 : java.type:"int" = sub %11 %12;
314 array.store %9 %10 %13;
315 %14 : Var<java.type:"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 : java.type:"ArrayAccessTest", %1 : java.type:"int[]")java.type:"int" -> {
327 %2 : Var<java.type:"int[]"> = var %1 @"ia";
328 %3 : java.type:"int[]" = var.load %2;
329 %4 : java.type:"int" = array.length %3;
330 %5 : java.type:"int[]" = var.load %2;
331 %6 : java.type:"int" = invoke %5 @java.ref:"java.lang.Object::hashCode():int";
332 %7 : java.type:"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.type:"java.lang.Object[]")java.type:"java.lang.Object" -> {
343 %1 : Var<java.type:"java.lang.Object[]"> = var %0 @"a";
344 %2 : java.type:"java.lang.Object[]" = var.load %1;
345 %3 : java.type:"char" = constant @'c';
346 %4 : java.type:"int" = conv %3;
347 %5 : java.type:"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 }