8297235: ZGC: assert(regs[i] != regs[j]) failed: Multiple uses of register: rax

Reviewed-by: thartmann, rcastanedalo
Backport-of: 042b7062f19b313f31b228bd96d2a74cc1165ab9
This commit is contained in:
Axel Boldt-Christmas 2022-12-14 14:10:24 +00:00
parent 0eeaf6b219
commit 581f9f2306
2 changed files with 31 additions and 100 deletions

View File

@ -35,7 +35,7 @@ source %{
static void z_load_barrier(MacroAssembler& _masm, const MachNode* node, Address ref_addr, Register ref, Register tmp, uint8_t barrier_data) {
if (barrier_data == ZLoadBarrierElided) {
return; // Elided.
return;
}
ZLoadBarrierStubC2* const stub = ZLoadBarrierStubC2::create(node, ref_addr, ref, tmp, barrier_data);
{
@ -60,6 +60,27 @@ static void z_load_barrier_cmpxchg(MacroAssembler& _masm, const MachNode* node,
__ bind(*stub->continuation());
}
static void z_cmpxchg_common(MacroAssembler& _masm, const MachNode* node, Register mem_reg, Register newval, Register tmp) {
// Compare value (oldval) is in rax
const Address mem = Address(mem_reg, 0);
if (node->barrier_data() != ZLoadBarrierElided) {
__ movptr(tmp, rax);
}
__ lock();
__ cmpxchgptr(newval, mem);
if (node->barrier_data() != ZLoadBarrierElided) {
Label good;
z_load_barrier_cmpxchg(_masm, node, mem, rax, tmp, good);
__ movptr(rax, tmp);
__ lock();
__ cmpxchgptr(newval, mem);
__ bind(good);
}
}
%}
// Load Pointer
@ -81,7 +102,7 @@ instruct zLoadP(rRegP dst, memory mem, rFlagsReg cr)
ins_pipe(ialu_reg_mem);
%}
instruct zCompareAndExchangeP(memory mem, rax_RegP oldval, rRegP newval, rRegP tmp, rFlagsReg cr) %{
instruct zCompareAndExchangeP(indirect mem, rax_RegP oldval, rRegP newval, rRegP tmp, rFlagsReg cr) %{
match(Set oldval (CompareAndExchangeP mem (Binary oldval newval)));
predicate(UseZGC && n->as_LoadStore()->barrier_data() == ZLoadBarrierStrong);
effect(KILL cr, TEMP tmp);
@ -90,26 +111,14 @@ instruct zCompareAndExchangeP(memory mem, rax_RegP oldval, rRegP newval, rRegP t
"cmpxchgq $newval, $mem" %}
ins_encode %{
if (barrier_data() != ZLoadBarrierElided) { // barrier could be elided by ZBarrierSetC2::analyze_dominating_barriers()
__ movptr($tmp$$Register, $oldval$$Register);
}
__ lock();
__ cmpxchgptr($newval$$Register, $mem$$Address);
if (barrier_data() != ZLoadBarrierElided) {
Label good;
z_load_barrier_cmpxchg(_masm, this, $mem$$Address, $oldval$$Register, $tmp$$Register, good);
__ movptr($oldval$$Register, $tmp$$Register);
__ lock();
__ cmpxchgptr($newval$$Register, $mem$$Address);
__ bind(good);
}
precond($oldval$$Register == rax);
z_cmpxchg_common(_masm, this, $mem$$Register, $newval$$Register, $tmp$$Register);
%}
ins_pipe(pipe_cmpxchg);
%}
instruct zCompareAndSwapP(rRegI res, memory mem, rRegP newval, rRegP tmp, rFlagsReg cr, rax_RegP oldval) %{
instruct zCompareAndSwapP(rRegI res, indirect mem, rRegP newval, rRegP tmp, rFlagsReg cr, rax_RegP oldval) %{
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
predicate(UseZGC && n->as_LoadStore()->barrier_data() == ZLoadBarrierStrong);
@ -121,20 +130,10 @@ instruct zCompareAndSwapP(rRegI res, memory mem, rRegP newval, rRegP tmp, rFlags
"movzbl $res, $res" %}
ins_encode %{
if (barrier_data() != ZLoadBarrierElided) { // barrier could be elided by ZBarrierSetC2::analyze_dominating_barriers()
__ movptr($tmp$$Register, $oldval$$Register);
}
__ lock();
__ cmpxchgptr($newval$$Register, $mem$$Address);
precond($oldval$$Register == rax);
z_cmpxchg_common(_masm, this, $mem$$Register, $newval$$Register, $tmp$$Register);
if (barrier_data() != ZLoadBarrierElided) {
Label good;
z_load_barrier_cmpxchg(_masm, this, $mem$$Address, $oldval$$Register, $tmp$$Register, good);
__ movptr($oldval$$Register, $tmp$$Register);
__ lock();
__ cmpxchgptr($newval$$Register, $mem$$Address);
__ bind(good);
__ cmpptr($tmp$$Register, $oldval$$Register);
__ cmpptr($tmp$$Register, rax);
}
__ setb(Assembler::equal, $res$$Register);
__ movzbl($res$$Register, $res$$Register);
@ -143,7 +142,7 @@ instruct zCompareAndSwapP(rRegI res, memory mem, rRegP newval, rRegP tmp, rFlags
ins_pipe(pipe_cmpxchg);
%}
instruct zXChgP(memory mem, rRegP newval, rFlagsReg cr) %{
instruct zXChgP(indirect mem, rRegP newval, rFlagsReg cr) %{
match(Set newval (GetAndSetP mem newval));
predicate(UseZGC && n->as_LoadStore()->barrier_data() != 0);
effect(KILL cr);
@ -151,7 +150,7 @@ instruct zXChgP(memory mem, rRegP newval, rFlagsReg cr) %{
format %{ "xchgq $newval, $mem" %}
ins_encode %{
__ xchgptr($newval$$Register, $mem$$Address);
__ xchgptr($newval$$Register, Address($mem$$Register, 0));
z_load_barrier(_masm, this, Address(noreg, 0), $newval$$Register, noreg /* tmp */, barrier_data());
%}

View File

@ -26,71 +26,3 @@
# List of quarantined tests for testing with ZGC.
#
#############################################################################
java/lang/StackWalker/AcrossThreads.java 8297235 generic-x64
java/math/BigInteger/BigIntegerParallelMultiplyTest.java 8297235 generic-x64
java/util/Arrays/SetAllTest.java 8297235 generic-x64
java/util/Arrays/Sorting.java 8297235 generic-x64
java/util/Arrays/largeMemory/ParallelPrefix.java 8297235 generic-x64
java/util/BitSet/stream/BitSetStreamTest.java 8297235 generic-x64
java/util/Collection/IteratorMicroBenchmark.java 8297235 generic-x64
java/util/Collections/UnmodifiableMapEntrySet.java 8297235 generic-x64
java/util/DoubleStreamSums/CompensatedSums.java 8297235 generic-x64
java/util/Random/RandomTest.java 8297235 generic-x64
java/util/Scanner/ScannerStreamTest.java 8297235 generic-x64
java/util/concurrent/forkjoin/AsyncShutdownNow.java 8297235 generic-x64
java/util/concurrent/forkjoin/AsyncShutdownNowInvokeAny.java 8297235 generic-x64
java/util/concurrent/forkjoin/AsyncShutdownNowInvokeAnyRace.java 8297235 generic-x64
java/util/concurrent/forkjoin/Integrate.java 8297235 generic-x64
java/util/concurrent/forkjoin/NQueensCS.java 8297235 generic-x64
java/util/concurrent/tck/JSR166TestCase.java 8297235 generic-x64
java/util/regex/PatternStreamTest.java 8297235 generic-x64
java/util/stream/CustomFJPoolTest.java 8297235 generic-x64
java/util/stream/boottest/java.base/java/util/stream/DoubleNodeTest.java 8297235 generic-x64
java/util/stream/boottest/java.base/java/util/stream/FlagOpTest.java 8297235 generic-x64
java/util/stream/boottest/java.base/java/util/stream/IntNodeTest.java 8297235 generic-x64
java/util/stream/boottest/java.base/java/util/stream/LongNodeTest.java 8297235 generic-x64
java/util/stream/boottest/java.base/java/util/stream/NodeTest.java 8297235 generic-x64
java/util/stream/boottest/java.base/java/util/stream/StreamReuseTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/SplittableRandomTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/CollectAndSummaryStatisticsTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorsTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/ConcatOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/CountTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/DistinctOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/DoublePrimitiveOpsTests.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/FilterOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/FindAnyOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/FindFirstOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/FlatMapOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/ForEachOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/GroupByOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/InfiniteStreamWithLimitOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/IntPrimitiveOpsTests.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/IntReduceTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/IntSliceOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/IntUniqOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/IterateTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/LongPrimitiveOpsTests.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/MapOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/MatchOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/MinMaxTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/PrimitiveAverageOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/PrimitiveSumTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/RangeTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/ReduceByOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/ReduceTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/SequentialOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/SliceOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/SortedOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/StreamBuilderTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/StreamLinkTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/StreamSpliteratorTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/TeeOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/ToArrayOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/ToListOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpTest.java 8297235 generic-x64
java/util/stream/test/org/openjdk/tests/java/util/stream/mapMultiOpTest.java 8297235 generic-x64
jdk/internal/vm/Continuation/Fuzz.java#default 8298058 generic-x64