summaryrefslogtreecommitdiff
path: root/compiler/optimizing/intrinsics_utils.h
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2022-04-14 10:48:44 +0100
committer Vladimir Marko <vmarko@google.com> 2022-04-21 19:25:34 +0000
commit9d31daa0b3f8e748a19555870932bace11f2b199 (patch)
treec7ebac1e626dd11e72767af1174b68f8fea9dfa9 /compiler/optimizing/intrinsics_utils.h
parent5e50df52091b199e5fb096bc90b8c5ed3bcc719f (diff)
Avoid VarHandle checks for boot image field VarHandles.
And use the field offset as seen at compile time. Implemented for x86-64, arm and arm64 but not for x86 with incomplete set of `VarHandle` intrinsics. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 191765508 Change-Id: If68b0287c8823e69c493dcefb7e61dc34d69fb4f
Diffstat (limited to 'compiler/optimizing/intrinsics_utils.h')
-rw-r--r--compiler/optimizing/intrinsics_utils.h23
1 files changed, 23 insertions, 0 deletions
diff --git a/compiler/optimizing/intrinsics_utils.h b/compiler/optimizing/intrinsics_utils.h
index f24454786e..19f5e332a8 100644
--- a/compiler/optimizing/intrinsics_utils.h
+++ b/compiler/optimizing/intrinsics_utils.h
@@ -19,6 +19,7 @@
#include "base/casts.h"
#include "base/macros.h"
+#include "class_root-inl.h"
#include "code_generator.h"
#include "data_type-inl.h"
#include "dex/dex_file-inl.h"
@@ -196,6 +197,28 @@ static inline DataType::Type GetVarHandleExpectedValueType(HInvoke* invoke,
}
}
+static inline ArtField* GetBootImageVarHandleField(HInvoke* invoke)
+ REQUIRES_SHARED(Locks::mutator_lock_) {
+ DCHECK_LE(GetExpectedVarHandleCoordinatesCount(invoke), 1u);
+ DCHECK(VarHandleOptimizations(invoke).GetUseKnownBootImageVarHandle());
+ HInstruction* var_handle_instruction = invoke->InputAt(0);
+ if (var_handle_instruction->IsNullCheck()) {
+ var_handle_instruction = var_handle_instruction->InputAt(0);
+ }
+ DCHECK(var_handle_instruction->IsStaticFieldGet());
+ ArtField* field = var_handle_instruction->AsStaticFieldGet()->GetFieldInfo().GetField();
+ DCHECK(field->IsStatic());
+ DCHECK(field->IsFinal());
+ DCHECK(var_handle_instruction->InputAt(0)->AsLoadClass()->IsInBootImage());
+ ObjPtr<mirror::Object> var_handle = field->GetObject(field->GetDeclaringClass());
+ DCHECK(var_handle->GetClass() ==
+ (GetExpectedVarHandleCoordinatesCount(invoke) == 0u
+ ? GetClassRoot<mirror::StaticFieldVarHandle>()
+ : GetClassRoot<mirror::FieldVarHandle>()));
+ static_assert(std::is_base_of_v<mirror::FieldVarHandle, mirror::StaticFieldVarHandle>);
+ return ObjPtr<mirror::FieldVarHandle>::DownCast(var_handle)->GetArtField();
+}
+
} // namespace art
#endif // ART_COMPILER_OPTIMIZING_INTRINSICS_UTILS_H_