Skip to content
This repository was archived by the owner on Feb 2, 2023. It is now read-only.
/ jdk13u-dev Public archive

Commit afdd824

Browse files
Olga MikhaltsovaYuri Nesterenko
Olga Mikhaltsova
authored and
Yuri Nesterenko
committed
8249608: Vector register used by C2 compiled method corrupted at safepoint
Always update 'max_vlen_in_bytes'. Backport-of: 970e251
1 parent 49e369c commit afdd824

File tree

2 files changed

+105
-1
lines changed

2 files changed

+105
-1
lines changed

src/hotspot/share/opto/superword.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2605,8 +2605,10 @@ void SuperWord::output() {
26052605
}
26062606
}
26072607

2608-
if (vlen_in_bytes >= max_vlen_in_bytes && vlen > max_vlen) {
2608+
if (vlen > max_vlen) {
26092609
max_vlen = vlen;
2610+
}
2611+
if (vlen_in_bytes > max_vlen_in_bytes) {
26102612
max_vlen_in_bytes = vlen_in_bytes;
26112613
}
26122614
#ifdef ASSERT
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/*
2+
* Copyright (c) 2020, 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+
* @summary C2: Vector registers are sometimes corrupted at safepoint
29+
* @run main/othervm -XX:-BackgroundCompilation -XX:+UseCountedLoopSafepoints -XX:LoopStripMiningIter=1000 TestVectorsNotSavedAtSafepoint test1
30+
* @run main/othervm -XX:-BackgroundCompilation TestVectorsNotSavedAtSafepoint test2
31+
*/
32+
33+
import java.util.Arrays;
34+
35+
public class TestVectorsNotSavedAtSafepoint {
36+
37+
static void test1(byte[] barray1, byte[] barray2, byte[] barray3, long[] larray, long v) {
38+
// Uses wide vectors, v in vector registers is live at the
39+
// safepoint of the outer strip mined loop
40+
for (int i = 0; i < larray.length; i++) {
41+
larray[i] = v;
42+
}
43+
// Runs for few iterations so limited unrolling and short
44+
// vectors
45+
for (int i = 0; i < barray3.length; i++) {
46+
barray3[i] = (byte)(barray1[i] + barray2[i]);
47+
}
48+
}
49+
50+
public static void test2(int[] iArr, long[] lArr) {
51+
// Loop with wide and non-wide vectors
52+
for (int i = 0; i < lArr.length; i++) {
53+
iArr[i] = 1;
54+
lArr[i] = 1;
55+
}
56+
}
57+
58+
static class GarbageProducerThread extends Thread {
59+
public void run() {
60+
for(;;) {
61+
Object[] arrays = new Object[1024];
62+
for (int i = 0; i < arrays.length; i++) {
63+
arrays[i] = new int[1024];
64+
}
65+
}
66+
}
67+
}
68+
69+
public static void main(String[] args) {
70+
Thread garbage_producer = new GarbageProducerThread();
71+
garbage_producer.setDaemon(true);
72+
garbage_producer.start();
73+
74+
if (args[0].equals("test1")) {
75+
byte[] barray = new byte[10];
76+
long[] larray1 = new long[1000];
77+
long[] larray2 = new long[100_000_000];
78+
for (int i = 0; i < 20_000; i++) {
79+
test1(barray, barray, barray, larray1, -1);
80+
}
81+
for (int i = 0; i < 100; i++) {
82+
test1(barray, barray, barray, larray2, -1);
83+
if (larray2[larray2.length-1] != -1) {
84+
System.out.println("Iter " + i + " Failed with " + Long.toHexString(larray2[larray2.length-1]));
85+
throw new RuntimeException("Test1 failed");
86+
}
87+
}
88+
} else {
89+
int iArr[] = new int[100];
90+
long lArr[] = new long[100];
91+
for (int i = 0; i < 600_000; ++i) {
92+
test2(iArr, lArr);
93+
for (int j = 0; j < lArr.length; ++j) {
94+
if (iArr[j] != 1 || lArr[j] != 1) {
95+
throw new RuntimeException("Test2 failed at iteration " + i + ": iArr[" + j + "] = " + iArr[j] + ", lArr[" + j + "] = " + lArr[j]);
96+
}
97+
}
98+
}
99+
}
100+
}
101+
}
102+

0 commit comments

Comments
 (0)