< prev index next > test/hotspot/jtreg/compiler/gcbarriers/TestZGCBarrierElision.java
Print this page
import java.lang.invoke.VarHandle;
import java.lang.invoke.MethodHandles;
import java.util.concurrent.ThreadLocalRandom;
/**
! * @test
* @summary Test that the ZGC barrier elision optimization does not elide
* necessary barriers. The tests use volatile memory accesses and
* blackholes to prevent C2 from simply optimizing them away.
* @library /test/lib /
* @requires vm.gc.Z
* @run driver compiler.gcbarriers.TestZGCBarrierElision test-correctness
*/
/**
! * @test
* @summary Test that the ZGC barrier elision optimization elides unnecessary
* barriers following simple allocation and domination rules.
* @library /test/lib /
* @requires vm.gc.Z & (vm.simpleArch == "x64" | vm.simpleArch == "aarch64")
* @run driver compiler.gcbarriers.TestZGCBarrierElision test-effectiveness
import java.lang.invoke.VarHandle;
import java.lang.invoke.MethodHandles;
import java.util.concurrent.ThreadLocalRandom;
/**
! * @test id=Z
* @summary Test that the ZGC barrier elision optimization does not elide
* necessary barriers. The tests use volatile memory accesses and
* blackholes to prevent C2 from simply optimizing them away.
* @library /test/lib /
* @requires vm.gc.Z
* @run driver compiler.gcbarriers.TestZGCBarrierElision test-correctness
*/
/**
! * @test id=ZGen
* @summary Test that the ZGC barrier elision optimization elides unnecessary
* barriers following simple allocation and domination rules.
* @library /test/lib /
* @requires vm.gc.Z & (vm.simpleArch == "x64" | vm.simpleArch == "aarch64")
* @run driver compiler.gcbarriers.TestZGCBarrierElision test-effectiveness
testConditionalStoreThenStore(Common.outer, Common.inner, ThreadLocalRandom.current().nextInt(0, 100));
testStoreThenCallThenStore(Common.outer, Common.inner);
}
@Test
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAllocateThenAtomic(Inner i) {
Outer o = new Outer();
Common.blackhole(o);
Common.field1VarHandle.getAndSet(o, i);
}
@Test
! @IR(counts = { IRNode.Z_LOAD_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
static void testLoadThenAtomic(Outer o, Inner i) {
Common.blackhole(o.field1);
Common.field1VarHandle.getAndSet(o, i);
}
@Test
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "2" }, phase = CompilePhase.FINAL_CODE)
static void testAtomicThenAtomicAnotherField(Outer o, Inner i) {
Common.field1VarHandle.getAndSet(o, i);
Common.field2VarHandle.getAndSet(o, i);
}
@Test
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAllocateArrayThenAtomicAtKnownIndex(Outer o) {
Outer[] a = new Outer[42];
Common.blackhole(a);
Common.outerArrayVarHandle.getAndSet(a, 2, o);
}
@Test
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAllocateArrayThenAtomicAtUnknownIndex(Outer o, int index) {
Outer[] a = new Outer[42];
Common.blackhole(a);
Common.outerArrayVarHandle.getAndSet(a, index, o);
}
@Test
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "2" }, phase = CompilePhase.FINAL_CODE)
static void testArrayAtomicThenAtomicAtUnknownIndices(Outer[] a, Outer o, int index1, int index2) {
Common.outerArrayVarHandle.getAndSet(a, index1, o);
Common.outerArrayVarHandle.getAndSet(a, index2, o);
}
testConditionalStoreThenStore(Common.outer, Common.inner, ThreadLocalRandom.current().nextInt(0, 100));
testStoreThenCallThenStore(Common.outer, Common.inner);
}
@Test
! // TODO: 8353182
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAllocateThenAtomic(Inner i) {
Outer o = new Outer();
Common.blackhole(o);
Common.field1VarHandle.getAndSet(o, i);
}
@Test
! // TODO: 8329234
! //@IR(counts = { IRNode.Z_LOAD_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
+ // TODO: 8353182
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
static void testLoadThenAtomic(Outer o, Inner i) {
Common.blackhole(o.field1);
Common.field1VarHandle.getAndSet(o, i);
}
@Test
! // TODO: 8353182
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "2" }, phase = CompilePhase.FINAL_CODE)
static void testAtomicThenAtomicAnotherField(Outer o, Inner i) {
Common.field1VarHandle.getAndSet(o, i);
Common.field2VarHandle.getAndSet(o, i);
}
@Test
! // TODO: 8353182
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAllocateArrayThenAtomicAtKnownIndex(Outer o) {
Outer[] a = new Outer[42];
Common.blackhole(a);
Common.outerArrayVarHandle.getAndSet(a, 2, o);
}
@Test
! // TODO: 8353182
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAllocateArrayThenAtomicAtUnknownIndex(Outer o, int index) {
Outer[] a = new Outer[42];
Common.blackhole(a);
Common.outerArrayVarHandle.getAndSet(a, index, o);
}
@Test
! // TODO: 8353182
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "2" }, phase = CompilePhase.FINAL_CODE)
static void testArrayAtomicThenAtomicAtUnknownIndices(Outer[] a, Outer o, int index1, int index2) {
Common.outerArrayVarHandle.getAndSet(a, index1, o);
Common.outerArrayVarHandle.getAndSet(a, index2, o);
}
testStoreThenStoreInLoop(Common.outer, Common.inner);
}
@Test
@IR(counts = { IRNode.Z_STORE_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.ELIDED, "1" }, phase = CompilePhase.FINAL_CODE)
static void testStoreThenAtomic(Outer o, Inner i) {
o.field1 = i;
Common.field1VarHandle.getAndSet(o, i);
}
@Test
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
@IR(counts = { IRNode.Z_LOAD_P_WITH_BARRIER_FLAG, Common.ELIDED, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAtomicThenLoad(Outer o, Inner i) {
Common.field1VarHandle.getAndSet(o, i);
Common.blackhole(o.field1);
}
@Test
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
@IR(counts = { IRNode.Z_STORE_P_WITH_BARRIER_FLAG, Common.ELIDED, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAtomicThenStore(Outer o, Inner i) {
Common.field1VarHandle.getAndSet(o, i);
o.field1 = i;
}
@Test
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.ELIDED, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAtomicThenAtomic(Outer o, Inner i) {
Common.field1VarHandle.getAndSet(o, i);
Common.field1VarHandle.getAndSet(o, i);
}
@Test
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
! @IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.ELIDED, "1" }, phase = CompilePhase.FINAL_CODE)
static void testArrayAtomicThenAtomic(Outer[] a, Outer o) {
Common.outerArrayVarHandle.getAndSet(a, 0, o);
Common.outerArrayVarHandle.getAndSet(a, 0, o);
}
testStoreThenStoreInLoop(Common.outer, Common.inner);
}
@Test
@IR(counts = { IRNode.Z_STORE_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
! // TODO: 8353182
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.ELIDED, "1" }, phase = CompilePhase.FINAL_CODE)
static void testStoreThenAtomic(Outer o, Inner i) {
o.field1 = i;
Common.field1VarHandle.getAndSet(o, i);
}
@Test
! // TODO: 8353182
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
@IR(counts = { IRNode.Z_LOAD_P_WITH_BARRIER_FLAG, Common.ELIDED, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAtomicThenLoad(Outer o, Inner i) {
Common.field1VarHandle.getAndSet(o, i);
Common.blackhole(o.field1);
}
@Test
! // TODO: 8353182
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
@IR(counts = { IRNode.Z_STORE_P_WITH_BARRIER_FLAG, Common.ELIDED, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAtomicThenStore(Outer o, Inner i) {
Common.field1VarHandle.getAndSet(o, i);
o.field1 = i;
}
@Test
! // TODO: 8353182
! //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.ELIDED, "1" }, phase = CompilePhase.FINAL_CODE)
static void testAtomicThenAtomic(Outer o, Inner i) {
Common.field1VarHandle.getAndSet(o, i);
Common.field1VarHandle.getAndSet(o, i);
}
@Test
! // TODO: 8353182
! //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.REMAINING, "1" }, phase = CompilePhase.FINAL_CODE)
+ //@IR(counts = { IRNode.Z_GET_AND_SET_P_WITH_BARRIER_FLAG, Common.ELIDED, "1" }, phase = CompilePhase.FINAL_CODE)
static void testArrayAtomicThenAtomic(Outer[] a, Outer o) {
Common.outerArrayVarHandle.getAndSet(a, 0, o);
Common.outerArrayVarHandle.getAndSet(a, 0, o);
}
< prev index next >