Skip to content

Commit 042b706

Browse files
committed
8297235: ZGC: assert(regs[i] != regs[j]) failed: Multiple uses of register: rax
Reviewed-by: eosterlund, ayang, rcastanedalo
1 parent 4081bba commit 042b706

File tree

2 files changed

+31
-100
lines changed

2 files changed

+31
-100
lines changed

src/hotspot/cpu/x86/gc/z/z_x86_64.ad

+31-32
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ source %{
3535

3636
static void z_load_barrier(MacroAssembler& _masm, const MachNode* node, Address ref_addr, Register ref, Register tmp, uint8_t barrier_data) {
3737
if (barrier_data == ZLoadBarrierElided) {
38-
return; // Elided.
38+
return;
3939
}
4040
ZLoadBarrierStubC2* const stub = ZLoadBarrierStubC2::create(node, ref_addr, ref, tmp, barrier_data);
4141
{
@@ -60,6 +60,27 @@ static void z_load_barrier_cmpxchg(MacroAssembler& _masm, const MachNode* node,
6060
__ bind(*stub->continuation());
6161
}
6262

63+
static void z_cmpxchg_common(MacroAssembler& _masm, const MachNode* node, Register mem_reg, Register newval, Register tmp) {
64+
// Compare value (oldval) is in rax
65+
const Address mem = Address(mem_reg, 0);
66+
67+
if (node->barrier_data() != ZLoadBarrierElided) {
68+
__ movptr(tmp, rax);
69+
}
70+
71+
__ lock();
72+
__ cmpxchgptr(newval, mem);
73+
74+
if (node->barrier_data() != ZLoadBarrierElided) {
75+
Label good;
76+
z_load_barrier_cmpxchg(_masm, node, mem, rax, tmp, good);
77+
__ movptr(rax, tmp);
78+
__ lock();
79+
__ cmpxchgptr(newval, mem);
80+
__ bind(good);
81+
}
82+
}
83+
6384
%}
6485

6586
// Load Pointer
@@ -81,7 +102,7 @@ instruct zLoadP(rRegP dst, memory mem, rFlagsReg cr)
81102
ins_pipe(ialu_reg_mem);
82103
%}
83104

84-
instruct zCompareAndExchangeP(memory mem, rax_RegP oldval, rRegP newval, rRegP tmp, rFlagsReg cr) %{
105+
instruct zCompareAndExchangeP(indirect mem, rax_RegP oldval, rRegP newval, rRegP tmp, rFlagsReg cr) %{
85106
match(Set oldval (CompareAndExchangeP mem (Binary oldval newval)));
86107
predicate(UseZGC && n->as_LoadStore()->barrier_data() == ZLoadBarrierStrong);
87108
effect(KILL cr, TEMP tmp);
@@ -90,26 +111,14 @@ instruct zCompareAndExchangeP(memory mem, rax_RegP oldval, rRegP newval, rRegP t
90111
"cmpxchgq $newval, $mem" %}
91112

92113
ins_encode %{
93-
if (barrier_data() != ZLoadBarrierElided) { // barrier could be elided by ZBarrierSetC2::analyze_dominating_barriers()
94-
__ movptr($tmp$$Register, $oldval$$Register);
95-
}
96-
__ lock();
97-
__ cmpxchgptr($newval$$Register, $mem$$Address);
98-
99-
if (barrier_data() != ZLoadBarrierElided) {
100-
Label good;
101-
z_load_barrier_cmpxchg(_masm, this, $mem$$Address, $oldval$$Register, $tmp$$Register, good);
102-
__ movptr($oldval$$Register, $tmp$$Register);
103-
__ lock();
104-
__ cmpxchgptr($newval$$Register, $mem$$Address);
105-
__ bind(good);
106-
}
114+
precond($oldval$$Register == rax);
115+
z_cmpxchg_common(_masm, this, $mem$$Register, $newval$$Register, $tmp$$Register);
107116
%}
108117

109118
ins_pipe(pipe_cmpxchg);
110119
%}
111120

112-
instruct zCompareAndSwapP(rRegI res, memory mem, rRegP newval, rRegP tmp, rFlagsReg cr, rax_RegP oldval) %{
121+
instruct zCompareAndSwapP(rRegI res, indirect mem, rRegP newval, rRegP tmp, rFlagsReg cr, rax_RegP oldval) %{
113122
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
114123
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
115124
predicate(UseZGC && n->as_LoadStore()->barrier_data() == ZLoadBarrierStrong);
@@ -121,20 +130,10 @@ instruct zCompareAndSwapP(rRegI res, memory mem, rRegP newval, rRegP tmp, rFlags
121130
"movzbl $res, $res" %}
122131

123132
ins_encode %{
124-
if (barrier_data() != ZLoadBarrierElided) { // barrier could be elided by ZBarrierSetC2::analyze_dominating_barriers()
125-
__ movptr($tmp$$Register, $oldval$$Register);
126-
}
127-
__ lock();
128-
__ cmpxchgptr($newval$$Register, $mem$$Address);
129-
133+
precond($oldval$$Register == rax);
134+
z_cmpxchg_common(_masm, this, $mem$$Register, $newval$$Register, $tmp$$Register);
130135
if (barrier_data() != ZLoadBarrierElided) {
131-
Label good;
132-
z_load_barrier_cmpxchg(_masm, this, $mem$$Address, $oldval$$Register, $tmp$$Register, good);
133-
__ movptr($oldval$$Register, $tmp$$Register);
134-
__ lock();
135-
__ cmpxchgptr($newval$$Register, $mem$$Address);
136-
__ bind(good);
137-
__ cmpptr($tmp$$Register, $oldval$$Register);
136+
__ cmpptr($tmp$$Register, rax);
138137
}
139138
__ setb(Assembler::equal, $res$$Register);
140139
__ movzbl($res$$Register, $res$$Register);
@@ -143,15 +142,15 @@ instruct zCompareAndSwapP(rRegI res, memory mem, rRegP newval, rRegP tmp, rFlags
143142
ins_pipe(pipe_cmpxchg);
144143
%}
145144

146-
instruct zXChgP(memory mem, rRegP newval, rFlagsReg cr) %{
145+
instruct zXChgP(indirect mem, rRegP newval, rFlagsReg cr) %{
147146
match(Set newval (GetAndSetP mem newval));
148147
predicate(UseZGC && n->as_LoadStore()->barrier_data() != 0);
149148
effect(KILL cr);
150149

151150
format %{ "xchgq $newval, $mem" %}
152151

153152
ins_encode %{
154-
__ xchgptr($newval$$Register, $mem$$Address);
153+
__ xchgptr($newval$$Register, Address($mem$$Register, 0));
155154
z_load_barrier(_masm, this, Address(noreg, 0), $newval$$Register, noreg /* tmp */, barrier_data());
156155
%}
157156

test/jdk/ProblemList-zgc.txt

-68
Original file line numberDiff line numberDiff line change
@@ -26,71 +26,3 @@
2626
# List of quarantined tests for testing with ZGC.
2727
#
2828
#############################################################################
29-
30-
java/lang/StackWalker/AcrossThreads.java 8297235 generic-x64
31-
java/math/BigInteger/BigIntegerParallelMultiplyTest.java 8297235 generic-x64
32-
java/util/Arrays/SetAllTest.java 8297235 generic-x64
33-
java/util/Arrays/Sorting.java 8297235 generic-x64
34-
java/util/Arrays/largeMemory/ParallelPrefix.java 8297235 generic-x64
35-
java/util/BitSet/stream/BitSetStreamTest.java 8297235 generic-x64
36-
java/util/Collection/IteratorMicroBenchmark.java 8297235 generic-x64
37-
java/util/Collections/UnmodifiableMapEntrySet.java 8297235 generic-x64
38-
java/util/DoubleStreamSums/CompensatedSums.java 8297235 generic-x64
39-
java/util/Random/RandomTest.java 8297235 generic-x64
40-
java/util/Scanner/ScannerStreamTest.java 8297235 generic-x64
41-
java/util/concurrent/forkjoin/AsyncShutdownNow.java 8297235 generic-x64
42-
java/util/concurrent/forkjoin/AsyncShutdownNowInvokeAny.java 8297235 generic-x64
43-
java/util/concurrent/forkjoin/AsyncShutdownNowInvokeAnyRace.java 8297235 generic-x64
44-
java/util/concurrent/forkjoin/Integrate.java 8297235 generic-x64
45-
java/util/concurrent/forkjoin/NQueensCS.java 8297235 generic-x64
46-
java/util/concurrent/tck/JSR166TestCase.java 8297235 generic-x64
47-
java/util/regex/PatternStreamTest.java 8297235 generic-x64
48-
java/util/stream/CustomFJPoolTest.java 8297235 generic-x64
49-
java/util/stream/boottest/java.base/java/util/stream/DoubleNodeTest.java 8297235 generic-x64
50-
java/util/stream/boottest/java.base/java/util/stream/FlagOpTest.java 8297235 generic-x64
51-
java/util/stream/boottest/java.base/java/util/stream/IntNodeTest.java 8297235 generic-x64
52-
java/util/stream/boottest/java.base/java/util/stream/LongNodeTest.java 8297235 generic-x64
53-
java/util/stream/boottest/java.base/java/util/stream/NodeTest.java 8297235 generic-x64
54-
java/util/stream/boottest/java.base/java/util/stream/StreamReuseTest.java 8297235 generic-x64
55-
java/util/stream/test/org/openjdk/tests/java/util/SplittableRandomTest.java 8297235 generic-x64
56-
java/util/stream/test/org/openjdk/tests/java/util/stream/CollectAndSummaryStatisticsTest.java 8297235 generic-x64
57-
java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorsTest.java 8297235 generic-x64
58-
java/util/stream/test/org/openjdk/tests/java/util/stream/ConcatOpTest.java 8297235 generic-x64
59-
java/util/stream/test/org/openjdk/tests/java/util/stream/CountTest.java 8297235 generic-x64
60-
java/util/stream/test/org/openjdk/tests/java/util/stream/DistinctOpTest.java 8297235 generic-x64
61-
java/util/stream/test/org/openjdk/tests/java/util/stream/DoublePrimitiveOpsTests.java 8297235 generic-x64
62-
java/util/stream/test/org/openjdk/tests/java/util/stream/FilterOpTest.java 8297235 generic-x64
63-
java/util/stream/test/org/openjdk/tests/java/util/stream/FindAnyOpTest.java 8297235 generic-x64
64-
java/util/stream/test/org/openjdk/tests/java/util/stream/FindFirstOpTest.java 8297235 generic-x64
65-
java/util/stream/test/org/openjdk/tests/java/util/stream/FlatMapOpTest.java 8297235 generic-x64
66-
java/util/stream/test/org/openjdk/tests/java/util/stream/ForEachOpTest.java 8297235 generic-x64
67-
java/util/stream/test/org/openjdk/tests/java/util/stream/GroupByOpTest.java 8297235 generic-x64
68-
java/util/stream/test/org/openjdk/tests/java/util/stream/InfiniteStreamWithLimitOpTest.java 8297235 generic-x64
69-
java/util/stream/test/org/openjdk/tests/java/util/stream/IntPrimitiveOpsTests.java 8297235 generic-x64
70-
java/util/stream/test/org/openjdk/tests/java/util/stream/IntReduceTest.java 8297235 generic-x64
71-
java/util/stream/test/org/openjdk/tests/java/util/stream/IntSliceOpTest.java 8297235 generic-x64
72-
java/util/stream/test/org/openjdk/tests/java/util/stream/IntUniqOpTest.java 8297235 generic-x64
73-
java/util/stream/test/org/openjdk/tests/java/util/stream/IterateTest.java 8297235 generic-x64
74-
java/util/stream/test/org/openjdk/tests/java/util/stream/LongPrimitiveOpsTests.java 8297235 generic-x64
75-
java/util/stream/test/org/openjdk/tests/java/util/stream/MapOpTest.java 8297235 generic-x64
76-
java/util/stream/test/org/openjdk/tests/java/util/stream/MatchOpTest.java 8297235 generic-x64
77-
java/util/stream/test/org/openjdk/tests/java/util/stream/MinMaxTest.java 8297235 generic-x64
78-
java/util/stream/test/org/openjdk/tests/java/util/stream/PrimitiveAverageOpTest.java 8297235 generic-x64
79-
java/util/stream/test/org/openjdk/tests/java/util/stream/PrimitiveSumTest.java 8297235 generic-x64
80-
java/util/stream/test/org/openjdk/tests/java/util/stream/RangeTest.java 8297235 generic-x64
81-
java/util/stream/test/org/openjdk/tests/java/util/stream/ReduceByOpTest.java 8297235 generic-x64
82-
java/util/stream/test/org/openjdk/tests/java/util/stream/ReduceTest.java 8297235 generic-x64
83-
java/util/stream/test/org/openjdk/tests/java/util/stream/SequentialOpTest.java 8297235 generic-x64
84-
java/util/stream/test/org/openjdk/tests/java/util/stream/SliceOpTest.java 8297235 generic-x64
85-
java/util/stream/test/org/openjdk/tests/java/util/stream/SortedOpTest.java 8297235 generic-x64
86-
java/util/stream/test/org/openjdk/tests/java/util/stream/StreamBuilderTest.java 8297235 generic-x64
87-
java/util/stream/test/org/openjdk/tests/java/util/stream/StreamLinkTest.java 8297235 generic-x64
88-
java/util/stream/test/org/openjdk/tests/java/util/stream/StreamSpliteratorTest.java 8297235 generic-x64
89-
java/util/stream/test/org/openjdk/tests/java/util/stream/TeeOpTest.java 8297235 generic-x64
90-
java/util/stream/test/org/openjdk/tests/java/util/stream/ToArrayOpTest.java 8297235 generic-x64
91-
java/util/stream/test/org/openjdk/tests/java/util/stream/ToListOpTest.java 8297235 generic-x64
92-
java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java 8297235 generic-x64
93-
java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpTest.java 8297235 generic-x64
94-
java/util/stream/test/org/openjdk/tests/java/util/stream/mapMultiOpTest.java 8297235 generic-x64
95-
96-
jdk/internal/vm/Continuation/Fuzz.java#default 8298058 generic-x64

0 commit comments

Comments
 (0)