diff options
author | 2022-04-14 10:48:44 +0100 | |
---|---|---|
committer | 2022-04-21 19:25:34 +0000 | |
commit | 9d31daa0b3f8e748a19555870932bace11f2b199 (patch) | |
tree | c7ebac1e626dd11e72767af1174b68f8fea9dfa9 /compiler/optimizing/intrinsics_utils.h | |
parent | 5e50df52091b199e5fb096bc90b8c5ed3bcc719f (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.h | 23 |
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_ |