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 }