From 9d31daa0b3f8e748a19555870932bace11f2b199 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Thu, 14 Apr 2022 10:48:44 +0100 Subject: 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 --- compiler/optimizing/intrinsics_utils.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'compiler/optimizing/intrinsics_utils.h') 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 var_handle = field->GetObject(field->GetDeclaringClass()); + DCHECK(var_handle->GetClass() == + (GetExpectedVarHandleCoordinatesCount(invoke) == 0u + ? GetClassRoot() + : GetClassRoot())); + static_assert(std::is_base_of_v); + return ObjPtr::DownCast(var_handle)->GetArtField(); +} + } // namespace art #endif // ART_COMPILER_OPTIMIZING_INTRINSICS_UTILS_H_ -- cgit v1.2.3-59-g8ed1b