Skip to content

Commit 5228b25

Browse files
Vladimir Petkoshipilev
authored andcommitted
8370049: [s390x] G1 barrier compareAndExchange does not return old value when compareExchange fails
Backport-of: 5609ee11a2daf888d02c0c1b2b70eb4df817582c
1 parent 4a7697c commit 5228b25

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/hotspot/cpu/s390/gc/g1/g1_s390.ad

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ instruct g1CompareAndExchangeP(iRegP mem_ptr, rarg5RegP oldval, iRegP_N2P newval
356356

357357
__ z_lgr($res$$Register, $oldval$$Register); // previous content
358358

359-
__ z_csg($oldval$$Register, $newval$$Register, 0, $mem_ptr$$reg);
359+
__ z_csg($res$$Register, $newval$$Register, 0, $mem_ptr$$reg);
360360

361361
write_barrier_post(masm, this,
362362
$mem_ptr$$Register /* store_addr */,

test/hotspot/jtreg/compiler/gcbarriers/TestG1BarrierGeneration.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,16 @@ public void runAtomicTests() {
880880
Asserts.assertEquals(oldVal, oldVal2);
881881
Asserts.assertEquals(o.f, newVal);
882882
}
883+
{
884+
Outer o = new Outer();
885+
Object oldVal = new Object();
886+
o.f = oldVal;
887+
Object cmpVal = new Object();
888+
Object newVal = new Object();
889+
Object oldVal2 = testCompareAndExchange(o, cmpVal, newVal);
890+
Asserts.assertEquals(oldVal2, oldVal);
891+
Asserts.assertEquals(o.f, oldVal);
892+
}
883893
{
884894
Outer o = new Outer();
885895
Object oldVal = new Object();
@@ -889,6 +899,16 @@ public void runAtomicTests() {
889899
Asserts.assertTrue(b);
890900
Asserts.assertEquals(o.f, newVal);
891901
}
902+
{
903+
Outer o = new Outer();
904+
Object oldVal = new Object();
905+
o.f = oldVal;
906+
Object cmpVal = new Object();
907+
Object newVal = new Object();
908+
boolean b = testCompareAndSwap(o, cmpVal, newVal);
909+
Asserts.assertFalse(b);
910+
Asserts.assertEquals(o.f, oldVal);
911+
}
892912
{
893913
Outer o = new Outer();
894914
Object oldVal = new Object();

0 commit comments

Comments
 (0)