1 /*
   2  * Copyright (c) 2019, 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 package compiler.valhalla.valuetypes;
  25 
  26 import jdk.test.lib.Asserts;
  27 import java.lang.reflect.Method;
  28 import java.util.Arrays;
  29 
  30 /*
  31  * @test
  32  * @summary Test nullable value type arrays
  33  * @library /testlibrary /test/lib /compiler/whitebox /
  34  * @requires (os.simpleArch == "x64" | os.simpleArch == "aarch64")
  35  * @compile TestNullableArrays.java
  36  * @run driver ClassFileInstaller sun.hotspot.WhiteBox jdk.test.lib.Platform
  37  * @run main/othervm/timeout=300 -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
  38  *                               -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI
  39  *                               compiler.valhalla.valuetypes.ValueTypeTest
  40  *                               compiler.valhalla.valuetypes.TestNullableArrays
  41  */
  42 public class TestNullableArrays extends ValueTypeTest {
  43     // Unlike C2, C1 intrinsics never deoptimize System.arraycopy. Instead, we fall back to
  44     // a normal method invocation when encountering flattened arrays.
  45     private static void assertDeoptimizedByC2(Method m) {
  46         if (isCompiledByC2(m)) {
  47             throw new RuntimeException("Type check should have caused it to deoptimize");
  48         }
  49     }
  50 
  51     // Extra VM parameters for some test scenarios. See ValueTypeTest.getVMParameters()
  52     @Override
  53     public String[] getExtraVMParameters(int scenario) {
  54         switch (scenario) {
  55         case 2: return new String[] {"-XX:-MonomorphicArrayCheck", "-XX:-UncommonNullCast"};
  56         case 3: return new String[] {"-XX:-MonomorphicArrayCheck", "-XX:-UncommonNullCast"};
  57         case 4: return new String[] {"-XX:-MonomorphicArrayCheck", "-XX:-UncommonNullCast"};
  58         case 5: return new String[] {"-XX:-MonomorphicArrayCheck", "-XX:-UncommonNullCast"};
  59         }
  60         return null;
  61     }
  62 
  63     public static void main(String[] args) throws Throwable {
  64         TestNullableArrays test = new TestNullableArrays();
  65         test.run(args, MyValue1.class, MyValue2.class, MyValue2Inline.class);
  66     }
  67 
  68     // Helper methods
  69 
  70     protected long hash() {
  71         return hash(rI, rL);
  72     }
  73 
  74     protected long hash(int x, long y) {
  75         return MyValue1.createWithFieldsInline(x, y).hash();
  76     }
  77 
  78     private static final MyValue1 testValue1 = MyValue1.createWithFieldsInline(rI, rL);
  79 
  80     // Test nullable value type array creation and initialization
  81     @Test(valid = ValueTypeArrayFlattenOn)
  82     @Test(valid = ValueTypeArrayFlattenOff, failOn = LOAD)
  83     public MyValue1?[] test1(int len) {
  84         MyValue1?[] va = new MyValue1?[len];
  85         if (len > 0) {
  86             va[0] = null;
  87         }
  88         for (int i = 1; i < len; ++i) {
  89             va[i] = MyValue1.createWithFieldsDontInline(rI, rL);
  90         }
  91         return va;
  92     }
  93 
  94     @DontCompile
  95     public void test1_verifier(boolean warmup) {
  96         int len = Math.abs(rI % 10);
  97         MyValue1?[] va = test1(len);
  98         if (len > 0) {
  99             Asserts.assertEQ(va[0], null);
 100         }
 101         for (int i = 1; i < len; ++i) {
 102             Asserts.assertEQ(va[i].hash(), hash());
 103         }
 104     }
 105 
 106     // Test creation of a value type array and element access
 107     @Test
 108     // TODO 8227588
 109     // @Test(failOn = ALLOC + ALLOCA + LOOP + LOAD + STORE + TRAP)
 110     public long test2() {
 111         MyValue1?[] va = new MyValue1?[1];
 112         va[0] = MyValue1.createWithFieldsInline(rI, rL);
 113         return va[0].hash();
 114     }
 115 
 116     @DontCompile
 117     public void test2_verifier(boolean warmup) {
 118         long result = test2();
 119         Asserts.assertEQ(result, hash());
 120     }
 121 
 122     // Test receiving a value type array from the interpreter,
 123     // updating its elements in a loop and computing a hash.
 124     @Test(failOn = ALLOCA)
 125     public long test3(MyValue1?[] va) {
 126         long result = 0;
 127         for (int i = 0; i < 10; ++i) {
 128             if (va[i] != null) {
 129                 result += va[i].hash();
 130             }
 131             va[i] = MyValue1.createWithFieldsInline(rI + 1, rL + 1);
 132         }
 133         va[0] = null;
 134         return result;
 135     }
 136 
 137     @DontCompile
 138     public void test3_verifier(boolean warmup) {
 139         MyValue1?[] va = new MyValue1?[10];
 140         long expected = 0;
 141         for (int i = 1; i < 10; ++i) {
 142             va[i] = MyValue1.createWithFieldsDontInline(rI + i, rL + i);
 143             expected += va[i].hash();
 144         }
 145         long result = test3(va);
 146         Asserts.assertEQ(expected, result);
 147         Asserts.assertEQ(va[0], null);
 148         for (int i = 1; i < 10; ++i) {
 149             if (va[i].hash() != hash(rI + 1, rL + 1)) {
 150                 Asserts.assertEQ(va[i].hash(), hash(rI + 1, rL + 1));
 151             }
 152         }
 153     }
 154 
 155     // Test returning a value type array received from the interpreter
 156     @Test(failOn = ALLOC + ALLOCA + LOAD + STORE + LOOP + TRAP)
 157     public MyValue1?[] test4(MyValue1?[] va) {
 158         return va;
 159     }
 160 
 161     @DontCompile
 162     public void test4_verifier(boolean warmup) {
 163         MyValue1?[] va = new MyValue1?[10];
 164         for (int i = 0; i < 10; ++i) {
 165             va[i] = MyValue1.createWithFieldsDontInline(rI + i, rL + i);
 166         }
 167         va = test4(va);
 168         for (int i = 0; i < 10; ++i) {
 169             Asserts.assertEQ(va[i].hash(), hash(rI + i, rL + i));
 170         }
 171     }
 172 
 173     // Merge value type arrays created from two branches
 174     @Test
 175     public MyValue1?[] test5(boolean b) {
 176         MyValue1?[] va;
 177         if (b) {
 178             va = new MyValue1?[5];
 179             for (int i = 0; i < 5; ++i) {
 180                 va[i] = MyValue1.createWithFieldsInline(rI, rL);
 181             }
 182             va[4] = null;
 183         } else {
 184             va = new MyValue1?[10];
 185             for (int i = 0; i < 10; ++i) {
 186                 va[i] = MyValue1.createWithFieldsInline(rI + i, rL + i);
 187             }
 188             va[9] = null;
 189         }
 190         long sum = va[0].hashInterpreted();
 191         if (b) {
 192             va[0] = MyValue1.createWithFieldsDontInline(rI, sum);
 193         } else {
 194             va[0] = MyValue1.createWithFieldsDontInline(rI + 1, sum + 1);
 195         }
 196         return va;
 197     }
 198 
 199     @DontCompile
 200     public void test5_verifier(boolean warmup) {
 201         MyValue1?[] va = test5(true);
 202         Asserts.assertEQ(va.length, 5);
 203         Asserts.assertEQ(va[0].hash(), hash(rI, hash()));
 204         for (int i = 1; i < 4; ++i) {
 205             Asserts.assertEQ(va[i].hash(), hash());
 206         }
 207         Asserts.assertEQ(va[4], null);
 208         va = test5(false);
 209         Asserts.assertEQ(va.length, 10);
 210         Asserts.assertEQ(va[0].hash(), hash(rI + 1, hash(rI, rL) + 1));
 211         for (int i = 1; i < 9; ++i) {
 212             Asserts.assertEQ(va[i].hash(), hash(rI + i, rL + i));
 213         }
 214         Asserts.assertEQ(va[9], null);
 215     }
 216 
 217     // Test creation of value type array with single element
 218     @Test(failOn = ALLOC + ALLOCA + LOOP + LOAD + STORE + TRAP)
 219     public MyValue1? test6() {
 220         MyValue1?[] va = new MyValue1?[1];
 221         return va[0];
 222     }
 223 
 224     @DontCompile
 225     public void test6_verifier(boolean warmup) {
 226         MyValue1?[] va = new MyValue1?[1];
 227         MyValue1? v = test6();
 228         Asserts.assertEQ(v, null);
 229     }
 230 
 231     // Test default initialization of value type arrays
 232     @Test(failOn = LOAD)
 233     public MyValue1?[] test7(int len) {
 234         return new MyValue1?[len];
 235     }
 236 
 237     @DontCompile
 238     public void test7_verifier(boolean warmup) {
 239         int len = Math.abs(rI % 10);
 240         MyValue1?[] va = test7(len);
 241         for (int i = 0; i < len; ++i) {
 242             Asserts.assertEQ(va[i], null);
 243             va[i] = null;
 244         }
 245     }
 246 
 247     // Test creation of value type array with zero length
 248     @Test(failOn = ALLOC + LOAD + STORE + LOOP + TRAP)
 249     public MyValue1?[] test8() {
 250         return new MyValue1?[0];
 251     }
 252 
 253     @DontCompile
 254     public void test8_verifier(boolean warmup) {
 255         MyValue1?[] va = test8();
 256         Asserts.assertEQ(va.length, 0);
 257     }
 258 
 259     static MyValue1?[] test9_va;
 260 
 261     // Test that value type array loaded from field has correct type
 262     @Test(failOn = LOOP)
 263     public long test9() {
 264         return test9_va[0].hash();
 265     }
 266 
 267     @DontCompile
 268     public void test9_verifier(boolean warmup) {
 269         test9_va = new MyValue1?[1];
 270         test9_va[0] = testValue1;
 271         long result = test9();
 272         Asserts.assertEQ(result, hash());
 273     }
 274 
 275     // Multi-dimensional arrays
 276     @Test
 277     public MyValue1?[][][] test10(int len1, int len2, int len3) {
 278         MyValue1?[][][] arr = new MyValue1?[len1][len2][len3];
 279         for (int i = 0; i < len1; i++) {
 280             for (int j = 0; j < len2; j++) {
 281                 for (int k = 0; k < len3; k++) {
 282                     arr[i][j][k] = MyValue1.createWithFieldsDontInline(rI + i , rL + j + k);
 283                     if (k == 0) {
 284                         arr[i][j][k] = null;
 285                     }
 286                 }
 287             }
 288         }
 289         return arr;
 290     }
 291 
 292     @DontCompile
 293     public void test10_verifier(boolean warmup) {
 294         MyValue1?[][][] arr = test10(2, 3, 4);
 295         for (int i = 0; i < 2; i++) {
 296             for (int j = 0; j < 3; j++) {
 297                 for (int k = 0; k < 4; k++) {
 298                     if (k == 0) {
 299                         Asserts.assertEQ(arr[i][j][k], null);
 300                     } else {
 301                         Asserts.assertEQ(arr[i][j][k].hash(), MyValue1.createWithFieldsDontInline(rI + i , rL + j + k).hash());
 302                     }
 303                     arr[i][j][k] = null;
 304                 }
 305             }
 306         }
 307     }
 308 
 309     @Test
 310     public void test11(MyValue1?[][][] arr, long[] res) {
 311         int l = 0;
 312         for (int i = 0; i < arr.length; i++) {
 313             for (int j = 0; j < arr[i].length; j++) {
 314                 for (int k = 0; k < arr[i][j].length; k++) {
 315                     if (arr[i][j][k] != null) {
 316                         res[l] = arr[i][j][k].hash();
 317                     }
 318                     arr[i][j][k] = null;
 319                     l++;
 320                 }
 321             }
 322         }
 323     }
 324 
 325     @DontCompile
 326     public void test11_verifier(boolean warmup) {
 327         MyValue1?[][][] arr = new MyValue1?[2][3][4];
 328         long[] res = new long[2*3*4];
 329         long[] verif = new long[2*3*4];
 330         int l = 0;
 331         for (int i = 0; i < 2; i++) {
 332             for (int j = 0; j < 3; j++) {
 333                 for (int k = 0; k < 4; k++) {
 334                     if (j != 2) {
 335                         arr[i][j][k] = MyValue1.createWithFieldsDontInline(rI + i, rL + j + k);
 336                         verif[l] = arr[i][j][k].hash();
 337                     }
 338                     l++;
 339                 }
 340             }
 341         }
 342         test11(arr, res);
 343         for (int i = 0; i < verif.length; i++) {
 344             Asserts.assertEQ(res[i], verif[i]);
 345         }
 346     }
 347 
 348     // Array load out of bounds (upper bound) at compile time
 349     @Test
 350     public int test12() {
 351         int arraySize = Math.abs(rI) % 10;
 352         MyValue1?[] va = new MyValue1?[arraySize];
 353 
 354         for (int i = 0; i < arraySize; i++) {
 355             va[i] = MyValue1.createWithFieldsDontInline(rI + 1, rL);
 356         }
 357 
 358         try {
 359             return va[arraySize + 1].x;
 360         } catch (ArrayIndexOutOfBoundsException e) {
 361             return rI;
 362         }
 363     }
 364 
 365     public void test12_verifier(boolean warmup) {
 366         Asserts.assertEQ(test12(), rI);
 367     }
 368 
 369     // Array load  out of bounds (lower bound) at compile time
 370     @Test
 371     public int test13() {
 372         int arraySize = Math.abs(rI) % 10;
 373         MyValue1?[] va = new MyValue1?[arraySize];
 374 
 375         for (int i = 0; i < arraySize; i++) {
 376             va[i] = MyValue1.createWithFieldsDontInline(rI + i, rL);
 377         }
 378 
 379         try {
 380             return va[-arraySize].x;
 381         } catch (ArrayIndexOutOfBoundsException e) {
 382             return rI;
 383         }
 384     }
 385 
 386     public void test13_verifier(boolean warmup) {
 387         Asserts.assertEQ(test13(), rI);
 388     }
 389 
 390     // Array load out of bound not known to compiler (both lower and upper bound)
 391     @Test
 392     public int test14(MyValue1?[] va, int index)  {
 393         return va[index].x;
 394     }
 395 
 396     public void test14_verifier(boolean warmup) {
 397         int arraySize = Math.abs(rI) % 10;
 398         MyValue1?[] va = new MyValue1?[arraySize];
 399 
 400         for (int i = 0; i < arraySize; i++) {
 401             va[i] = MyValue1.createWithFieldsDontInline(rI, rL);
 402         }
 403 
 404         int result;
 405         for (int i = -20; i < 20; i++) {
 406             try {
 407                 result = test14(va, i);
 408             } catch (ArrayIndexOutOfBoundsException e) {
 409                 result = rI;
 410             }
 411             Asserts.assertEQ(result, rI);
 412         }
 413     }
 414 
 415     // Array store out of bounds (upper bound) at compile time
 416     @Test
 417     public int test15() {
 418         int arraySize = Math.abs(rI) % 10;
 419         MyValue1?[] va = new MyValue1?[arraySize];
 420 
 421         try {
 422             for (int i = 0; i <= arraySize; i++) {
 423                 va[i] = MyValue1.createWithFieldsDontInline(rI + 1, rL);
 424             }
 425             return rI - 1;
 426         } catch (ArrayIndexOutOfBoundsException e) {
 427             return rI;
 428         }
 429     }
 430 
 431     public void test15_verifier(boolean warmup) {
 432         Asserts.assertEQ(test15(), rI);
 433     }
 434 
 435     // Array store out of bounds (lower bound) at compile time
 436     @Test
 437     public int test16() {
 438         int arraySize = Math.abs(rI) % 10;
 439         MyValue1?[] va = new MyValue1?[arraySize];
 440 
 441         try {
 442             for (int i = -1; i <= arraySize; i++) {
 443                 va[i] = MyValue1.createWithFieldsDontInline(rI + 1, rL);
 444             }
 445             return rI - 1;
 446         } catch (ArrayIndexOutOfBoundsException e) {
 447             return rI;
 448         }
 449     }
 450 
 451     public void test16_verifier(boolean warmup) {
 452         Asserts.assertEQ(test16(), rI);
 453     }
 454 
 455     // Array store out of bound not known to compiler (both lower and upper bound)
 456     @Test
 457     public int test17(MyValue1?[] va, int index, MyValue1 vt)  {
 458         va[index] = vt;
 459         return va[index].x;
 460     }
 461 
 462     @DontCompile
 463     public void test17_verifier(boolean warmup) {
 464         int arraySize = Math.abs(rI) % 10;
 465         MyValue1?[] va = new MyValue1?[arraySize];
 466 
 467         for (int i = 0; i < arraySize; i++) {
 468             va[i] = MyValue1.createWithFieldsDontInline(rI, rL);
 469         }
 470 
 471         MyValue1 vt = MyValue1.createWithFieldsDontInline(rI + 1, rL);
 472         int result;
 473         for (int i = -20; i < 20; i++) {
 474             try {
 475                 result = test17(va, i, vt);
 476             } catch (ArrayIndexOutOfBoundsException e) {
 477                 result = rI + 1;
 478             }
 479             Asserts.assertEQ(result, rI + 1);
 480         }
 481 
 482         for (int i = 0; i < arraySize; i++) {
 483             Asserts.assertEQ(va[i].x, rI + 1);
 484         }
 485     }
 486 
 487     // clone() as stub call
 488     @Test
 489     public MyValue1?[] test18(MyValue1?[] va) {
 490         return va.clone();
 491     }
 492 
 493     @DontCompile
 494     public void test18_verifier(boolean warmup) {
 495         int len = Math.abs(rI) % 10;
 496         MyValue1?[] va1 = new MyValue1?[len];
 497         MyValue1[]  va2 = new MyValue1[len];
 498         for (int i = 1; i < len; ++i) {
 499             va1[i] = testValue1;
 500             va2[i] = testValue1;
 501         }
 502         MyValue1?[] result1 = test18(va1);
 503         if (len > 0) {
 504             Asserts.assertEQ(result1[0], null);
 505         }
 506         for (int i = 1; i < len; ++i) {
 507             Asserts.assertEQ(result1[i].hash(), va1[i].hash());
 508         }
 509         // make sure we do deopt: GraphKit::new_array assumes an
 510         // array of references
 511         for (int j = 0; j < 10; j++) {
 512             MyValue1?[] result2 = test18(va2);
 513 
 514             for (int i = 0; i < len; ++i) {
 515                 Asserts.assertEQ(result2[i].hash(), va2[i].hash());
 516             }
 517         }
 518         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test18")) {
 519             MyValue1?[] result2 = test18(va2);
 520             for (int i = 0; i < len; ++i) {
 521                 Asserts.assertEQ(result2[i].hash(), va2[i].hash());
 522             }
 523         }
 524     }
 525 
 526     // clone() as series of loads/stores
 527     static MyValue1?[] test19_orig = null;
 528 
 529     @Test
 530     public MyValue1?[] test19() {
 531         MyValue1?[] va = new MyValue1?[8];
 532         for (int i = 1; i < va.length; ++i) {
 533             va[i] = MyValue1.createWithFieldsInline(rI, rL);
 534         }
 535         test19_orig = va;
 536 
 537         return va.clone();
 538     }
 539 
 540     @DontCompile
 541     public void test19_verifier(boolean warmup) {
 542         MyValue1?[] result = test19();
 543         Asserts.assertEQ(result[0], null);
 544         for (int i = 1; i < test19_orig.length; ++i) {
 545             Asserts.assertEQ(result[i].hash(), test19_orig[i].hash());
 546         }
 547     }
 548 
 549     // arraycopy() of value type array with oop fields
 550     @Test
 551     public void test20(MyValue1?[] src, MyValue1?[] dst) {
 552         System.arraycopy(src, 0, dst, 0, src.length);
 553     }
 554 
 555     @DontCompile
 556     public void test20_verifier(boolean warmup) {
 557         int len = Math.abs(rI) % 10;
 558         MyValue1?[] src1 = new MyValue1?[len];
 559         MyValue1?[] src2 = new MyValue1?[len];
 560         MyValue1[]  src3 = new MyValue1[len];
 561         MyValue1[]  src4 = new MyValue1[len];
 562         MyValue1?[] dst1 = new MyValue1?[len];
 563         MyValue1[]  dst2 = new MyValue1[len];
 564         MyValue1?[] dst3 = new MyValue1?[len];
 565         MyValue1[]  dst4 = new MyValue1[len];
 566         if (len > 0) {
 567             src2[0] = testValue1;
 568         }
 569         for (int i = 1; i < len; ++i) {
 570             src1[i] = testValue1;
 571             src2[i] = testValue1;
 572             src3[i] = testValue1;
 573             src4[i] = testValue1;
 574         }
 575         test20(src1, dst1);
 576         test20(src2, dst2);
 577         test20(src3, dst3);
 578         test20(src4, dst4);
 579         if (len > 0) {
 580             Asserts.assertEQ(dst1[0], null);
 581             Asserts.assertEQ(dst2[0].hash(), src2[0].hash());
 582             Asserts.assertEQ(dst3[0].hash(), src3[0].hash());
 583             Asserts.assertEQ(dst4[0].hash(), src4[0].hash());
 584         }
 585         for (int i = 1; i < len; ++i) {
 586             Asserts.assertEQ(src1[i].hash(), dst1[i].hash());
 587             Asserts.assertEQ(src2[i].hash(), dst2[i].hash());
 588             Asserts.assertEQ(src3[i].hash(), dst3[i].hash());
 589             Asserts.assertEQ(src4[i].hash(), dst4[i].hash());
 590         }
 591     }
 592 
 593     // arraycopy() of value type array with no oop field
 594     @Test
 595     public void test21(MyValue2?[] src, MyValue2?[] dst) {
 596         System.arraycopy(src, 0, dst, 0, src.length);
 597     }
 598 
 599     @DontCompile
 600     public void test21_verifier(boolean warmup) {
 601         int len = Math.abs(rI) % 10;
 602         MyValue2?[] src1 = new MyValue2?[len];
 603         MyValue2?[] src2 = new MyValue2?[len];
 604         MyValue2[]  src3 = new MyValue2[len];
 605         MyValue2[]  src4 = new MyValue2[len];
 606         MyValue2?[] dst1 = new MyValue2?[len];
 607         MyValue2[]  dst2 = new MyValue2[len];
 608         MyValue2?[] dst3 = new MyValue2?[len];
 609         MyValue2[]  dst4 = new MyValue2[len];
 610         if (len > 0) {
 611             src2[0] = MyValue2.createWithFieldsInline(rI, true);
 612         }
 613         for (int i = 1; i < len; ++i) {
 614             src1[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
 615             src2[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
 616             src3[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
 617             src4[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
 618         }
 619         test21(src1, dst1);
 620         test21(src2, dst2);
 621         test21(src3, dst3);
 622         test21(src4, dst4);
 623         if (len > 0) {
 624             Asserts.assertEQ(dst1[0], null);
 625             Asserts.assertEQ(dst2[0].hash(), src2[0].hash());
 626             Asserts.assertEQ(dst3[0].hash(), src3[0].hash());
 627             Asserts.assertEQ(dst4[0].hash(), src4[0].hash());
 628         }
 629         for (int i = 1; i < len; ++i) {
 630             Asserts.assertEQ(src1[i].hash(), dst1[i].hash());
 631             Asserts.assertEQ(src2[i].hash(), dst2[i].hash());
 632             Asserts.assertEQ(src3[i].hash(), dst3[i].hash());
 633             Asserts.assertEQ(src4[i].hash(), dst4[i].hash());
 634         }
 635     }
 636 
 637     // arraycopy() of value type array with oop field and tightly
 638     // coupled allocation as dest
 639     @Test
 640     public MyValue1?[] test22(MyValue1?[] src) {
 641         MyValue1?[] dst = new MyValue1?[src.length];
 642         System.arraycopy(src, 0, dst, 0, src.length);
 643         return dst;
 644     }
 645 
 646     @DontCompile
 647     public void test22_verifier(boolean warmup) {
 648         int len = Math.abs(rI) % 10;
 649         MyValue1?[] src1 = new MyValue1?[len];
 650         MyValue1[]  src2 = new MyValue1[len];
 651         for (int i = 1; i < len; ++i) {
 652             src1[i] = testValue1;
 653             src2[i] = testValue1;
 654         }
 655         MyValue1?[] dst1 = test22(src1);
 656         MyValue1?[] dst2 = test22(src2);
 657         if (len > 0) {
 658             Asserts.assertEQ(dst1[0], null);
 659             Asserts.assertEQ(dst2[0].hash(), MyValue1.default.hash());
 660         }
 661         for (int i = 1; i < len; ++i) {
 662             Asserts.assertEQ(src1[i].hash(), dst1[i].hash());
 663             Asserts.assertEQ(src2[i].hash(), dst2[i].hash());
 664         }
 665     }
 666 
 667     // arraycopy() of value type array with oop fields and tightly
 668     // coupled allocation as dest
 669     @Test
 670     public MyValue1?[] test23(MyValue1?[] src) {
 671         MyValue1?[] dst = new MyValue1?[src.length + 10];
 672         System.arraycopy(src, 0, dst, 5, src.length);
 673         return dst;
 674     }
 675 
 676     @DontCompile
 677     public void test23_verifier(boolean warmup) {
 678         int len = Math.abs(rI) % 10;
 679         MyValue1?[] src1 = new MyValue1?[len];
 680         MyValue1[] src2 = new MyValue1[len];
 681         for (int i = 0; i < len; ++i) {
 682             src1[i] = testValue1;
 683             src2[i] = testValue1;
 684         }
 685         MyValue1?[] dst1 = test23(src1);
 686         MyValue1?[] dst2 = test23(src2);
 687         for (int i = 0; i < 5; ++i) {
 688             Asserts.assertEQ(dst1[i], null);
 689             Asserts.assertEQ(dst2[i], null);
 690         }
 691         for (int i = 5; i < len; ++i) {
 692             Asserts.assertEQ(src1[i].hash(), dst1[i].hash());
 693             Asserts.assertEQ(src2[i].hash(), dst2[i].hash());
 694         }
 695     }
 696 
 697     // arraycopy() of value type array passed as Object
 698     @Test
 699     public void test24(MyValue1?[] src, Object dst) {
 700         System.arraycopy(src, 0, dst, 0, src.length);
 701     }
 702 
 703     @DontCompile
 704     public void test24_verifier(boolean warmup) {
 705         int len = Math.abs(rI) % 10;
 706         MyValue1?[] src1 = new MyValue1?[len];
 707         MyValue1?[] src2 = new MyValue1?[len];
 708         MyValue1[]  src3 = new MyValue1[len];
 709         MyValue1[]  src4 = new MyValue1[len];
 710         MyValue1?[] dst1 = new MyValue1?[len];
 711         MyValue1[]  dst2 = new MyValue1[len];
 712         MyValue1?[] dst3 = new MyValue1?[len];
 713         MyValue1[]  dst4 = new MyValue1[len];
 714         if (len > 0) {
 715             src2[0] = testValue1;
 716         }
 717         for (int i = 1; i < len; ++i) {
 718             src1[i] = testValue1;
 719             src2[i] = testValue1;
 720             src3[i] = testValue1;
 721             src4[i] = testValue1;
 722         }
 723         test24(src1, dst1);
 724         test24(src2, dst2);
 725         test24(src3, dst3);
 726         test24(src4, dst4);
 727         if (len > 0) {
 728             Asserts.assertEQ(dst1[0], null);
 729             Asserts.assertEQ(dst2[0].hash(), src2[0].hash());
 730             Asserts.assertEQ(dst3[0].hash(), src3[0].hash());
 731             Asserts.assertEQ(dst4[0].hash(), src4[0].hash());
 732         }
 733         for (int i = 1; i < len; ++i) {
 734             Asserts.assertEQ(src1[i].hash(), dst1[i].hash());
 735             Asserts.assertEQ(src2[i].hash(), dst2[i].hash());
 736             Asserts.assertEQ(src3[i].hash(), dst3[i].hash());
 737             Asserts.assertEQ(src4[i].hash(), dst4[i].hash());
 738         }
 739     }
 740 
 741     // short arraycopy() with no oop field
 742     @Test
 743     public void test25(MyValue2?[] src, MyValue2?[] dst) {
 744         System.arraycopy(src, 0, dst, 0, 8);
 745     }
 746 
 747     @DontCompile
 748     public void test25_verifier(boolean warmup) {
 749         MyValue2?[] src1 = new MyValue2?[8];
 750         MyValue2?[] src2 = new MyValue2?[8];
 751         MyValue2[]  src3 = new MyValue2[8];
 752         MyValue2[]  src4 = new MyValue2[8];
 753         MyValue2?[] dst1 = new MyValue2?[8];
 754         MyValue2[]  dst2 = new MyValue2[8];
 755         MyValue2?[] dst3 = new MyValue2?[8];
 756         MyValue2[]  dst4 = new MyValue2[8];
 757         src2[0] = MyValue2.createWithFieldsInline(rI, true);
 758         for (int i = 1; i < 8; ++i) {
 759             src1[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
 760             src2[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
 761             src3[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
 762             src4[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
 763         }
 764         test25(src1, dst1);
 765         test25(src2, dst2);
 766         test25(src3, dst3);
 767         test25(src4, dst4);
 768         Asserts.assertEQ(dst1[0], null);
 769         Asserts.assertEQ(dst2[0].hash(), src2[0].hash());
 770         Asserts.assertEQ(dst3[0].hash(), src3[0].hash());
 771         Asserts.assertEQ(dst4[0].hash(), src4[0].hash());
 772         for (int i = 1; i < 8; ++i) {
 773             Asserts.assertEQ(src1[i].hash(), dst1[i].hash());
 774             Asserts.assertEQ(src2[i].hash(), dst2[i].hash());
 775             Asserts.assertEQ(src3[i].hash(), dst3[i].hash());
 776             Asserts.assertEQ(src4[i].hash(), dst4[i].hash());
 777         }
 778     }
 779 
 780     // short arraycopy() with oop fields
 781     @Test
 782     public void test26(MyValue1?[] src, MyValue1?[] dst) {
 783         System.arraycopy(src, 0, dst, 0, 8);
 784     }
 785 
 786     @DontCompile
 787     public void test26_verifier(boolean warmup) {
 788         MyValue1?[] src1 = new MyValue1?[8];
 789         MyValue1?[] src2 = new MyValue1?[8];
 790         MyValue1[]  src3 = new MyValue1[8];
 791         MyValue1[]  src4 = new MyValue1[8];
 792         MyValue1?[] dst1 = new MyValue1?[8];
 793         MyValue1[]  dst2 = new MyValue1[8];
 794         MyValue1?[] dst3 = new MyValue1?[8];
 795         MyValue1[]  dst4 = new MyValue1[8];
 796         src2[0] = testValue1;
 797         for (int i = 1; i < 8 ; ++i) {
 798             src1[i] = testValue1;
 799             src2[i] = testValue1;
 800             src3[i] = testValue1;
 801             src4[i] = testValue1;
 802         }
 803         test26(src1, dst1);
 804         test26(src2, dst2);
 805         test26(src3, dst3);
 806         test26(src4, dst4);
 807         Asserts.assertEQ(dst1[0], null);
 808         Asserts.assertEQ(dst2[0].hash(), src2[0].hash());
 809         Asserts.assertEQ(dst3[0].hash(), src3[0].hash());
 810         Asserts.assertEQ(dst4[0].hash(), src4[0].hash());
 811         for (int i = 1; i < 8; ++i) {
 812             Asserts.assertEQ(src1[i].hash(), dst1[i].hash());
 813             Asserts.assertEQ(src2[i].hash(), dst2[i].hash());
 814             Asserts.assertEQ(src3[i].hash(), dst3[i].hash());
 815             Asserts.assertEQ(src4[i].hash(), dst4[i].hash());
 816         }
 817     }
 818 
 819     // short arraycopy() with oop fields and offsets
 820     @Test
 821     public void test27(MyValue1?[] src, MyValue1?[] dst) {
 822         System.arraycopy(src, 1, dst, 2, 6);
 823     }
 824 
 825     @DontCompile
 826     public void test27_verifier(boolean warmup) {
 827         MyValue1?[] src1 = new MyValue1?[8];
 828         MyValue1?[] src2 = new MyValue1?[8];
 829         MyValue1[]  src3 = new MyValue1[8];
 830         MyValue1[]  src4 = new MyValue1[8];
 831         MyValue1?[] dst1 = new MyValue1?[8];
 832         MyValue1[]  dst2 = new MyValue1[8];
 833         MyValue1?[] dst3 = new MyValue1?[8];
 834         MyValue1[]  dst4 = new MyValue1[8];
 835         for (int i = 1; i < 8; ++i) {
 836             src1[i] = testValue1;
 837             src2[i] = testValue1;
 838             src3[i] = testValue1;
 839             src4[i] = testValue1;
 840         }
 841         test27(src1, dst1);
 842         test27(src2, dst2);
 843         test27(src3, dst3);
 844         test27(src4, dst4);
 845         for (int i = 0; i < 2; ++i) {
 846             Asserts.assertEQ(dst1[i], null);
 847             Asserts.assertEQ(dst2[i].hash(), MyValue1.default.hash());
 848             Asserts.assertEQ(dst3[i], null);
 849             Asserts.assertEQ(dst4[i].hash(), MyValue1.default.hash());
 850         }
 851         for (int i = 2; i < 8; ++i) {
 852             Asserts.assertEQ(src1[i].hash(), dst1[i].hash());
 853             Asserts.assertEQ(src2[i].hash(), dst2[i].hash());
 854             Asserts.assertEQ(src3[i].hash(), dst3[i].hash());
 855             Asserts.assertEQ(src4[i].hash(), dst4[i].hash());
 856         }
 857     }
 858 
 859     // non escaping allocations
 860     @Test(failOn = ALLOC + ALLOCA + LOOP + LOAD + STORE + TRAP)
 861     public MyValue2? test28() {
 862         MyValue2?[] src = new MyValue2?[10];
 863         src[0] = null;
 864         MyValue2?[] dst = (MyValue2?[])src.clone();
 865         return dst[0];
 866     }
 867 
 868     @DontCompile
 869     public void test28_verifier(boolean warmup) {
 870         MyValue2 v = MyValue2.createWithFieldsInline(rI, false);
 871         MyValue2? result = test28();
 872         Asserts.assertEQ(result, null);
 873     }
 874 
 875     // non escaping allocations
 876     // TODO 8227588: shouldn't this have the same IR matching rules as test6?
 877     @Test(failOn = ALLOCA + LOOP + TRAP)
 878     public MyValue2? test29(MyValue2?[] src) {
 879         MyValue2?[] dst = new MyValue2?[10];
 880         System.arraycopy(src, 0, dst, 0, 10);
 881         return dst[0];
 882     }
 883 
 884     @DontCompile
 885     public void test29_verifier(boolean warmup) {
 886         MyValue2?[] src = new MyValue2?[10];
 887         for (int i = 0; i < 10; ++i) {
 888             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
 889         }
 890         MyValue2? v = test29(src);
 891         Asserts.assertEQ(src[0].hash(), v.hash());
 892     }
 893 
 894     // non escaping allocation with uncommon trap that needs
 895     // eliminated value type array element as debug info
 896     @Test
 897     @Warmup(10000)
 898     public MyValue2? test30(MyValue2?[] src, boolean flag) {
 899         MyValue2?[] dst = new MyValue2?[10];
 900         System.arraycopy(src, 0, dst, 0, 10);
 901         if (flag) { }
 902         return dst[0];
 903     }
 904 
 905     @DontCompile
 906     public void test30_verifier(boolean warmup) {
 907         MyValue2?[] src = new MyValue2?[10];
 908         for (int i = 0; i < 10; ++i) {
 909             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
 910         }
 911         MyValue2? v = test30(src, !warmup);
 912         Asserts.assertEQ(src[0].hash(), v.hash());
 913     }
 914 
 915     // non escaping allocation with memory phi
 916     @Test()
 917     // TODO 8227588
 918     // @Test(failOn = ALLOC + ALLOCA + LOOP + LOAD + STORE + TRAP)
 919     public long test31(boolean b, boolean deopt) {
 920         MyValue2?[] src = new MyValue2?[1];
 921         if (b) {
 922             src[0] = MyValue2.createWithFieldsInline(rI, true);
 923         } else {
 924             src[0] = MyValue2.createWithFieldsInline(rI, false);
 925         }
 926         if (deopt) {
 927             // uncommon trap
 928             WHITE_BOX.deoptimizeMethod(tests.get(getClass().getSimpleName() + "::test31"));
 929         }
 930         return src[0].hash();
 931     }
 932 
 933     @DontCompile
 934     public void test31_verifier(boolean warmup) {
 935         MyValue2 v1 = MyValue2.createWithFieldsInline(rI, true);
 936         long result1 = test31(true, !warmup);
 937         Asserts.assertEQ(result1, v1.hash());
 938         MyValue2 v2 = MyValue2.createWithFieldsInline(rI, false);
 939         long result2 = test31(false, !warmup);
 940         Asserts.assertEQ(result2, v2.hash());
 941     }
 942 
 943     // Tests with Object arrays and clone/arraycopy
 944     // clone() as stub call
 945     @Test
 946     public Object[] test32(Object[] va) {
 947         return va.clone();
 948     }
 949 
 950     @DontCompile
 951     public void test32_verifier(boolean warmup) {
 952         int len = Math.abs(rI) % 10;
 953         MyValue1?[] va1 = new MyValue1?[len];
 954         MyValue1[] va2 = new MyValue1[len];
 955         for (int i = 1; i < len; ++i) {
 956             va1[i] = testValue1;
 957             va2[i] = testValue1;
 958         }
 959         MyValue1?[] result1 = (MyValue1?[])test32(va1);
 960         MyValue1?[] result2 = (MyValue1?[])test32(va2);
 961         if (len > 0) {
 962             Asserts.assertEQ(result1[0], null);
 963             Asserts.assertEQ(result2[0].hash(), MyValue1.default.hash());
 964         }
 965         for (int i = 1; i < len; ++i) {
 966             Asserts.assertEQ(((MyValue1)result1[i]).hash(), ((MyValue1)va1[i]).hash());
 967             Asserts.assertEQ(((MyValue1)result2[i]).hash(), ((MyValue1)va2[i]).hash());
 968         }
 969     }
 970 
 971     @Test
 972     public Object[] test33(Object[] va) {
 973         return va.clone();
 974     }
 975 
 976     @DontCompile
 977     public void test33_verifier(boolean warmup) {
 978         int len = Math.abs(rI) % 10;
 979         Object[] va = new Object[len];
 980         for (int i = 0; i < len; ++i) {
 981             va[i] = testValue1;
 982         }
 983         Object[] result = test33(va);
 984         for (int i = 0; i < len; ++i) {
 985             Asserts.assertEQ(((MyValue1)result[i]).hash(), ((MyValue1)va[i]).hash());
 986         }
 987     }
 988 
 989     // clone() as series of loads/stores
 990     static Object[] test34_orig = null;
 991 
 992     @ForceInline
 993     public Object[] test34_helper(boolean flag) {
 994         Object[] va = null;
 995         if (flag) {
 996             va = new MyValue1?[8];
 997             for (int i = 0; i < va.length; ++i) {
 998                 va[i] = MyValue1.createWithFieldsDontInline(rI, rL);
 999             }
1000         } else {
1001             va = new Object[8];
1002         }
1003         return va;
1004     }
1005 
1006     @Test
1007     public Object[] test34(boolean flag) {
1008         Object[] va = test34_helper(flag);
1009         test34_orig = va;
1010         return va.clone();
1011     }
1012 
1013     @DontCompile
1014     public void test34_verifier(boolean warmup) {
1015         test34(false);
1016         for (int i = 0; i < 10; i++) { // make sure we do deopt
1017             Object[] result = test34(true);
1018             verify(test34_orig, result);
1019         }
1020         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test34")) {
1021             Object[] result = test34(true);
1022             verify(test34_orig, result);
1023         }
1024     }
1025 
1026     static void verify(Object[] src, Object[] dst) {
1027         for (int i = 0; i < src.length; ++i) {
1028             if (src[i] != null) {
1029                 Asserts.assertEQ(((MyInterface)src[i]).hash(), ((MyInterface)dst[i]).hash());
1030             } else {
1031                 Asserts.assertEQ(dst[i], null);
1032             }
1033         }
1034     }
1035 
1036     static void verify(MyValue1?[] src, MyValue1?[] dst) {
1037         for (int i = 0; i < src.length; ++i) {
1038             if (src[i] != null) {
1039                 Asserts.assertEQ(src[i].hash(), dst[i].hash());
1040             } else {
1041                 Asserts.assertEQ(dst[i], null);
1042             }
1043         }
1044     }
1045 
1046     static void verify(MyValue1?[] src, Object[] dst) {
1047         for (int i = 0; i < src.length; ++i) {
1048             if (src[i] != null) {
1049                 Asserts.assertEQ(src[i].hash(), ((MyInterface)dst[i]).hash());
1050             } else {
1051                 Asserts.assertEQ(dst[i], null);
1052             }
1053         }
1054     }
1055 
1056     static void verify(MyValue2?[] src, MyValue2?[] dst) {
1057         for (int i = 0; i < src.length; ++i) {
1058             if (src[i] != null) {
1059                 Asserts.assertEQ(src[i].hash(), dst[i].hash());
1060             } else {
1061                 Asserts.assertEQ(dst[i], null);
1062             }
1063         }
1064     }
1065 
1066     static void verify(MyValue2?[] src, Object[] dst) {
1067         for (int i = 0; i < src.length; ++i) {
1068             if (src[i] != null) {
1069                 Asserts.assertEQ(src[i].hash(), ((MyInterface)dst[i]).hash());
1070             } else {
1071                 Asserts.assertEQ(dst[i], null);
1072             }
1073         }
1074     }
1075 
1076     static boolean compile_and_run_again_if_deoptimized(boolean warmup, String test) {
1077         if (!warmup) {
1078             Method m = tests.get(test);
1079             if (USE_COMPILER &&  !WHITE_BOX.isMethodCompiled(m, false)) {
1080                 if (!ValueTypeArrayFlatten && !XCOMP) {
1081                     throw new RuntimeException("Unexpected deoptimization");
1082                 }
1083                 enqueueMethodForCompilation(m, COMP_LEVEL_FULL_OPTIMIZATION);
1084                 return true;
1085             }
1086         }
1087         return false;
1088     }
1089 
1090     // arraycopy() of value type array of unknown size
1091     @Test
1092     public void test35(Object src, Object dst, int len) {
1093         System.arraycopy(src, 0, dst, 0, len);
1094     }
1095 
1096     @DontCompile
1097     public void test35_verifier(boolean warmup) {
1098         int len = Math.abs(rI) % 10;
1099         MyValue1?[] src = new MyValue1?[len];
1100         MyValue1?[] dst = new MyValue1?[len];
1101         for (int i = 1; i < len; ++i) {
1102             src[i] = testValue1;
1103         }
1104         test35(src, dst, src.length);
1105         verify(src, dst);
1106         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test35")) {
1107             test35(src, dst, src.length);
1108             verify(src, dst);
1109         }
1110     }
1111 
1112     @Test
1113     public void test36(Object src, MyValue2?[] dst) {
1114         System.arraycopy(src, 0, dst, 0, dst.length);
1115     }
1116 
1117     @DontCompile
1118     public void test36_verifier(boolean warmup) {
1119         int len = Math.abs(rI) % 10;
1120         MyValue2?[] src = new MyValue2?[len];
1121         MyValue2?[] dst = new MyValue2?[len];
1122         for (int i = 1; i < len; ++i) {
1123             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1124         }
1125         test36(src, dst);
1126         verify(src, dst);
1127         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test36")) {
1128             test36(src, dst);
1129             verify(src, dst);
1130         }
1131     }
1132 
1133     @Test
1134     public void test37(MyValue2?[] src, Object dst) {
1135         System.arraycopy(src, 0, dst, 0, src.length);
1136     }
1137 
1138     @DontCompile
1139     public void test37_verifier(boolean warmup) {
1140         int len = Math.abs(rI) % 10;
1141         MyValue2?[] src = new MyValue2?[len];
1142         MyValue2?[] dst = new MyValue2?[len];
1143         for (int i = 1; i < len; ++i) {
1144             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1145         }
1146         test37(src, dst);
1147         verify(src, dst);
1148         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test37")) {
1149             test37(src, dst);
1150             verify(src, dst);
1151         }
1152     }
1153 
1154     @Test
1155     @Warmup(1) // Avoid early compilation
1156     public void test38(Object src, MyValue2?[] dst) {
1157         System.arraycopy(src, 0, dst, 0, dst.length);
1158     }
1159 
1160     @DontCompile
1161     public void test38_verifier(boolean warmup) {
1162         int len = Math.abs(rI) % 10;
1163         Object[] src = new Object[len];
1164         MyValue2?[] dst = new MyValue2?[len];
1165         for (int i = 1; i < len; ++i) {
1166             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1167         }
1168         test38(src, dst);
1169         verify(dst, src);
1170         if (!warmup) {
1171             Method m = tests.get("TestNullableArrays::test38");
1172             assertDeoptimizedByC2(m);
1173             enqueueMethodForCompilation(m, COMP_LEVEL_FULL_OPTIMIZATION);
1174             test38(src, dst);
1175             verify(dst, src);
1176             if (USE_COMPILER && !WHITE_BOX.isMethodCompiled(m, false) && !XCOMP) {
1177                 throw new RuntimeException("unexpected deoptimization");
1178             }
1179         }
1180     }
1181 
1182     @Test
1183     public void test39(MyValue2?[] src, Object dst) {
1184         System.arraycopy(src, 0, dst, 0, src.length);
1185     }
1186 
1187     @DontCompile
1188     public void test39_verifier(boolean warmup) {
1189         int len = Math.abs(rI) % 10;
1190         MyValue2?[] src = new MyValue2?[len];
1191         Object[] dst = new Object[len];
1192         for (int i = 1; i < len; ++i) {
1193             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1194         }
1195         test39(src, dst);
1196         verify(src, dst);
1197         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test39")) {
1198             test39(src, dst);
1199             verify(src, dst);
1200         }
1201     }
1202 
1203     @Test
1204     @Warmup(1) // Avoid early compilation
1205     public void test40(Object[] src, Object dst) {
1206         System.arraycopy(src, 0, dst, 0, src.length);
1207     }
1208 
1209     @DontCompile
1210     public void test40_verifier(boolean warmup) {
1211         int len = Math.abs(rI) % 10;
1212         Object[] src = new Object[len];
1213         MyValue2?[] dst = new MyValue2?[len];
1214         for (int i = 1; i < len; ++i) {
1215             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1216         }
1217         test40(src, dst);
1218         verify(dst, src);
1219         if (!warmup) {
1220             Method m = tests.get("TestNullableArrays::test40");
1221             assertDeoptimizedByC2(m);
1222             enqueueMethodForCompilation(m, COMP_LEVEL_FULL_OPTIMIZATION);
1223             test40(src, dst);
1224             verify(dst, src);
1225             if (USE_COMPILER && !WHITE_BOX.isMethodCompiled(m, false) && !XCOMP) {
1226                 throw new RuntimeException("unexpected deoptimization");
1227             }
1228         }
1229     }
1230 
1231     @Test
1232     public void test41(Object src, Object[] dst) {
1233         System.arraycopy(src, 0, dst, 0, dst.length);
1234     }
1235 
1236     @DontCompile
1237     public void test41_verifier(boolean warmup) {
1238         int len = Math.abs(rI) % 10;
1239         MyValue2?[] src = new MyValue2?[len];
1240         Object[] dst = new Object[len];
1241         for (int i = 1; i < len; ++i) {
1242             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1243         }
1244         test41(src, dst);
1245         verify(src, dst);
1246         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test41")) {
1247             test41(src, dst);
1248             verify(src, dst);
1249         }
1250     }
1251 
1252     @Test
1253     public void test42(Object[] src, Object[] dst) {
1254         System.arraycopy(src, 0, dst, 0, src.length);
1255     }
1256 
1257     @DontCompile
1258     public void test42_verifier(boolean warmup) {
1259         int len = Math.abs(rI) % 10;
1260         Object[] src = new Object[len];
1261         Object[] dst = new Object[len];
1262         for (int i = 1; i < len; ++i) {
1263             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1264         }
1265         test42(src, dst);
1266         verify(src, dst);
1267         if (!warmup) {
1268             Method m = tests.get("TestNullableArrays::test42");
1269             if (USE_COMPILER && !WHITE_BOX.isMethodCompiled(m, false) && !XCOMP) {
1270                 throw new RuntimeException("unexpected deoptimization");
1271             }
1272         }
1273     }
1274 
1275     // short arraycopy()'s
1276     @Test
1277     public void test43(Object src, Object dst) {
1278         System.arraycopy(src, 0, dst, 0, 8);
1279     }
1280 
1281     @DontCompile
1282     public void test43_verifier(boolean warmup) {
1283         MyValue1?[] src = new MyValue1?[8];
1284         MyValue1?[] dst = new MyValue1?[8];
1285         for (int i = 1; i < 8; ++i) {
1286             src[i] = testValue1;
1287         }
1288         test43(src, dst);
1289         verify(src, dst);
1290         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test43")) {
1291             test43(src, dst);
1292             verify(src, dst);
1293         }
1294     }
1295 
1296     @Test
1297     public void test44(Object src, MyValue2?[] dst) {
1298         System.arraycopy(src, 0, dst, 0, 8);
1299     }
1300 
1301     @DontCompile
1302     public void test44_verifier(boolean warmup) {
1303         MyValue2?[] src = new MyValue2?[8];
1304         MyValue2?[] dst = new MyValue2?[8];
1305         for (int i = 1; i < 8; ++i) {
1306             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1307         }
1308         test44(src, dst);
1309         verify(src, dst);
1310         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test44")) {
1311             test44(src, dst);
1312             verify(src, dst);
1313         }
1314     }
1315 
1316     @Test
1317     public void test45(MyValue2?[] src, Object dst) {
1318         System.arraycopy(src, 0, dst, 0, 8);
1319     }
1320 
1321     @DontCompile
1322     public void test45_verifier(boolean warmup) {
1323         MyValue2?[] src = new MyValue2?[8];
1324         MyValue2?[] dst = new MyValue2?[8];
1325         for (int i = 1; i < 8; ++i) {
1326             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1327         }
1328         test45(src, dst);
1329         verify(src, dst);
1330         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test45")) {
1331             test45(src, dst);
1332             verify(src, dst);
1333         }
1334     }
1335 
1336     @Test
1337     @Warmup(1) // Avoid early compilation
1338     public void test46(Object[] src, MyValue2?[] dst) {
1339         System.arraycopy(src, 0, dst, 0, 8);
1340     }
1341 
1342     @DontCompile
1343     public void test46_verifier(boolean warmup) {
1344         Object[] src = new Object[8];
1345         MyValue2?[] dst = new MyValue2?[8];
1346         for (int i = 1; i < 8; ++i) {
1347             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1348         }
1349         test46(src, dst);
1350         verify(dst, src);
1351         if (!warmup) {
1352             Method m = tests.get("TestNullableArrays::test46");
1353             assertDeoptimizedByC2(m);
1354             enqueueMethodForCompilation(m, COMP_LEVEL_FULL_OPTIMIZATION);
1355             test46(src, dst);
1356             verify(dst, src);
1357             if (USE_COMPILER && !WHITE_BOX.isMethodCompiled(m, false) && !XCOMP) {
1358                 throw new RuntimeException("unexpected deoptimization");
1359             }
1360         }
1361     }
1362 
1363     @Test
1364     public void test47(MyValue2?[] src, Object[] dst) {
1365         System.arraycopy(src, 0, dst, 0, 8);
1366     }
1367 
1368     @DontCompile
1369     public void test47_verifier(boolean warmup) {
1370         MyValue2?[] src = new MyValue2?[8];
1371         Object[] dst = new Object[8];
1372         for (int i = 1; i < 8; ++i) {
1373             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1374         }
1375         test47(src, dst);
1376         verify(src, dst);
1377         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test47")) {
1378             test47(src, dst);
1379             verify(src, dst);
1380         }
1381     }
1382 
1383     @Test
1384     @Warmup(1) // Avoid early compilation
1385     public void test48(Object[] src, Object dst) {
1386         System.arraycopy(src, 0, dst, 0, 8);
1387     }
1388 
1389     @DontCompile
1390     public void test48_verifier(boolean warmup) {
1391         Object[] src = new Object[8];
1392         MyValue2?[] dst = new MyValue2?[8];
1393         for (int i = 1; i < 8; ++i) {
1394             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1395         }
1396         test48(src, dst);
1397         verify(dst, src);
1398         if (!warmup) {
1399             Method m = tests.get("TestNullableArrays::test48");
1400             assertDeoptimizedByC2(m);
1401             enqueueMethodForCompilation(m, COMP_LEVEL_FULL_OPTIMIZATION);
1402             test48(src, dst);
1403             verify(dst, src);
1404             if (USE_COMPILER && !WHITE_BOX.isMethodCompiled(m, false) && !XCOMP) {
1405                 throw new RuntimeException("unexpected deoptimization");
1406             }
1407         }
1408     }
1409 
1410     @Test
1411     public void test49(Object src, Object[] dst) {
1412         System.arraycopy(src, 0, dst, 0, 8);
1413     }
1414 
1415     @DontCompile
1416     public void test49_verifier(boolean warmup) {
1417         MyValue2?[] src = new MyValue2?[8];
1418         Object[] dst = new Object[8];
1419         for (int i = 1; i < 8; ++i) {
1420             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1421         }
1422         test49(src, dst);
1423         verify(src, dst);
1424         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test49")) {
1425             test49(src, dst);
1426             verify(src, dst);
1427         }
1428     }
1429 
1430     @Test
1431     public void test50(Object[] src, Object[] dst) {
1432         System.arraycopy(src, 0, dst, 0, 8);
1433     }
1434 
1435     @DontCompile
1436     public void test50_verifier(boolean warmup) {
1437         Object[] src = new Object[8];
1438         Object[] dst = new Object[8];
1439         for (int i = 1; i < 8; ++i) {
1440             src[i] = MyValue2.createWithFieldsInline(rI, (i % 2) == 0);
1441         }
1442         test50(src, dst);
1443         verify(src, dst);
1444         if (!warmup) {
1445             Method m = tests.get("TestNullableArrays::test50");
1446             if (USE_COMPILER && !WHITE_BOX.isMethodCompiled(m, false) && !XCOMP) {
1447                 throw new RuntimeException("unexpected deoptimization");
1448             }
1449         }
1450     }
1451 
1452     @Test
1453     public MyValue1?[] test51(MyValue1?[] va) {
1454         return Arrays.copyOf(va, va.length, MyValue1?[].class);
1455     }
1456 
1457     @DontCompile
1458     public void test51_verifier(boolean warmup) {
1459         int len = Math.abs(rI) % 10;
1460         MyValue1?[] va = new MyValue1?[len];
1461         for (int i = 1; i < len; ++i) {
1462             va[i] = testValue1;
1463         }
1464         MyValue1?[] result = test51(va);
1465         verify(va, result);
1466     }
1467 
1468     static final MyValue1?[] test52_va = new MyValue1?[8];
1469 
1470     @Test
1471     public MyValue1?[] test52() {
1472         return Arrays.copyOf(test52_va, 8, MyValue1?[].class);
1473     }
1474 
1475     @DontCompile
1476     public void test52_verifier(boolean warmup) {
1477         for (int i = 1; i < 8; ++i) {
1478             test52_va[i] = testValue1;
1479         }
1480         MyValue1?[] result = test52();
1481         verify(test52_va, result);
1482     }
1483 
1484     @Test
1485     public MyValue1?[] test53(Object[] va) {
1486         return Arrays.copyOf(va, va.length, MyValue1?[].class);
1487     }
1488 
1489     @DontCompile
1490     public void test53_verifier(boolean warmup) {
1491         int len = Math.abs(rI) % 10;
1492         MyValue1?[] va = new MyValue1?[len];
1493         for (int i = 1; i < len; ++i) {
1494             va[i] = testValue1;
1495         }
1496         MyValue1?[] result = test53(va);
1497         verify(result, va);
1498     }
1499 
1500     @Test
1501     public Object[] test54(MyValue1?[] va) {
1502         return Arrays.copyOf(va, va.length, Object[].class);
1503     }
1504 
1505     @DontCompile
1506     public void test54_verifier(boolean warmup) {
1507         int len = Math.abs(rI) % 10;
1508         MyValue1?[] va = new MyValue1?[len];
1509         for (int i = 1; i < len; ++i) {
1510             va[i] = testValue1;
1511         }
1512         Object[] result = test54(va);
1513         verify(va, result);
1514     }
1515 
1516     @Test
1517     public Object[] test55(Object[] va) {
1518         return Arrays.copyOf(va, va.length, Object[].class);
1519     }
1520 
1521     @DontCompile
1522     public void test55_verifier(boolean warmup) {
1523         int len = Math.abs(rI) % 10;
1524         MyValue1?[] va = new MyValue1?[len];
1525         for (int i = 1; i < len; ++i) {
1526             va[i] = testValue1;
1527         }
1528         Object[] result = test55(va);
1529         verify(va, result);
1530     }
1531 
1532     @Test
1533     public MyValue1?[] test56(Object[] va) {
1534         return Arrays.copyOf(va, va.length, MyValue1?[].class);
1535     }
1536 
1537     @DontCompile
1538     public void test56_verifier(boolean warmup) {
1539         int len = Math.abs(rI) % 10;
1540         Object[] va = new Object[len];
1541         for (int i = 1; i < len; ++i) {
1542             va[i] = testValue1;
1543         }
1544         MyValue1?[] result = test56(va);
1545         verify(result, va);
1546     }
1547 
1548    @Test
1549     public Object[] test57(Object[] va, Class klass) {
1550         return Arrays.copyOf(va, va.length, klass);
1551     }
1552 
1553     @DontCompile
1554     public void test57_verifier(boolean warmup) {
1555         int len = Math.abs(rI) % 10;
1556         Object[] va = new MyValue1?[len];
1557         for (int i = 1; i < len; ++i) {
1558             va[i] = testValue1;
1559         }
1560         Object[] result = test57(va, MyValue1?[].class);
1561         verify(va, result);
1562     }
1563 
1564     @Test
1565     public Object[] test58(MyValue1?[] va, Class klass) {
1566         return Arrays.copyOf(va, va.length, klass);
1567     }
1568 
1569     @DontCompile
1570     public void test58_verifier(boolean warmup) {
1571         int len = Math.abs(rI) % 10;
1572         MyValue1?[] va = new MyValue1?[len];
1573         for (int i = 1; i < len; ++i) {
1574             va[i] = testValue1;
1575         }
1576         for (int i = 1; i < 10; i++) {
1577             Object[] result = test58(va, MyValue1?[].class);
1578             verify(va, result);
1579         }
1580         if (compile_and_run_again_if_deoptimized(warmup, "TestNullableArrays::test58")) {
1581             Object[] result = test58(va, MyValue1?[].class);
1582             verify(va, result);
1583         }
1584     }
1585 
1586     @Test
1587     public Object[] test59(MyValue1?[] va) {
1588         return Arrays.copyOf(va, va.length+1, MyValue1?[].class);
1589     }
1590 
1591     @DontCompile
1592     public void test59_verifier(boolean warmup) {
1593         int len = Math.abs(rI) % 10;
1594         MyValue1?[] va = new MyValue1?[len];
1595         MyValue1?[] verif = new MyValue1?[len+1];
1596         for (int i = 1; i < len; ++i) {
1597             va[i] = testValue1;
1598             verif[i] = va[i];
1599         }
1600         Object[] result = test59(va);
1601         verify(verif, result);
1602     }
1603 
1604     @Test
1605     public Object[] test60(Object[] va, Class klass) {
1606         return Arrays.copyOf(va, va.length+1, klass);
1607     }
1608 
1609     @DontCompile
1610     public void test60_verifier(boolean warmup) {
1611         int len = Math.abs(rI) % 10;
1612         MyValue1?[] va = new MyValue1?[len];
1613         MyValue1?[] verif = new MyValue1?[len+1];
1614         for (int i = 1; i < len; ++i) {
1615             va[i] = testValue1;
1616             verif[i] = (MyValue1)va[i];
1617         }
1618         Object[] result = test60(va, MyValue1?[].class);
1619         verify(verif, result);
1620     }
1621 
1622     @Test
1623     public Object[] test61(Object[] va, Class klass) {
1624         return Arrays.copyOf(va, va.length+1, klass);
1625     }
1626 
1627     @DontCompile
1628     public void test61_verifier(boolean warmup) {
1629         int len = Math.abs(rI) % 10;
1630         Object[] va = new Integer[len];
1631         for (int i = 1; i < len; ++i) {
1632             va[i] = new Integer(rI);
1633         }
1634         Object[] result = test61(va, Integer[].class);
1635         for (int i = 0; i < va.length; ++i) {
1636             Asserts.assertEQ(va[i], result[i]);
1637         }
1638     }
1639 
1640     @ForceInline
1641     public Object[] test62_helper(int i, MyValue1?[] va, Integer[] oa) {
1642         Object[] arr = null;
1643         if (i == 10) {
1644             arr = oa;
1645         } else {
1646             arr = va;
1647         }
1648         return arr;
1649     }
1650 
1651     @Test
1652     public Object[] test62(MyValue1?[] va, Integer[] oa) {
1653         int i = 0;
1654         for (; i < 10; i++);
1655 
1656         Object[] arr = test62_helper(i, va, oa);
1657 
1658         return Arrays.copyOf(arr, arr.length+1, arr.getClass());
1659     }
1660 
1661     @DontCompile
1662     public void test62_verifier(boolean warmup) {
1663         int len = Math.abs(rI) % 10;
1664         MyValue1?[] va = new MyValue1?[len];
1665         Integer[] oa = new Integer[len];
1666         for (int i = 1; i < len; ++i) {
1667             oa[i] = new Integer(rI);
1668         }
1669         test62_helper(42, va, oa);
1670         Object[] result = test62(va, oa);
1671         for (int i = 0; i < va.length; ++i) {
1672             Asserts.assertEQ(oa[i], result[i]);
1673         }
1674     }
1675 
1676     @ForceInline
1677     public Object[] test63_helper(int i, MyValue1?[] va, Integer[] oa) {
1678         Object[] arr = null;
1679         if (i == 10) {
1680             arr = va;
1681         } else {
1682             arr = oa;
1683         }
1684         return arr;
1685     }
1686 
1687     @Test
1688     public Object[] test63(MyValue1?[] va, Integer[] oa) {
1689         int i = 0;
1690         for (; i < 10; i++);
1691 
1692         Object[] arr = test63_helper(i, va, oa);
1693 
1694         return Arrays.copyOf(arr, arr.length+1, arr.getClass());
1695     }
1696 
1697     @DontCompile
1698     public void test63_verifier(boolean warmup) {
1699         int len = Math.abs(rI) % 10;
1700         MyValue1?[] va = new MyValue1?[len];
1701         MyValue1?[] verif = new MyValue1?[len+1];
1702         for (int i = 1; i < len; ++i) {
1703             va[i] = testValue1;
1704             verif[i] = va[i];
1705         }
1706         Integer[] oa = new Integer[len];
1707         test63_helper(42, va, oa);
1708         Object[] result = test63(va, oa);
1709         verify(verif, result);
1710     }
1711 
1712     // Test default initialization of value type arrays: small array
1713     @Test
1714     public MyValue1?[] test64() {
1715         return new MyValue1?[8];
1716     }
1717 
1718     @DontCompile
1719     public void test64_verifier(boolean warmup) {
1720         MyValue1?[] va = test64();
1721         for (int i = 0; i < 8; ++i) {
1722             Asserts.assertEQ(va[i], null);
1723         }
1724     }
1725 
1726     // Test default initialization of value type arrays: large array
1727     @Test
1728     public MyValue1?[] test65() {
1729         return new MyValue1?[32];
1730     }
1731 
1732     @DontCompile
1733     public void test65_verifier(boolean warmup) {
1734         MyValue1?[] va = test65();
1735         for (int i = 0; i < 32; ++i) {
1736             Asserts.assertEQ(va[i], null);
1737         }
1738     }
1739 
1740     // Check init store elimination
1741     @Test
1742     public MyValue1?[] test66(MyValue1? vt) {
1743         MyValue1?[] va = new MyValue1?[1];
1744         va[0] = vt;
1745         return va;
1746     }
1747 
1748     @DontCompile
1749     public void test66_verifier(boolean warmup) {
1750         MyValue1? vt = MyValue1.createWithFieldsDontInline(rI, rL);
1751         MyValue1?[] va = test66(vt);
1752         Asserts.assertEQ(va[0].hashPrimitive(), vt.hashPrimitive());
1753     }
1754 
1755     // Zeroing elimination and arraycopy
1756     @Test
1757     public MyValue1?[] test67(MyValue1?[] src) {
1758         MyValue1?[] dst = new MyValue1?[16];
1759         System.arraycopy(src, 0, dst, 0, 13);
1760         return dst;
1761     }
1762 
1763     @DontCompile
1764     public void test67_verifier(boolean warmup) {
1765         MyValue1?[] va = new MyValue1?[16];
1766         MyValue1?[] var = test67(va);
1767         for (int i = 0; i < 16; ++i) {
1768             Asserts.assertEQ(var[i], null);
1769         }
1770     }
1771 
1772     // A store with a default value can be eliminated
1773     @Test
1774     public MyValue1?[] test68() {
1775         MyValue1?[] va = new MyValue1?[2];
1776         va[0] = va[1];
1777         return va;
1778     }
1779 
1780     @DontCompile
1781     public void test68_verifier(boolean warmup) {
1782         MyValue1?[] va = test68();
1783         for (int i = 0; i < 2; ++i) {
1784             Asserts.assertEQ(va[i], null);
1785         }
1786     }
1787 
1788     // Requires individual stores to init array
1789     @Test
1790     public MyValue1?[] test69(MyValue1? vt) {
1791         MyValue1?[] va = new MyValue1?[4];
1792         va[0] = vt;
1793         va[3] = vt;
1794         return va;
1795     }
1796 
1797     @DontCompile
1798     public void test69_verifier(boolean warmup) {
1799         MyValue1? vt = MyValue1.createWithFieldsDontInline(rI, rL);
1800         MyValue1?[] va = new MyValue1?[4];
1801         va[0] = vt;
1802         va[3] = vt;
1803         MyValue1?[] var = test69(vt);
1804         for (int i = 0; i < va.length; ++i) {
1805             Asserts.assertEQ(va[i], var[i]);
1806         }
1807     }
1808 
1809     // A store with a default value can be eliminated: same as test68
1810     // but store is farther away from allocation
1811     @Test
1812     public MyValue1?[] test70(MyValue1?[] other) {
1813         other[1] = other[0];
1814         MyValue1?[] va = new MyValue1?[2];
1815         other[0] = va[1];
1816         va[0] = va[1];
1817         return va;
1818     }
1819 
1820     @DontCompile
1821     public void test70_verifier(boolean warmup) {
1822         MyValue1?[] va = new MyValue1?[2];
1823         MyValue1?[] var = test70(va);
1824         for (int i = 0; i < 2; ++i) {
1825             Asserts.assertEQ(va[i], var[i]);
1826         }
1827     }
1828 
1829     // EA needs to consider oop fields in flattened arrays
1830     @Test
1831     public void test71() {
1832         int len = 10;
1833         MyValue2?[] src = new MyValue2?[len];
1834         MyValue2?[] dst = new MyValue2?[len];
1835         for (int i = 1; i < len; ++i) {
1836             src[i] = MyValue2.createWithFieldsDontInline(rI, (i % 2) == 0);
1837         }
1838         System.arraycopy(src, 0, dst, 0, src.length);
1839         for (int i = 0; i < len; ++i) {
1840             if (src[i] == null) {
1841                 Asserts.assertEQ(dst[i], null);
1842             } else {
1843                 Asserts.assertEQ(src[i].hash(), dst[i].hash());
1844             }
1845         }
1846     }
1847 
1848     @DontCompile
1849     public void test71_verifier(boolean warmup) {
1850         test71();
1851     }
1852 
1853     // Test EA with leaf call to 'store_unknown_value'
1854     @Test
1855     public void test72(Object[] o, boolean b, Object element) {
1856         Object[] arr1 = new Object[10];
1857         Object[] arr2 = new Object[10];
1858         if (b) {
1859             arr1 = o;
1860         }
1861         arr1[0] = element;
1862         arr2[0] = element;
1863     }
1864 
1865     @DontCompile
1866     public void test72_verifier(boolean warmup) {
1867         Object[] arr = new Object[1];
1868         Object elem = new Object();
1869         test72(arr, true, elem);
1870         test72(arr, false, elem);
1871     }
1872 
1873     @Test
1874     public void test73(Object[] oa, MyValue1? v, Object o) {
1875         // TestLWorld.test38 use a C1 Phi node for the array. This test
1876         // adds the case where the stored value is a C1 Phi node.
1877         Object o2 = (o == null) ? v : o;
1878         oa[0] = v;  // The stored value is known to be flattenable
1879         oa[1] = o;  // The stored value may be flattenable
1880         oa[2] = o2; // The stored value may be flattenable (a C1 Phi node)
1881         oa[0] = oa; // The stored value is known to be not flattenable (an Object[])
1882     }
1883 
1884     @DontCompile
1885     public void test73_verifier(boolean warmup) {
1886         MyValue1? v0 = MyValue1.createWithFieldsDontInline(rI, rL);
1887         MyValue1? v1 = MyValue1.createWithFieldsDontInline(rI+1, rL+1);
1888         MyValue1?[] arr = new MyValue1?[3];
1889         try {
1890             test73(arr, v0, v1);
1891             throw new RuntimeException("ArrayStoreException expected");
1892         } catch (ArrayStoreException t) {
1893             // expected
1894         }
1895         Asserts.assertEQ(arr[0].hash(), v0.hash());
1896         Asserts.assertEQ(arr[1].hash(), v1.hash());
1897         Asserts.assertEQ(arr[2].hash(), v1.hash());
1898     }
1899 
1900     // Some more array clone tests
1901     @ForceInline
1902     public Object[] test74_helper(int i, MyValue1?[] va, Integer[] oa) {
1903         Object[] arr = null;
1904         if (i == 10) {
1905             arr = oa;
1906         } else {
1907             arr = va;
1908         }
1909         return arr;
1910     }
1911 
1912     @Test
1913     public Object[] test74(MyValue1?[] va, Integer[] oa) {
1914         int i = 0;
1915         for (; i < 10; i++);
1916 
1917         Object[] arr = test74_helper(i, va, oa);
1918         return arr.clone();
1919     }
1920 
1921     @DontCompile
1922     public void test74_verifier(boolean warmup) {
1923         int len = Math.abs(rI) % 10;
1924         MyValue1?[] va = new MyValue1?[len];
1925         Integer[] oa = new Integer[len];
1926         for (int i = 1; i < len; ++i) {
1927             oa[i] = new Integer(rI);
1928         }
1929         test74_helper(42, va, oa);
1930         Object[] result = test74(va, oa);
1931 
1932         for (int i = 0; i < va.length; ++i) {
1933             Asserts.assertEQ(oa[i], result[i]);
1934             // Check that array has correct storage properties (null-ok)
1935             result[i] = null;
1936         }
1937     }
1938 
1939     @ForceInline
1940     public Object[] test75_helper(int i, MyValue1?[] va, Integer[] oa) {
1941         Object[] arr = null;
1942         if (i == 10) {
1943             arr = va;
1944         } else {
1945             arr = oa;
1946         }
1947         return arr;
1948     }
1949 
1950     @Test
1951     public Object[] test75(MyValue1?[] va, Integer[] oa) {
1952         int i = 0;
1953         for (; i < 10; i++);
1954 
1955         Object[] arr = test75_helper(i, va, oa);
1956         return arr.clone();
1957     }
1958 
1959     @DontCompile
1960     public void test75_verifier(boolean warmup) {
1961         int len = Math.abs(rI) % 10;
1962         MyValue1?[] va = new MyValue1?[len];
1963         MyValue1?[] verif = new MyValue1?[len];
1964         for (int i = 1; i < len; ++i) {
1965             va[i] = testValue1;
1966             verif[i] = va[i];
1967         }
1968         Integer[] oa = new Integer[len];
1969         test75_helper(42, va, oa);
1970         Object[] result = test75(va, oa);
1971         verify(verif, result);
1972         if (len > 0) {
1973             // Check that array has correct storage properties (null-ok)
1974             result[0] = null;
1975         }
1976     }
1977 
1978     // Test mixing nullable and non-nullable arrays
1979     @Test
1980     public Object[] test76(MyValue1[] vva, MyValue1?[] vba, MyValue1 vt, Object[] out, int n) {
1981         Object[] result = null;
1982         if (n == 0) {
1983             result = vva;
1984         } else if (n == 1) {
1985             result = vba;
1986         } else if (n == 2) {
1987             result = new MyValue1[42];
1988         } else if (n == 3) {
1989             result = new MyValue1?[42];
1990         }
1991         result[0] = vt;
1992         out[0] = result[1];
1993         return result;
1994     }
1995 
1996     @DontCompile
1997     public void test76_verifier(boolean warmup) {
1998         MyValue1 vt = testValue1;
1999         Object[] out = new Object[1];
2000         MyValue1[] vva = new MyValue1[42];
2001         MyValue1[] vva_r = new MyValue1[42];
2002         vva_r[0] = vt;
2003         MyValue1?[] vba = new MyValue1?[42];
2004         MyValue1?[] vba_r = new MyValue1?[42];
2005         vba_r[0] = vt;
2006         Object[] result = test76(vva, vba, vt, out, 0);
2007         verify(result, vva_r);
2008         Asserts.assertEQ(out[0], vva_r[1]);
2009         result = test76(vva, vba, vt, out, 1);
2010         verify(result, vba_r);
2011         Asserts.assertEQ(out[0], vba_r[1]);
2012         result = test76(vva, vba, vt, out, 2);
2013         verify(result, vva_r);
2014         Asserts.assertEQ(out[0], vva_r[1]);
2015         result = test76(vva, vba, vt, out, 3);
2016         verify(result, vba_r);
2017         Asserts.assertEQ(out[0], vba_r[1]);
2018     }
2019 
2020     @Test
2021     public Object[] test77(boolean b) {
2022         Object[] va;
2023         if (b) {
2024             va = new MyValue1?[5];
2025             for (int i = 0; i < 5; ++i) {
2026                 va[i] = testValue1;
2027             }
2028         } else {
2029             va = new MyValue1[10];
2030             for (int i = 0; i < 10; ++i) {
2031                 va[i] = MyValue1.createWithFieldsInline(rI + i, rL + i);
2032             }
2033         }
2034         long sum = ((MyValue1)va[0]).hashInterpreted();
2035         if (b) {
2036             va[0] = MyValue1.createWithFieldsDontInline(rI, sum);
2037         } else {
2038             va[0] = MyValue1.createWithFieldsDontInline(rI + 1, sum + 1);
2039         }
2040         return va;
2041     }
2042 
2043     @DontCompile
2044     public void test77_verifier(boolean warmup) {
2045         Object[] va = test77(true);
2046         Asserts.assertEQ(va.length, 5);
2047         Asserts.assertEQ(((MyValue1)va[0]).hash(), hash(rI, hash()));
2048         for (int i = 1; i < 5; ++i) {
2049             Asserts.assertEQ(((MyValue1)va[i]).hash(), hash());
2050         }
2051         va = test77(false);
2052         Asserts.assertEQ(va.length, 10);
2053         Asserts.assertEQ(((MyValue1)va[0]).hash(), hash(rI + 1, hash(rI, rL) + 1));
2054         for (int i = 1; i < 10; ++i) {
2055             Asserts.assertEQ(((MyValue1)va[i]).hash(), hash(rI + i, rL + i));
2056         }
2057     }
2058 
2059     // Same as test76 but with non value type array cases
2060     @Test
2061     public Object[] test78(MyValue1[] vva, MyValue1?[] vba, Object val, Object[] out, int n) {
2062         Object[] result = null;
2063         if (n == 0) {
2064             result = vva;
2065         } else if (n == 1) {
2066             result = vba;
2067         } else if (n == 2) {
2068             result = new MyValue1[42];
2069         } else if (n == 3) {
2070             result = new MyValue1?[42];
2071         } else  if (n == 4) {
2072             result = new Integer[42];
2073         }
2074         result[0] = val;
2075         out[0] = result[1];
2076         return result;
2077     }
2078 
2079     @DontCompile
2080     public void test78_verifier(boolean warmup) {
2081         MyValue1 vt = testValue1;
2082         Integer i = new Integer(42);
2083         Object[] out = new Object[1];
2084         MyValue1[] vva = new MyValue1[42];
2085         MyValue1[] vva_r = new MyValue1[42];
2086         vva_r[0] = vt;
2087         MyValue1?[] vba = new MyValue1?[42];
2088         MyValue1?[] vba_r = new MyValue1?[42];
2089         vba_r[0] = vt;
2090         Object[] result = test78(vva, vba, vt, out, 0);
2091         verify(result, vva_r);
2092         Asserts.assertEQ(out[0], vva_r[1]);
2093         result = test78(vva, vba, vt, out, 1);
2094         verify(result, vba_r);
2095         Asserts.assertEQ(out[0], vba_r[1]);
2096         result = test78(vva, vba, vt, out, 2);
2097         verify(result, vva_r);
2098         Asserts.assertEQ(out[0], vva_r[1]);
2099         result = test78(vva, vba, vt, out, 3);
2100         verify(result, vba_r);
2101         Asserts.assertEQ(out[0], vba_r[1]);
2102         result = test78(vva, vba, i, out, 4);
2103         Asserts.assertEQ(result[0], i);
2104         Asserts.assertEQ(out[0], null);
2105     }
2106 
2107     // Test widening conversions from [Q to [L
2108     @Test(failOn = ALLOC + ALLOCA + LOOP + LOAD + STORE + TRAP)
2109     public static MyValue1?[] test79(MyValue1[] va) {
2110         return va;
2111     }
2112 
2113     @DontCompile
2114     public void test79_verifier(boolean warmup) {
2115         MyValue1[] va = new MyValue1[1];
2116         va[0] = testValue1;
2117         MyValue1?[] res = test79(va);
2118         Asserts.assertEquals(res[0].hash(), testValue1.hash());
2119         try {
2120             res[0] = null;
2121             throw new RuntimeException("NullPointerException expected");
2122         } catch (NullPointerException npe) {
2123             // Expected
2124         }
2125         res[0] = testValue1;
2126         test79(null); // Should not throw NPE
2127     }
2128 
2129     // Same as test79 but with explicit cast and Object return
2130     @Test(failOn = ALLOC + ALLOCA + LOOP + LOAD + STORE + TRAP)
2131     public static Object[] test80(MyValue1[] va) {
2132         return (MyValue1?[])va;
2133     }
2134 
2135     @DontCompile
2136     public void test80_verifier(boolean warmup) {
2137         MyValue1[] va = new MyValue1[1];
2138         va[0] = testValue1;
2139         Object[] res = test80(va);
2140         Asserts.assertEquals(((MyValue1)res[0]).hash(), testValue1.hash());
2141         try {
2142             res[0] = null;
2143             throw new RuntimeException("NullPointerException expected");
2144         } catch (NullPointerException npe) {
2145             // Expected
2146         }
2147         res[0] = testValue1;
2148         test80(null); // Should not throw NPE
2149     }
2150 
2151     // Test mixing widened and boxed array type
2152     @Test()
2153     public static long test81(MyValue1[] va1, MyValue1?[] va2, MyValue1 vt, boolean b, boolean shouldThrow) {
2154         MyValue1?[] result = b ? va1 : va2;
2155         try {
2156             result[0] = vt;
2157         } catch (NullPointerException npe) {
2158             // Ignored
2159         }
2160         return result[1].hash();
2161     }
2162 
2163     @DontCompile
2164     public void test81_verifier(boolean warmup) {
2165         MyValue1[] va = new MyValue1[2];
2166         MyValue1?[] vaB = new MyValue1?[2];
2167         va[1] = testValue1;
2168         vaB[1] = testValue1;
2169         long res = test81(va, vaB, testValue1, true, true);
2170         Asserts.assertEquals(va[0].hash(), testValue1.hash());
2171         Asserts.assertEquals(res, testValue1.hash());
2172         res = test81(va, vaB, testValue1, false, false);
2173         Asserts.assertEquals(vaB[0].hash(), testValue1.hash());
2174         Asserts.assertEquals(res, testValue1.hash());
2175         res = test81(va, va, testValue1, false, true);
2176         Asserts.assertEquals(va[0].hash(), testValue1.hash());
2177         Asserts.assertEquals(res, testValue1.hash());
2178     }
2179 
2180     // Same as test81 but more cases and null writes
2181     @Test()
2182     public static long test82(MyValue1[] va1, MyValue1?[] va2, MyValue1 vt1, MyValue1? vt2, int i, boolean shouldThrow) {
2183         MyValue1?[] result = null;
2184         if (i == 0) {
2185             result = va1;
2186         } else if (i == 1) {
2187             result = va2;
2188         } else if (i == 2) {
2189             result = new MyValue1?[2];
2190             result[1] = vt1;
2191         } else if (i == 3) {
2192             result = new MyValue1[2];
2193             result[1] = vt1;
2194         }
2195         try {
2196             result[0] = (i <= 1) ? null : vt2;
2197             if (shouldThrow) {
2198                 throw new RuntimeException("NullPointerException expected");
2199             }
2200         } catch (NullPointerException npe) {
2201             Asserts.assertTrue(shouldThrow, "NullPointerException thrown");
2202         }
2203         result[0] = vt1;
2204         return result[1].hash();
2205     }
2206 
2207     @DontCompile
2208     public void test82_verifier(boolean warmup) {
2209         MyValue1[] va = new MyValue1[2];
2210         MyValue1?[] vaB = new MyValue1?[2];
2211         va[1] = testValue1;
2212         vaB[1] = testValue1;
2213         long res = test82(va, vaB, testValue1, testValue1, 0, true);
2214         Asserts.assertEquals(va[0].hash(), testValue1.hash());
2215         Asserts.assertEquals(res, testValue1.hash());
2216         res = test82(va, vaB, testValue1, testValue1, 1, false);
2217         Asserts.assertEquals(vaB[0].hash(), testValue1.hash());
2218         Asserts.assertEquals(res, testValue1.hash());
2219         res = test82(va, va, testValue1, testValue1, 1, true);
2220         Asserts.assertEquals(va[0].hash(), testValue1.hash());
2221         Asserts.assertEquals(res, testValue1.hash());
2222         res = test82(va, va, testValue1, null, 2, false);
2223         Asserts.assertEquals(va[0].hash(), testValue1.hash());
2224         Asserts.assertEquals(res, testValue1.hash());
2225         res = test82(va, va, testValue1, null, 3, true);
2226         Asserts.assertEquals(va[0].hash(), testValue1.hash());
2227         Asserts.assertEquals(res, testValue1.hash());
2228     }
2229 
2230     @Test(failOn = ALLOC + ALLOCA + STORE)
2231     public static long test83(MyValue1[] va) {
2232         MyValue1?[] result = va;
2233         return result[0].hash();
2234     }
2235 
2236     @DontCompile
2237     public void test83_verifier(boolean warmup) {
2238         MyValue1[] va = new MyValue1[42];
2239         va[0] = testValue1;
2240         long res = test83(va);
2241         Asserts.assertEquals(res, testValue1.hash());
2242     }
2243 
2244     @Test(valid = ValueTypeArrayFlattenOn, failOn = ALLOC + ALLOCA + LOOP + STORE + TRAP)
2245     @Test(valid = ValueTypeArrayFlattenOff)
2246     public static MyValue1?[] test84(MyValue1 vt1, MyValue1? vt2) {
2247         MyValue1?[] result = new MyValue1[2];
2248         result[0] = vt1;
2249         result[1] = vt2;
2250         return result;
2251     }
2252 
2253     @DontCompile
2254     public void test84_verifier(boolean warmup) {
2255         MyValue1?[] res = test84(testValue1, testValue1);
2256         Asserts.assertEquals(res[0].hash(), testValue1.hash());
2257         Asserts.assertEquals(res[1].hash(), testValue1.hash());
2258         try {
2259             test84(testValue1, null);
2260             throw new RuntimeException("NullPointerException expected");
2261         } catch (NullPointerException npe) {
2262             // Expected
2263         }
2264     }
2265 
2266     @Test()
2267     public static long test85(MyValue1?[] va, MyValue1 val) {
2268         va[0] = val;
2269         return va[1].hash();
2270     }
2271 
2272     @DontCompile
2273     public void test85_verifier(boolean warmup) {
2274         MyValue1[] va = new MyValue1[2];
2275         MyValue1?[] vab = new MyValue1?[2];
2276         va[1] = testValue1;
2277         vab[1] = testValue1;
2278         long res = test85(va, testValue1);
2279         Asserts.assertEquals(res, testValue1.hash());
2280         Asserts.assertEquals(va[0].hash(), testValue1.hash());
2281         res = test85(vab, testValue1);
2282         Asserts.assertEquals(res, testValue1.hash());
2283         Asserts.assertEquals(vab[0].hash(), testValue1.hash());
2284     }
2285 
2286     // Same as test85 but with box value
2287     @Test()
2288     public static long test86(MyValue1?[] va, MyValue1? val) {
2289         va[0] = val;
2290         return va[1].hash();
2291     }
2292 
2293     @DontCompile
2294     public void test86_verifier(boolean warmup) {
2295         MyValue1[] va = new MyValue1[2];
2296         MyValue1?[] vab = new MyValue1?[2];
2297         va[1] = testValue1;
2298         vab[1] = testValue1;
2299         long res = test86(va, testValue1);
2300         Asserts.assertEquals(res, testValue1.hash());
2301         Asserts.assertEquals(va[0].hash(), testValue1.hash());
2302         try {
2303             test86(va, null);
2304             throw new RuntimeException("NullPointerException expected");
2305         } catch (NullPointerException npe) {
2306             // Expected
2307         }
2308         res = test86(vab, testValue1);
2309         Asserts.assertEquals(res, testValue1.hash());
2310         Asserts.assertEquals(vab[0].hash(), testValue1.hash());
2311         res = test86(vab, null);
2312         Asserts.assertEquals(res, testValue1.hash());
2313         Asserts.assertEquals(vab[0], null);
2314     }
2315 
2316     // Test initialization of nullable array with constant
2317     @Test()
2318     public long test87() {
2319         MyValue1?[] va = new MyValue1?[1];
2320         va[0] = testValue1;
2321         return va[0].hash();
2322     }
2323 
2324     @DontCompile
2325     public void test87_verifier(boolean warmup) {
2326         long result = test87();
2327         Asserts.assertEQ(result, hash());
2328     }
2329 
2330     // Test narrowing conversion from [L to [Q
2331     @Test(failOn = ALLOC + ALLOCA + LOOP + LOAD + STORE + TRAP)
2332     public static MyValue1[] test88(MyValue1?[] va) {
2333         return (MyValue1[])va;
2334     }
2335 
2336     @DontCompile
2337     public void test88_verifier(boolean warmup) {
2338         MyValue1[] va = new MyValue1[1];
2339         va[0] = testValue1;
2340         MyValue1[] res = test88(va);
2341         Asserts.assertEquals(res[0].hash(), testValue1.hash());
2342         res[0] = testValue1;
2343         test88(null); // Should not throw NPE
2344         try {
2345             test88(new MyValue1?[1]);
2346             throw new RuntimeException("ClassCastException expected");
2347         } catch (ClassCastException cce) {
2348             // Expected
2349         }
2350     }
2351 
2352     // Same as test88 but with explicit cast and Object argument
2353     @Test(failOn = ALLOC + ALLOCA + LOOP + LOAD + STORE + TRAP)
2354     public static MyValue1[] test89(Object[] va) {
2355         return (MyValue1[])va;
2356     }
2357 
2358     @DontCompile
2359     public void test89_verifier(boolean warmup) {
2360         MyValue1[] va = new MyValue1[1];
2361         va[0] = testValue1;
2362         MyValue1[] res = test89(va);
2363         Asserts.assertEquals(((MyValue1)res[0]).hash(), testValue1.hash());
2364         res[0] = testValue1;
2365         test89(null); // Should not throw NPE
2366         try {
2367             test89(new MyValue1?[1]);
2368             throw new RuntimeException("ClassCastException expected");
2369         } catch (ClassCastException cce) {
2370             // Expected
2371         }
2372     }
2373 
2374     // More cast tests
2375     @Test()
2376     public static MyValue1?[] test90(Object va) {
2377         return (MyValue1?[])va;
2378     }
2379 
2380     @DontCompile
2381     public void test90_verifier(boolean warmup) {
2382         MyValue1[] va = new MyValue1[1];
2383         MyValue1?[] vab = new MyValue1?[1];
2384         try {
2385           // Trigger some ClassCastExceptions so C2 does not add an uncommon trap
2386           test90(new Integer[0]);
2387         } catch (ClassCastException cce) {
2388           // Expected
2389         }
2390         test90(va);
2391         test90(vab);
2392         test90(null);
2393     }
2394 
2395     @Test()
2396     public static MyValue1?[] test91(Object[] va) {
2397         return (MyValue1?[])va;
2398     }
2399 
2400     @DontCompile
2401     public void test91_verifier(boolean warmup) {
2402         MyValue1[] va = new MyValue1[1];
2403         MyValue1?[] vab = new MyValue1?[1];
2404         try {
2405           // Trigger some ClassCastExceptions so C2 does not add an uncommon trap
2406           test91(new Integer[0]);
2407         } catch (ClassCastException cce) {
2408           // Expected
2409         }
2410         test91(va);
2411         test91(vab);
2412         test91(null);
2413     }
2414 
2415     // Test if arraycopy intrinsic correctly checks for flattened source array
2416     @Test()
2417     public static void test92(MyValue1?[] src, MyValue1?[] dst) {
2418         System.arraycopy(src, 0, dst, 0, 2);
2419     }
2420 
2421     @DontCompile
2422     public void test92_verifier(boolean warmup) {
2423         MyValue1[]  va = new MyValue1[2];
2424         MyValue1?[] vab = new MyValue1?[2];
2425         va[0] = testValue1;
2426         vab[0] = testValue1;
2427         test92(va, vab);
2428         Asserts.assertEquals(va[0], vab[0]);
2429         Asserts.assertEquals(va[1], vab[1]);
2430     }
2431 
2432     @Test()
2433     public static void test93(Object src, MyValue1?[] dst) {
2434         System.arraycopy(src, 0, dst, 0, 2);
2435     }
2436 
2437     @DontCompile
2438     public void test93_verifier(boolean warmup) {
2439         MyValue1[]  va = new MyValue1[2];
2440         MyValue1?[] vab = new MyValue1?[2];
2441         va[0] = testValue1;
2442         vab[0] = testValue1;
2443         test93(va, vab);
2444         Asserts.assertEquals(va[0], vab[0]);
2445         Asserts.assertEquals(va[1], vab[1]);
2446     }
2447 
2448     // Test non-escaping allocation with arraycopy
2449     // that does not modify loaded array element.
2450     @Test()
2451     public static long test94() {
2452         MyValue1?[] src = new MyValue1?[8];
2453         MyValue1[]  dst = new MyValue1[8];
2454         for (int i = 1; i < 8; ++i) {
2455             src[i] = testValue1;
2456         }
2457         System.arraycopy(src, 1, dst, 2, 6);
2458         return dst[0].hash();
2459     }
2460 
2461     @DontCompile
2462     public static void test94_verifier(boolean warmup) {
2463         long result = test94();
2464         Asserts.assertEquals(result, MyValue1.default.hash());
2465     }
2466 
2467     // Test meeting constant TypeInstPtr with ValueTypeNode
2468     @ForceInline
2469     public long test95_callee() {
2470         MyValue1?[] va = new MyValue1?[1];
2471         va[0] = testValue1;
2472         return va[0].hashInterpreted();
2473     }
2474 
2475     @Test()
2476     @Warmup(0)
2477     public long test95() {
2478         return test95_callee();
2479     }
2480 
2481     @DontCompile
2482     public void test95_verifier(boolean warmup) {
2483         long result = test95();
2484         Asserts.assertEQ(result, hash());
2485     }
2486 
2487     // Matrix multiplication test to exercise type flow analysis with nullable value arrays
2488     inline static class Complex {
2489         private final double re;
2490         private final double im;
2491 
2492         Complex(double re, double im) {
2493             this.re = re;
2494             this.im = im;
2495         }
2496 
2497         public Complex add(Complex that) {
2498             return new Complex(this.re + that.re, this.im + that.im);
2499         }
2500 
2501         public Complex mul(Complex that) {
2502             return new Complex(this.re * that.re - this.im * that.im,
2503                                this.re * that.im + this.im * that.re);
2504         }
2505     }
2506 
2507     @Test()
2508     public Complex?[][] test96(Complex?[][] A, Complex?[][] B) {
2509         int size = A.length;
2510         Complex?[][] R = new Complex?[size][size];
2511         for (int i = 0; i < size; i++) {
2512             for (int k = 0; k < size; k++) {
2513                 Complex? aik = A[i][k];
2514                 for (int j = 0; j < size; j++) {
2515                     R[i][j] = B[i][j].add(aik.mul((Complex)B[k][j]));
2516                 }
2517             }
2518         }
2519         return R;
2520     }
2521 
2522     static Complex?[][] test96_A = new Complex?[10][10];
2523     static Complex?[][] test96_B = new Complex?[10][10];
2524     static Complex?[][] test96_R;
2525 
2526     static {
2527         for (int i = 0; i < 10; i++) {
2528             for (int j = 0; j < 10; j++) {
2529                 test96_A[i][j] = new Complex(rI, rI);
2530                 test96_B[i][j] = new Complex(rI, rI);
2531             }
2532         }
2533     }
2534 
2535     @DontCompile
2536     public void test96_verifier(boolean warmup) {
2537         Complex?[][] result = test96(test96_A, test96_B);
2538         if (test96_R == null) {
2539             test96_R = result;
2540         }
2541         for (int i = 0; i < 10; i++) {
2542             for (int j = 0; j < 10; j++) {
2543                 Asserts.assertEQ(result[i][j], test96_R[i][j]);
2544             }
2545         }
2546     }
2547 
2548     // Test loads from vararg arrays
2549     @Test(failOn = LOAD_UNKNOWN_VALUE)
2550     public static Object test97(Object... args) {
2551         return args[0];
2552     }
2553 
2554     @DontCompile
2555     public static void test97_verifier(boolean warmup) {
2556         Object obj = new Object();
2557         Object result = test97(obj);
2558         Asserts.assertEquals(result, obj);
2559         Integer[] myInt = new Integer[1];
2560         myInt[0] = rI;
2561         result = test97((Object[])myInt);
2562         Asserts.assertEquals(result, rI);
2563     }
2564 
2565     @Test()
2566     public static Object test98(Object... args) {
2567         return args[0];
2568     }
2569 
2570     @DontCompile
2571     public static void test98_verifier(boolean warmup) {
2572         Object obj = new Object();
2573         Object result = test98(obj);
2574         Asserts.assertEquals(result, obj);
2575         Integer[] myInt = new Integer[1];
2576         myInt[0] = rI;
2577         result = test98((Object[])myInt);
2578         Asserts.assertEquals(result, rI);
2579         if (!warmup) {
2580             MyValue1[] va = new MyValue1[1];
2581             MyValue1?[] vab = new MyValue1?[1];
2582             result = test98((Object[])va);
2583             Asserts.assertEquals(((MyValue1)result).hash(), MyValue1.default.hash());
2584             result = test98((Object[])vab);
2585             Asserts.assertEquals(result, null);
2586         }
2587     }
2588 
2589     @Test()
2590     public static Object test99(Object... args) {
2591         return args[0];
2592     }
2593 
2594     @DontCompile
2595     public static void test99_verifier(boolean warmup) {
2596         Object obj = new Object();
2597         Object result = test99(obj);
2598         Asserts.assertEquals(result, obj);
2599         Integer[] myInt = new Integer[1];
2600         myInt[0] = rI;
2601         result = test99((Object[])myInt);
2602         Asserts.assertEquals(result, rI);
2603         if (!warmup) {
2604             try {
2605                 test99((Object[])null);
2606                 throw new RuntimeException("No NPE thrown");
2607             } catch (NullPointerException npe) {
2608                 // Expected
2609             }
2610         }
2611     }
2612 
2613     @Test()
2614     public static Object test100(Object... args) {
2615         return args[0];
2616     }
2617 
2618     @DontCompile
2619     public static void test100_verifier(boolean warmup) {
2620         Object obj = new Object();
2621         Object result = test100(obj);
2622         Asserts.assertEquals(result, obj);
2623         Integer[] myInt = new Integer[1];
2624         myInt[0] = rI;
2625         result = test100((Object[])myInt);
2626         Asserts.assertEquals(result, rI);
2627         if (!warmup) {
2628             try {
2629                 test100();
2630                 throw new RuntimeException("No AIOOBE thrown");
2631             } catch (ArrayIndexOutOfBoundsException aioobe) {
2632                 // Expected
2633             }
2634         }
2635     }
2636 
2637     // Test stores to varag arrays
2638     @Test(failOn = STORE_UNKNOWN_VALUE)
2639     public static void test101(Object val, Object... args) {
2640         args[0] = val;
2641     }
2642 
2643     @DontCompile
2644     public static void test101_verifier(boolean warmup) {
2645         Object obj = new Object();
2646         test101(obj, obj);
2647         Integer[] myInt = new Integer[1];
2648         test101(rI, (Object[])myInt);
2649         Asserts.assertEquals(myInt[0], rI);
2650         test101(null, (Object[])myInt);
2651         Asserts.assertEquals(myInt[0], null);
2652     }
2653 
2654     @Test()
2655     public static void test102(Object val, Object... args) {
2656         args[0] = val;
2657     }
2658 
2659     @DontCompile
2660     public static void test102_verifier(boolean warmup) {
2661         Object obj = new Object();
2662         test102(obj, obj);
2663         Integer[] myInt = new Integer[1];
2664         test102(rI, (Object[])myInt);
2665         Asserts.assertEquals(myInt[0], rI);
2666         test102(null, (Object[])myInt);
2667         Asserts.assertEquals(myInt[0], null);
2668         if (!warmup) {
2669             MyValue1[] va = new MyValue1[1];
2670             MyValue1?[] vab = new MyValue1?[1];
2671             test102(testValue1, (Object[])va);
2672             Asserts.assertEquals(va[0].hash(), testValue1.hash());
2673             test102(testValue1, (Object[])vab);
2674             Asserts.assertEquals(vab[0].hash(), testValue1.hash());
2675             test102(null, (Object[])vab);
2676             Asserts.assertEquals(vab[0], null);
2677         }
2678     }
2679 
2680     @Test()
2681     public static void test103(Object val, Object... args) {
2682         args[0] = val;
2683     }
2684 
2685     @DontCompile
2686     public static void test103_verifier(boolean warmup) {
2687         Object obj = new Object();
2688         test103(obj, obj);
2689         Integer[] myInt = new Integer[1];
2690         test103(rI, (Object[])myInt);
2691         Asserts.assertEquals(myInt[0], rI);
2692         test103(null, (Object[])myInt);
2693         Asserts.assertEquals(myInt[0], null);
2694         if (!warmup) {
2695             MyValue1[] va = new MyValue1[1];
2696             try {
2697                 test103(null, (Object[])va);
2698                 throw new RuntimeException("No NPE thrown");
2699             } catch (NullPointerException npe) {
2700                 // Expected
2701             }
2702         }
2703     }
2704 
2705     @Test()
2706     public static void test104(Object val, Object... args) {
2707         args[0] = val;
2708     }
2709 
2710     @DontCompile
2711     public static void test104_verifier(boolean warmup) {
2712         Object obj = new Object();
2713         test104(obj, obj);
2714         Integer[] myInt = new Integer[1];
2715         test104(rI, (Object[])myInt);
2716         Asserts.assertEquals(myInt[0], rI);
2717         test104(null, (Object[])myInt);
2718         Asserts.assertEquals(myInt[0], null);
2719         if (!warmup) {
2720             try {
2721                 test104(testValue1);
2722                 throw new RuntimeException("No AIOOBE thrown");
2723             } catch (ArrayIndexOutOfBoundsException aioobe) {
2724                 // Expected
2725             }
2726         }
2727     }
2728 
2729     @Test()
2730     public static void test105(Object val, Object... args) {
2731         args[0] = val;
2732     }
2733 
2734     @DontCompile
2735     public static void test105_verifier(boolean warmup) {
2736         Object obj = new Object();
2737         test105(obj, obj);
2738         Integer[] myInt = new Integer[1];
2739         test105(rI, (Object[])myInt);
2740         Asserts.assertEquals(myInt[0], rI);
2741         test105(null, (Object[])myInt);
2742         Asserts.assertEquals(myInt[0], null);
2743         if (!warmup) {
2744             try {
2745                 test105(testValue1, (Object[])null);
2746                 throw new RuntimeException("No NPE thrown");
2747             } catch (NullPointerException npe) {
2748                 // Expected
2749             }
2750         }
2751     }
2752 
2753     @Test()
2754     public static Object[] test106(Object[] dst, Object... args) {
2755         // Access array to speculate on non-flatness
2756         if (args[0] == null) {
2757             args[0] = testValue1;
2758         }
2759         System.arraycopy(args, 0, dst, 0, args.length);
2760         System.arraycopy(dst, 0, args, 0, dst.length);
2761         Object[] clone = args.clone();
2762         if (clone[0] == null) {
2763             throw new RuntimeException("Unexpected null");
2764         }
2765         return Arrays.copyOf(args, args.length, Object[].class);
2766     }
2767 
2768     @DontCompile
2769     public static void test106_verifier(boolean warmup) {
2770         Object[] dst = new Object[1];
2771         Object obj = new Object();
2772         Object[] result = test106(dst, obj);
2773         Asserts.assertEquals(result[0], obj);
2774         Integer[] myInt = new Integer[1];
2775         myInt[0] = rI;
2776         result = test106(myInt, (Object[])myInt);
2777         Asserts.assertEquals(result[0], rI);
2778         if (!warmup) {
2779             MyValue1[] va = new MyValue1[1];
2780             MyValue1?[] vab = new MyValue1?[1];
2781             result = test106(va, (Object[])va);
2782             Asserts.assertEquals(((MyValue1)result[0]).hash(), MyValue1.default.hash());
2783             result = test106(vab, (Object[])vab);
2784             Asserts.assertEquals(((MyValue1)result[0]).hash(), testValue1.hash());
2785         }
2786     }
2787 
2788     // Test that allocation is not replaced by non-dominating allocation
2789     public long test107_helper(MyValue1?[] va, MyValue1 vt) {
2790         try {
2791             va[0] = vt;
2792         } catch (NullPointerException npe) { }
2793         return va[1].hash();
2794     }
2795 
2796     @Test()
2797     public void test107() {
2798         MyValue1[] va = new MyValue1[2];
2799         MyValue1?[] tmp = new MyValue1?[2];
2800         long res1 = test107_helper(va, testValue1);
2801         long res2 = test107_helper(va, testValue1);
2802         Asserts.assertEquals(va[0].hash(), testValue1.hash());
2803         Asserts.assertEquals(res1, MyValue1.default.hash());
2804         Asserts.assertEquals(res2, MyValue1.default.hash());
2805     }
2806 
2807     @DontCompile
2808     public void test107_verifier(boolean warmup) {
2809         test107();
2810     }
2811 }