1 /* 2 * Copyright (c) 2024, Red Hat, Inc. All rights reserved. 3 * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 */ 24 25 package compiler.c2; 26 27 import compiler.lib.ir_framework.*; 28 import jdk.internal.misc.Unsafe; 29 30 /* 31 * @test 32 * @bug 8343068 33 * @summary C2: CastX2P Ideal transformation not always applied 34 * @modules java.base/jdk.internal.misc 35 * @library /test/lib / 36 * @run driver compiler.c2.TestCastX2NotProcessedIGVN 37 */ 38 39 public class TestCastX2NotProcessedIGVN { 40 private static final Unsafe UNSAFE = Unsafe.getUnsafe(); 41 static int size = 1024; 42 static long base = UNSAFE.allocateMemory(4 * size); 43 44 45 public static void main(String[] args) { 46 // Cross-product: +-AlignVector and +-UseCompactObjectHeaders 47 TestFramework.runWithFlags("--add-modules", "java.base", "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", 48 "-XX:+UnlockExperimentalVMOptions", "-XX:-UseCompactObjectHeaders", 49 "-XX:-AlignVector"); 50 TestFramework.runWithFlags("--add-modules", "java.base", "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", 51 "-XX:+UnlockExperimentalVMOptions", "-XX:-UseCompactObjectHeaders", 52 "-XX:+AlignVector"); 53 TestFramework.runWithFlags("--add-modules", "java.base", "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", 54 "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCompactObjectHeaders", 55 "-XX:-AlignVector"); 56 TestFramework.runWithFlags("--add-modules", "java.base", "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", 57 "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCompactObjectHeaders", 58 "-XX:+AlignVector"); 59 } 60 61 @Test 62 @IR(failOn = IRNode.ADD_L, counts = {IRNode.ADD_P, "1"}) 63 public static byte test1(long base) { 64 int offset = 0; 65 do { 66 offset++; 67 } while (offset < 100); 68 long longOffset = ((long) offset) * 2; 69 return UNSAFE.getByte(null, base + longOffset); 70 } 71 72 @Run(test = "test1") 73 public static void test1Runner() { 74 test1(base); 75 } 76 77 @Test 78 @IR(counts = {IRNode.LOAD_VECTOR_I, "> 1"}, 79 applyIfPlatformOr = {"x64", "true", "aarch64", "true"}) 80 public static int test2(int stop, int[] array) { 81 int v = 0; 82 stop = Math.min(stop, Integer.MAX_VALUE / 4); 83 for (int i = 0; i < stop; i++) { 84 long offset = ((long)i) * 4; 85 array[i] = UNSAFE.getInt(null, offset + base); 86 } 87 return v; 88 } 89 90 @Run(test = "test2") 91 public static void test2Runner() { 92 test2(size, new int[size]); 93 } 94 }