Clean up debug checks in intrinsic code.
Deduplicate checks that were repeated for all ISAs, use a few helper
functions to make the code simpler.
Bug: 71781600
Test: art/test.py -r --host
Test: art/test.py -r --target
Change-Id: I3fefecce98a9a8b3b9bf53c31c2eefdafe8bd6a3
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc
index c49611a..548b2d4 100644
--- a/compiler/optimizing/code_generator_arm64.cc
+++ b/compiler/optimizing/code_generator_arm64.cc
@@ -36,6 +36,7 @@
#include "interpreter/mterp/nterp.h"
#include "intrinsics.h"
#include "intrinsics_arm64.h"
+#include "intrinsics_utils.h"
#include "linker/linker_patch.h"
#include "lock_word.h"
#include "mirror/array-inl.h"
@@ -672,30 +673,16 @@
"art::mirror::HeapReference<art::mirror::Object> and int32_t have different sizes.");
__ Add(index_reg, index_reg, Operand(offset_));
} else {
- // In the case of the UnsafeGetObject/UnsafeGetObjectVolatile/VarHandleGet
- // intrinsics, `index_` is not shifted by a scale factor of 2
- // (as in the case of ArrayGet), as it is actually an offset
- // to an object field within an object.
+ // In the case of the following intrinsics `index_` is not shifted by a scale factor of 2
+ // (as in the case of ArrayGet), as it is actually an offset to an object field within an
+ // object.
DCHECK(instruction_->IsInvoke()) << instruction_->DebugName();
DCHECK(instruction_->GetLocations()->Intrinsified());
- Intrinsics intrinsic = instruction_->AsInvoke()->GetIntrinsic();
- DCHECK(intrinsic == Intrinsics::kUnsafeGetObject ||
- intrinsic == Intrinsics::kUnsafeGetObjectVolatile ||
- intrinsic == Intrinsics::kUnsafeCASObject ||
- intrinsic == Intrinsics::kJdkUnsafeGetObject ||
- intrinsic == Intrinsics::kJdkUnsafeGetObjectVolatile ||
- intrinsic == Intrinsics::kJdkUnsafeGetObjectAcquire ||
- intrinsic == Intrinsics::kJdkUnsafeCASObject ||
- intrinsic == Intrinsics::kJdkUnsafeCompareAndSetObject ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) ==
- mirror::VarHandle::AccessModeTemplate::kGet ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) ==
- mirror::VarHandle::AccessModeTemplate::kCompareAndSet ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) ==
- mirror::VarHandle::AccessModeTemplate::kCompareAndExchange ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) ==
- mirror::VarHandle::AccessModeTemplate::kGetAndUpdate)
- << instruction_->AsInvoke()->GetIntrinsic();
+ HInvoke* invoke = instruction_->AsInvoke();
+ DCHECK(IsUnsafeGetObject(invoke) ||
+ IsVarHandleGet(invoke) ||
+ IsUnsafeCASObject(invoke) ||
+ IsVarHandleCASFamily(invoke)) << invoke->GetIntrinsic();
DCHECK_EQ(offset_, 0u);
DCHECK(index_.IsRegister());
}
diff --git a/compiler/optimizing/code_generator_arm_vixl.cc b/compiler/optimizing/code_generator_arm_vixl.cc
index 841d59b..bafa89f 100644
--- a/compiler/optimizing/code_generator_arm_vixl.cc
+++ b/compiler/optimizing/code_generator_arm_vixl.cc
@@ -34,6 +34,7 @@
#include "interpreter/mterp/nterp.h"
#include "intrinsics.h"
#include "intrinsics_arm_vixl.h"
+#include "intrinsics_utils.h"
#include "linker/linker_patch.h"
#include "mirror/array-inl.h"
#include "mirror/class-inl.h"
@@ -832,27 +833,14 @@
"art::mirror::HeapReference<art::mirror::Object> and int32_t have different sizes.");
__ Add(index_reg, index_reg, offset_);
} else {
- // In the case of the UnsafeGetObject/UnsafeGetObjectVolatile
- // intrinsics, `index_` is not shifted by a scale factor of 2
- // (as in the case of ArrayGet), as it is actually an offset
- // to an object field within an object.
+ // In the case of the following intrinsics `index_` is not shifted by a scale factor of 2
+ // (as in the case of ArrayGet), as it is actually an offset to an object field within an
+ // object.
DCHECK(instruction_->IsInvoke()) << instruction_->DebugName();
DCHECK(instruction_->GetLocations()->Intrinsified());
- Intrinsics intrinsic = instruction_->AsInvoke()->GetIntrinsic();
- DCHECK(intrinsic == Intrinsics::kUnsafeGetObject ||
- intrinsic == Intrinsics::kUnsafeGetObjectVolatile ||
- intrinsic == Intrinsics::kJdkUnsafeGetObject ||
- intrinsic == Intrinsics::kJdkUnsafeGetObjectVolatile ||
- intrinsic == Intrinsics::kJdkUnsafeGetObjectAcquire ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) ==
- mirror::VarHandle::AccessModeTemplate::kGet ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) ==
- mirror::VarHandle::AccessModeTemplate::kCompareAndSet ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) ==
- mirror::VarHandle::AccessModeTemplate::kCompareAndExchange ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) ==
- mirror::VarHandle::AccessModeTemplate::kGetAndUpdate)
- << instruction_->AsInvoke()->GetIntrinsic();
+ HInvoke* invoke = instruction_->AsInvoke();
+ DCHECK(IsUnsafeGetObject(invoke) || IsVarHandleGet(invoke) || IsVarHandleCASFamily(invoke))
+ << invoke->GetIntrinsic();
DCHECK_EQ(offset_, 0U);
// Though UnsafeGet's offset location is a register pair, we only pass the low
// part (high part is irrelevant for 32-bit addresses) to the slow path.
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc
index 8bd51b3..0efd51c 100644
--- a/compiler/optimizing/code_generator_x86.cc
+++ b/compiler/optimizing/code_generator_x86.cc
@@ -28,6 +28,7 @@
#include "heap_poisoning.h"
#include "interpreter/mterp/nterp.h"
#include "intrinsics.h"
+#include "intrinsics_utils.h"
#include "intrinsics_x86.h"
#include "jit/profiling_info.h"
#include "linker/linker_patch.h"
@@ -579,19 +580,8 @@
DCHECK((instruction_->IsInvoke() && instruction_->GetLocations()->Intrinsified()))
<< "Unexpected instruction in read barrier marking and field updating slow path: "
<< instruction_->DebugName();
- DCHECK(instruction_->GetLocations()->Intrinsified());
- Intrinsics intrinsic = instruction_->AsInvoke()->GetIntrinsic();
- static constexpr auto kVarHandleCAS = mirror::VarHandle::AccessModeTemplate::kCompareAndSet;
- static constexpr auto kVarHandleGetAndSet =
- mirror::VarHandle::AccessModeTemplate::kGetAndUpdate;
- static constexpr auto kVarHandleCAX =
- mirror::VarHandle::AccessModeTemplate::kCompareAndExchange;
- DCHECK(intrinsic == Intrinsics::kUnsafeCASObject ||
- intrinsic == Intrinsics::kJdkUnsafeCASObject ||
- intrinsic == Intrinsics::kJdkUnsafeCompareAndSetObject ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) == kVarHandleCAS ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) == kVarHandleGetAndSet ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) == kVarHandleCAX);
+ HInvoke* invoke = instruction_->AsInvoke();
+ DCHECK(IsUnsafeCASObject(invoke) || IsVarHandleCASFamily(invoke)) << invoke->GetIntrinsic();
__ Bind(GetEntryLabel());
if (unpoison_ref_before_marking_) {
diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc
index 0febe11..1016652 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -28,6 +28,7 @@
#include "heap_poisoning.h"
#include "interpreter/mterp/nterp.h"
#include "intrinsics.h"
+#include "intrinsics_utils.h"
#include "intrinsics_x86_64.h"
#include "jit/profiling_info.h"
#include "linker/linker_patch.h"
@@ -599,18 +600,8 @@
DCHECK((instruction_->IsInvoke() && instruction_->GetLocations()->Intrinsified()))
<< "Unexpected instruction in read barrier marking and field updating slow path: "
<< instruction_->DebugName();
- DCHECK(instruction_->GetLocations()->Intrinsified());
- Intrinsics intrinsic = instruction_->AsInvoke()->GetIntrinsic();
- static constexpr auto kVarHandleCAS = mirror::VarHandle::AccessModeTemplate::kCompareAndSet;
- static constexpr auto kVarHandleCAX =
- mirror::VarHandle::AccessModeTemplate::kCompareAndExchange;
- static constexpr auto kVarHandleGAU = mirror::VarHandle::AccessModeTemplate::kGetAndUpdate;
- DCHECK(intrinsic == Intrinsics::kUnsafeCASObject ||
- intrinsic == Intrinsics::kJdkUnsafeCASObject ||
- intrinsic == Intrinsics::kJdkUnsafeCompareAndSetObject ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) == kVarHandleCAS ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) == kVarHandleCAX ||
- mirror::VarHandle::GetAccessModeTemplateByIntrinsic(intrinsic) == kVarHandleGAU);
+ HInvoke* invoke = instruction_->AsInvoke();
+ DCHECK(IsUnsafeCASObject(invoke) || IsVarHandleCASFamily(invoke)) << invoke->GetIntrinsic();
__ Bind(GetEntryLabel());
if (unpoison_ref_before_marking_) {
diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc
index 0236f0d..f2bfcfe 100644
--- a/compiler/optimizing/intrinsics_arm64.cc
+++ b/compiler/optimizing/intrinsics_arm64.cc
@@ -1096,10 +1096,7 @@
}
static void CreateUnsafeCASLocations(ArenaAllocator* allocator, HInvoke* invoke) {
- bool can_call = kEmitCompilerReadBarrier &&
- (invoke->GetIntrinsic() == Intrinsics::kUnsafeCASObject ||
- invoke->GetIntrinsic() == Intrinsics::kJdkUnsafeCASObject ||
- invoke->GetIntrinsic() == Intrinsics::kJdkUnsafeCompareAndSetObject);
+ const bool can_call = kEmitCompilerReadBarrier && IsUnsafeCASObject(invoke);
LocationSummary* locations =
new (allocator) LocationSummary(invoke,
can_call
diff --git a/compiler/optimizing/intrinsics_arm_vixl.cc b/compiler/optimizing/intrinsics_arm_vixl.cc
index 303ac17..9d01757 100644
--- a/compiler/optimizing/intrinsics_arm_vixl.cc
+++ b/compiler/optimizing/intrinsics_arm_vixl.cc
@@ -3654,10 +3654,7 @@
};
static void CreateUnsafeCASLocations(ArenaAllocator* allocator, HInvoke* invoke) {
- bool can_call = kEmitCompilerReadBarrier &&
- (invoke->GetIntrinsic() == Intrinsics::kUnsafeCASObject ||
- invoke->GetIntrinsic() == Intrinsics::kJdkUnsafeCASObject ||
- invoke->GetIntrinsic() == Intrinsics::kJdkUnsafeCompareAndSetObject);
+ const bool can_call = kEmitCompilerReadBarrier && IsUnsafeCASObject(invoke);
LocationSummary* locations =
new (allocator) LocationSummary(invoke,
can_call
diff --git a/compiler/optimizing/intrinsics_utils.h b/compiler/optimizing/intrinsics_utils.h
index 3713b32..f244547 100644
--- a/compiler/optimizing/intrinsics_utils.h
+++ b/compiler/optimizing/intrinsics_utils.h
@@ -146,6 +146,44 @@
}
}
+static inline bool IsVarHandleGet(HInvoke* invoke) {
+ mirror::VarHandle::AccessModeTemplate access_mode =
+ mirror::VarHandle::GetAccessModeTemplateByIntrinsic(invoke->GetIntrinsic());
+ return access_mode == mirror::VarHandle::AccessModeTemplate::kGet;
+}
+
+static inline bool IsUnsafeGetObject(HInvoke* invoke) {
+ switch (invoke->GetIntrinsic()) {
+ case Intrinsics::kUnsafeGetObject:
+ case Intrinsics::kUnsafeGetObjectVolatile:
+ case Intrinsics::kJdkUnsafeGetObject:
+ case Intrinsics::kJdkUnsafeGetObjectVolatile:
+ case Intrinsics::kJdkUnsafeGetObjectAcquire:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static inline bool IsUnsafeCASObject(HInvoke* invoke) {
+ switch (invoke->GetIntrinsic()) {
+ case Intrinsics::kUnsafeCASObject:
+ case Intrinsics::kJdkUnsafeCASObject:
+ case Intrinsics::kJdkUnsafeCompareAndSetObject:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static inline bool IsVarHandleCASFamily(HInvoke* invoke) {
+ mirror::VarHandle::AccessModeTemplate access_mode =
+ mirror::VarHandle::GetAccessModeTemplateByIntrinsic(invoke->GetIntrinsic());
+ return access_mode == mirror::VarHandle::AccessModeTemplate::kCompareAndSet ||
+ access_mode == mirror::VarHandle::AccessModeTemplate::kGetAndUpdate ||
+ access_mode == mirror::VarHandle::AccessModeTemplate::kCompareAndExchange;
+}
+
static inline DataType::Type GetVarHandleExpectedValueType(HInvoke* invoke,
size_t expected_coordinates_count) {
DCHECK_EQ(expected_coordinates_count, GetExpectedVarHandleCoordinatesCount(invoke));
diff --git a/compiler/optimizing/intrinsics_x86.cc b/compiler/optimizing/intrinsics_x86.cc
index 3a38864..98b3e49 100644
--- a/compiler/optimizing/intrinsics_x86.cc
+++ b/compiler/optimizing/intrinsics_x86.cc
@@ -2067,11 +2067,9 @@
static void CreateIntIntIntIntIntToInt(ArenaAllocator* allocator,
DataType::Type type,
HInvoke* invoke) {
- bool can_call = kEmitCompilerReadBarrier &&
- kUseBakerReadBarrier &&
- (invoke->GetIntrinsic() == Intrinsics::kUnsafeCASObject ||
- invoke->GetIntrinsic() == Intrinsics::kJdkUnsafeCASObject ||
- invoke->GetIntrinsic() == Intrinsics::kJdkUnsafeCompareAndSetObject);
+ const bool can_call = kEmitCompilerReadBarrier &&
+ kUseBakerReadBarrier &&
+ IsUnsafeCASObject(invoke);
LocationSummary* locations =
new (allocator) LocationSummary(invoke,
can_call
diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc
index e3be987..43147e0 100644
--- a/compiler/optimizing/intrinsics_x86_64.cc
+++ b/compiler/optimizing/intrinsics_x86_64.cc
@@ -2195,11 +2195,9 @@
static void CreateUnsafeCASLocations(ArenaAllocator* allocator,
DataType::Type type,
HInvoke* invoke) {
- bool can_call = kEmitCompilerReadBarrier &&
- kUseBakerReadBarrier &&
- (invoke->GetIntrinsic() == Intrinsics::kUnsafeCASObject ||
- invoke->GetIntrinsic() == Intrinsics::kJdkUnsafeCASObject ||
- invoke->GetIntrinsic() == Intrinsics::kJdkUnsafeCompareAndSetObject);
+ const bool can_call = kEmitCompilerReadBarrier &&
+ kUseBakerReadBarrier &&
+ IsUnsafeCASObject(invoke);
LocationSummary* locations =
new (allocator) LocationSummary(invoke,
can_call