Skip to content

Commit c55102a

Browse files
committed
8353212: [lworld] TestFlatArrayAliasesCardMark.java crashes when run with -XX:+UseAtomicValueFlattening
1 parent 71d0579 commit c55102a

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

src/hotspot/share/opto/inlinetypenode.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ static Node* get_payload_value(PhaseGVN* gvn, Node* payload, BasicType bt, Basic
579579
value = gvn->transform(new URShiftINode(payload, shift_val));
580580
}
581581

582-
if (val_bt == T_INT || val_bt == T_OBJECT) {
582+
if (val_bt == T_INT || val_bt == T_OBJECT || val_bt == T_ARRAY) {
583583
return value;
584584
} else {
585585
// Make sure to zero unused bits in the 32-bit value

test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestArrayNullMarkers.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,18 @@ public MyClass(int x) {
172172
}
173173
}
174174

175+
@ImplicitlyConstructible
176+
@LooselyConsistentValue
177+
static value class IntAndArrayOop {
178+
int i;
179+
MyClass[] array;
180+
181+
public IntAndArrayOop(int i, MyClass[] array) {
182+
this.i = i;
183+
this.array = array;
184+
}
185+
}
186+
175187
public static void testWrite0(OneByte[] array, int i, OneByte val) {
176188
array[i] = val;
177189
}
@@ -691,6 +703,11 @@ public static void main(String[] args) {
691703
ByteAndOop[] nullableArray5 = new ByteAndOop[3];
692704
ByteAndOop[] nullableAtomicArray5 = (ByteAndOop[])ValueClass.newNullableAtomicArray(ByteAndOop.class, 3);
693705

706+
IntAndArrayOop[] nullFreeArray6 = (IntAndArrayOop[])ValueClass.newNullRestrictedArray(IntAndArrayOop.class, 3);
707+
IntAndArrayOop[] nullFreeAtomicArray6 = (IntAndArrayOop[])ValueClass.newNullRestrictedAtomicArray(IntAndArrayOop.class, 3);
708+
IntAndArrayOop[] nullableArray6 = new IntAndArrayOop[3];
709+
IntAndArrayOop[] nullableAtomicArray6 = (IntAndArrayOop[])ValueClass.newNullableAtomicArray(IntAndArrayOop.class, 3);
710+
694711
// Write canary values to detect out of bound writes
695712
nullFreeArray0[0] = CANARY0;
696713
nullFreeArray0[2] = CANARY0;
@@ -870,6 +887,28 @@ public static void main(String[] args) {
870887
testWrite5(nullableArray5, 1, val5);
871888
testWrite5(nullableAtomicArray5, 1, val5);
872889

890+
IntAndArrayOop val6 = new IntAndArrayOop(i, new MyClass[1]);
891+
nullFreeArray6[1] = val6;
892+
nullFreeArray6[2] = nullFreeArray6[1];
893+
nullFreeAtomicArray6[1] = val6;
894+
nullFreeAtomicArray6[2] = nullFreeAtomicArray6[1];
895+
nullableArray6[1] = val6;
896+
nullableArray6[2] = nullableArray6[1];
897+
nullableAtomicArray6[1] = val6;
898+
nullableAtomicArray6[2] = nullableAtomicArray6[1];
899+
Asserts.assertEQ(nullFreeArray6[0], new IntAndArrayOop(0, null));
900+
Asserts.assertEQ(nullFreeAtomicArray6[0], new IntAndArrayOop(0, null));
901+
Asserts.assertEQ(nullableArray6[0], null);
902+
Asserts.assertEQ(nullableAtomicArray6[0], null);
903+
Asserts.assertEQ(nullFreeArray6[1], val6);
904+
Asserts.assertEQ(nullFreeAtomicArray6[1], val6);
905+
Asserts.assertEQ(nullableArray6[1], val6);
906+
Asserts.assertEQ(nullableAtomicArray6[1], val6);
907+
Asserts.assertEQ(nullFreeArray6[2], val6);
908+
Asserts.assertEQ(nullFreeAtomicArray6[2], val6);
909+
Asserts.assertEQ(nullableArray6[2], val6);
910+
Asserts.assertEQ(nullableAtomicArray6[2], val6);
911+
873912
if (i > (LIMIT - 50)) {
874913
// After warmup, produce some garbage to trigger GC
875914
produceGarbage();

0 commit comments

Comments
 (0)