1 /* 2 * Copyright (c) 2020, 2026, Oracle and/or its affiliates. All rights reserved. 3 * Copyright (c) 2020, Red Hat, Inc. 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 /** 26 * @test 27 * @bug 8193518 8249608 28 * @requires vm.compMode != "Xcomp" 29 * @summary C2: Vector registers are sometimes corrupted at safepoint 30 * @run main/othervm -XX:-BackgroundCompilation -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCountedLoopSafepoints -XX:LoopStripMiningIter=2 -XX:-TieredCompilation TestVectorsNotSavedAtSafepoint test1 31 * @run main/othervm -XX:-BackgroundCompilation TestVectorsNotSavedAtSafepoint test2 32 */ 33 34 import java.util.Arrays; 35 36 public class TestVectorsNotSavedAtSafepoint { 37 38 static void test1(byte[] barray1, byte[] barray2, byte[] barray3, long[] larray, long v) { 39 // Uses wide vectors, v in vector registers is live at the 40 // safepoint of the outer strip mined loop 41 for (int i = 0; i < larray.length; i++) { 42 larray[i] = v; 43 } 44 // Runs for few iterations so limited unrolling and short 45 // vectors 46 for (int i = 0; i < barray3.length; i++) { 47 barray3[i] = (byte)(barray1[i] + barray2[i]); 48 } 49 } 50 51 public static void test2(int[] iArr, long[] lArr) { 52 // Loop with wide and non-wide vectors 53 for (int i = 0; i < lArr.length; i++) { 54 iArr[i] = 1; 55 lArr[i] = 1; 56 } 57 } 58 59 static class GarbageProducerThread extends Thread { 60 public void run() { 61 for(;;) { 62 // Produce some garbage and then let the GC do its work which will 63 // corrupt vector registers if they are not saved at safepoints. 64 Object[] arrays = new Object[1024]; 65 for (int i = 0; i < arrays.length; i++) { 66 arrays[i] = new int[1024]; 67 } 68 System.gc(); 69 } 70 } 71 } 72 73 public static void main(String[] args) { 74 Thread garbage_producer = new GarbageProducerThread(); 75 garbage_producer.setDaemon(true); 76 garbage_producer.start(); 77 78 if (args[0].equals("test1")) { 79 byte[] bArr = new byte[10]; 80 long[] lArr = new long[1000]; 81 for (int i = 0; i < 10_000; ++i) { 82 test1(bArr, bArr, bArr, lArr, -1); 83 for (int j = 0; j < lArr.length; ++j) { 84 if (bArr[j % 10] != 0 || lArr[j] != -1) { 85 throw new RuntimeException("Test1 failed at iteration " + i + ": bArr[" + (j % 10) + "] = " + bArr[j % 10] + ", lArr[" + j + "] = " + lArr[j]); 86 } 87 } 88 } 89 } else { 90 int iArr[] = new int[100]; 91 long lArr[] = new long[100]; 92 for (int i = 0; i < 10_000; ++i) { 93 test2(iArr, lArr); 94 for (int j = 0; j < lArr.length; ++j) { 95 if (iArr[j] != 1 || lArr[j] != 1) { 96 throw new RuntimeException("Test2 failed at iteration " + i + ": iArr[" + j + "] = " + iArr[j] + ", lArr[" + j + "] = " + lArr[j]); 97 } 98 } 99 } 100 } 101 } 102 } 103 --- EOF ---