summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Santiago Aboy Solanes <solanes@google.com> 2023-11-21 15:19:17 +0000
committer Santiago Aboy Solanes <solanes@google.com> 2023-11-22 17:40:42 +0000
commit8740b1b17254c3927b77d292bed8c2c3ec4e9c43 (patch)
tree38f87b177a728c4613475e6e80788dc2dd965403
parent8925084706b544e93c817432d44b24b25a4bd1b7 (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.h1
-rw-r--r--compiler/optimizing/intrinsics_arm64.cc6
-rw-r--r--compiler/optimizing/intrinsics_arm_vixl.cc6
-rw-r--r--compiler/optimizing/intrinsics_utils.h1
-rw-r--r--compiler/optimizing/intrinsics_x86.cc8
-rw-r--r--compiler/optimizing/intrinsics_x86_64.cc7
-rw-r--r--runtime/hidden_api.h1
-rw-r--r--runtime/intrinsics_list.h1
-rw-r--r--test/2235-JdkUnsafeTest/src/Main.java25
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 {