diff options
author | 2023-11-21 15:19:17 +0000 | |
---|---|---|
committer | 2023-11-22 17:40:42 +0000 | |
commit | 8740b1b17254c3927b77d292bed8c2c3ec4e9c43 (patch) | |
tree | 38f87b177a728c4613475e6e80788dc2dd965403 | |
parent | 8925084706b544e93c817432d44b24b25a4bd1b7 (diff) |
Add intrinsic support for CompareAndSetReference
It replaced CompareAndSetObject in aosp/2319000
Bug: 310002432
Fixes: 310002432
Test: art/test/testrunner/testrunner.py --host --64 --optimizing -b
Change-Id: I4cbea0c9c4ece8e34b8d31d8f0d8fa76da3e0793
-rw-r--r-- | compiler/optimizing/code_generator_riscv64.h | 1 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_arm64.cc | 6 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_arm_vixl.cc | 6 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_utils.h | 1 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_x86.cc | 8 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_x86_64.cc | 7 | ||||
-rw-r--r-- | runtime/hidden_api.h | 1 | ||||
-rw-r--r-- | runtime/intrinsics_list.h | 1 | ||||
-rw-r--r-- | test/2235-JdkUnsafeTest/src/Main.java | 25 |
9 files changed, 56 insertions, 0 deletions
diff --git a/compiler/optimizing/code_generator_riscv64.h b/compiler/optimizing/code_generator_riscv64.h index b5407d8f50..b0930fb137 100644 --- a/compiler/optimizing/code_generator_riscv64.h +++ b/compiler/optimizing/code_generator_riscv64.h @@ -126,6 +126,7 @@ static constexpr int32_t kFClassNaNMinValue = 0x100; V(JdkUnsafeCompareAndSetInt) \ V(JdkUnsafeCompareAndSetLong) \ V(JdkUnsafeCompareAndSetObject) \ + V(JdkUnsafeCompareAndSetReference) \ V(JdkUnsafeGet) \ V(JdkUnsafeGetVolatile) \ V(JdkUnsafeGetAcquire) \ diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc index 92e7c13c6d..f85461a95c 100644 --- a/compiler/optimizing/intrinsics_arm64.cc +++ b/compiler/optimizing/intrinsics_arm64.cc @@ -1551,6 +1551,9 @@ void IntrinsicLocationsBuilderARM64::VisitJdkUnsafeCompareAndSetObject(HInvoke* } } } +void IntrinsicLocationsBuilderARM64::VisitJdkUnsafeCompareAndSetReference(HInvoke* invoke) { + VisitJdkUnsafeCompareAndSetObject(invoke); +} void IntrinsicCodeGeneratorARM64::VisitUnsafeCASInt(HInvoke* invoke) { VisitJdkUnsafeCASInt(invoke); @@ -1587,6 +1590,9 @@ void IntrinsicCodeGeneratorARM64::VisitJdkUnsafeCompareAndSetObject(HInvoke* inv GenUnsafeCas(invoke, DataType::Type::kReference, codegen_); } +void IntrinsicCodeGeneratorARM64::VisitJdkUnsafeCompareAndSetReference(HInvoke* invoke) { + VisitJdkUnsafeCompareAndSetObject(invoke); +} enum class GetAndUpdateOp { kSet, diff --git a/compiler/optimizing/intrinsics_arm_vixl.cc b/compiler/optimizing/intrinsics_arm_vixl.cc index 992f2f4754..b244fe7f7c 100644 --- a/compiler/optimizing/intrinsics_arm_vixl.cc +++ b/compiler/optimizing/intrinsics_arm_vixl.cc @@ -3797,6 +3797,9 @@ void IntrinsicLocationsBuilderARMVIXL::VisitJdkUnsafeCompareAndSetObject(HInvoke CreateUnsafeCASLocations(allocator_, invoke, codegen_); } +void IntrinsicLocationsBuilderARMVIXL::VisitJdkUnsafeCompareAndSetReference(HInvoke* invoke) { + VisitJdkUnsafeCompareAndSetObject(invoke); +} void IntrinsicCodeGeneratorARMVIXL::VisitUnsafeCASInt(HInvoke* invoke) { VisitJdkUnsafeCASInt(invoke); @@ -3823,6 +3826,9 @@ void IntrinsicCodeGeneratorARMVIXL::VisitJdkUnsafeCompareAndSetObject(HInvoke* i GenUnsafeCas(invoke, DataType::Type::kReference, codegen_); } +void IntrinsicCodeGeneratorARMVIXL::VisitJdkUnsafeCompareAndSetReference(HInvoke* invoke) { + VisitJdkUnsafeCompareAndSetObject(invoke); +} enum class GetAndUpdateOp { kSet, diff --git a/compiler/optimizing/intrinsics_utils.h b/compiler/optimizing/intrinsics_utils.h index 13cabdafed..41e109b587 100644 --- a/compiler/optimizing/intrinsics_utils.h +++ b/compiler/optimizing/intrinsics_utils.h @@ -171,6 +171,7 @@ static inline bool IsUnsafeCASObject(HInvoke* invoke) { case Intrinsics::kUnsafeCASObject: case Intrinsics::kJdkUnsafeCASObject: case Intrinsics::kJdkUnsafeCompareAndSetObject: + case Intrinsics::kJdkUnsafeCompareAndSetReference: return true; default: return false; diff --git a/compiler/optimizing/intrinsics_x86.cc b/compiler/optimizing/intrinsics_x86.cc index 288f264003..eb50170a84 100644 --- a/compiler/optimizing/intrinsics_x86.cc +++ b/compiler/optimizing/intrinsics_x86.cc @@ -2187,6 +2187,10 @@ void IntrinsicLocationsBuilderX86::VisitJdkUnsafeCompareAndSetObject(HInvoke* in CreateIntIntIntIntIntToInt(allocator_, codegen_, DataType::Type::kReference, invoke); } +void IntrinsicLocationsBuilderX86::VisitJdkUnsafeCompareAndSetReference(HInvoke* invoke) { + VisitJdkUnsafeCompareAndSetObject(invoke); +} + static void GenPrimitiveLockedCmpxchg(DataType::Type type, CodeGeneratorX86* codegen, Location expected_value, @@ -2453,6 +2457,10 @@ void IntrinsicCodeGeneratorX86::VisitJdkUnsafeCompareAndSetObject(HInvoke* invok GenCAS(DataType::Type::kReference, invoke, codegen_); } +void IntrinsicCodeGeneratorX86::VisitJdkUnsafeCompareAndSetReference(HInvoke* invoke) { + VisitJdkUnsafeCompareAndSetObject(invoke); +} + void IntrinsicLocationsBuilderX86::VisitIntegerReverse(HInvoke* invoke) { LocationSummary* locations = new (allocator_) LocationSummary(invoke, LocationSummary::kNoCall, kIntrinsified); diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc index 4b8c722725..7f88ee6a1e 100644 --- a/compiler/optimizing/intrinsics_x86_64.cc +++ b/compiler/optimizing/intrinsics_x86_64.cc @@ -2307,6 +2307,9 @@ void IntrinsicLocationsBuilderX86_64::VisitJdkUnsafeCompareAndSetObject(HInvoke* CreateUnsafeCASLocations(allocator_, invoke, codegen_, DataType::Type::kReference); } +void IntrinsicLocationsBuilderX86_64::VisitJdkUnsafeCompareAndSetReference(HInvoke* invoke) { + VisitJdkUnsafeCompareAndSetObject(invoke); +} // Convert ZF into the Boolean result. static inline void GenZFlagToResult(X86_64Assembler* assembler, CpuRegister out) { @@ -2632,6 +2635,10 @@ void IntrinsicCodeGeneratorX86_64::VisitJdkUnsafeCompareAndSetObject(HInvoke* in GenCAS(DataType::Type::kReference, invoke, codegen_); } +void IntrinsicCodeGeneratorX86_64::VisitJdkUnsafeCompareAndSetReference(HInvoke* invoke) { + VisitJdkUnsafeCompareAndSetObject(invoke); +} + void IntrinsicLocationsBuilderX86_64::VisitIntegerReverse(HInvoke* invoke) { LocationSummary* locations = new (allocator_) LocationSummary(invoke, LocationSummary::kNoCall, kIntrinsified); diff --git a/runtime/hidden_api.h b/runtime/hidden_api.h index 281c1f3cb3..68a513a3bd 100644 --- a/runtime/hidden_api.h +++ b/runtime/hidden_api.h @@ -332,6 +332,7 @@ ALWAYS_INLINE inline uint32_t GetRuntimeFlags(ArtMethod* method) case Intrinsics::kJdkUnsafeCompareAndSetInt: case Intrinsics::kJdkUnsafeCompareAndSetLong: case Intrinsics::kJdkUnsafeCompareAndSetObject: + case Intrinsics::kJdkUnsafeCompareAndSetReference: case Intrinsics::kJdkUnsafeGetAndAddInt: case Intrinsics::kJdkUnsafeGetAndAddLong: case Intrinsics::kJdkUnsafeGetAndSetInt: diff --git a/runtime/intrinsics_list.h b/runtime/intrinsics_list.h index 9e9bfbc825..5e2b63b230 100644 --- a/runtime/intrinsics_list.h +++ b/runtime/intrinsics_list.h @@ -244,6 +244,7 @@ V(JdkUnsafeCompareAndSetInt, kVirtual, kNeedsEnvironment, kAllSideEffects, kCanThrow, "Ljdk/internal/misc/Unsafe;", "compareAndSetInt", "(Ljava/lang/Object;JII)Z") \ V(JdkUnsafeCompareAndSetLong, kVirtual, kNeedsEnvironment, kAllSideEffects, kCanThrow, "Ljdk/internal/misc/Unsafe;", "compareAndSetLong", "(Ljava/lang/Object;JJJ)Z") \ V(JdkUnsafeCompareAndSetObject, kVirtual, kNeedsEnvironment, kAllSideEffects, kCanThrow, "Ljdk/internal/misc/Unsafe;", "compareAndSetObject", "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z") \ + V(JdkUnsafeCompareAndSetReference, kVirtual, kNeedsEnvironment, kAllSideEffects, kCanThrow, "Ljdk/internal/misc/Unsafe;", "compareAndSetReference", "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z") \ V(JdkUnsafeGet, kVirtual, kNeedsEnvironment, kAllSideEffects, kCanThrow, "Ljdk/internal/misc/Unsafe;", "getInt", "(Ljava/lang/Object;J)I") \ V(JdkUnsafeGetVolatile, kVirtual, kNeedsEnvironment, kAllSideEffects, kCanThrow, "Ljdk/internal/misc/Unsafe;", "getIntVolatile", "(Ljava/lang/Object;J)I") \ V(JdkUnsafeGetAcquire, kVirtual, kNeedsEnvironment, kAllSideEffects, kCanThrow, "Ljdk/internal/misc/Unsafe;", "getIntAcquire", "(Ljava/lang/Object;J)I") \ diff --git a/test/2235-JdkUnsafeTest/src/Main.java b/test/2235-JdkUnsafeTest/src/Main.java index ad6202a06a..7cb88b1d76 100644 --- a/test/2235-JdkUnsafeTest/src/Main.java +++ b/test/2235-JdkUnsafeTest/src/Main.java @@ -303,6 +303,31 @@ public class Main { System.out.println("Unexpectedly not succeeding compareAndSetObject(t, objectOffset, 1, 1)"); } check(t.objectVar, objectValue3, "Unsafe.compareAndSetObject(Object, long, Object, Object) - gets set to same"); + + // Reset and now try with `compareAndSetReference` which replaced `compareAndSetObject`. + unsafe.putObject(t, objectOffset, objectValue); + + if (unsafe.compareAndSetReference(t, objectOffset, new Object(), new Object())) { + System.out.println("Unexpectedly succeeding compareAndSetReference(t, objectOffset, 0, 1)"); + } + check(t.objectVar, objectValue, "Unsafe.compareAndSetReference(Object, long, Object, Object) - not set"); + objectValue2 = new Object(); + if (!unsafe.compareAndSetReference(t, objectOffset, objectValue, objectValue2)) { + System.out.println( + "Unexpectedly not succeeding compareAndSetReference(t, objectOffset, objectValue, 0)"); + } + check(t.objectVar, objectValue2, "Unsafe.compareAndSetReference(Object, long, Object, Object) - gets set"); + objectValue3 = new Object(); + if (!unsafe.compareAndSetReference(t, objectOffset, objectValue2, objectValue3)) { + System.out.println("Unexpectedly not succeeding compareAndSetReference(t, objectOffset, 0, 1)"); + } + check(t.objectVar, objectValue3, "Unsafe.compareAndSetReference(Object, long, Object, Object) - gets re-set"); + // Exercise jdk.internal.misc.Unsafe.compareAndSetReference using the same + // object for the `expectedValue` and `newValue` arguments. + if (!unsafe.compareAndSetReference(t, objectOffset, objectValue3, objectValue3)) { + System.out.println("Unexpectedly not succeeding compareAndSetReference(t, objectOffset, 1, 1)"); + } + check(t.objectVar, objectValue3, "Unsafe.compareAndSetReference(Object, long, Object, Object) - gets set to same"); } private static void testGetAndPutVolatile(Unsafe unsafe) throws NoSuchFieldException { |