diff options
| author | 2014-10-16 15:41:48 +0100 | |
|---|---|---|
| committer | 2014-10-27 10:04:25 +0000 | |
| commit | 66c6d7bdfdd535e6ecf4461bba3804f1a7794fcd (patch) | |
| tree | 178908b5c657241305f99aa44949427c18d1900a /compiler/driver/compiler_driver-inl.h | |
| parent | 1ef3495abfa2a858b3cc7a1844383c8e7dff0b60 (diff) | |
Rewrite class initialization check elimination.
Split the notion of type being in dex cache away from the
class being initialized. Include static invokes in the class
initialization elimination pass.
Change-Id: Ie3760d8fd55b987f9507f32ef51456a57d79e3fb
Diffstat (limited to 'compiler/driver/compiler_driver-inl.h')
| -rw-r--r-- | compiler/driver/compiler_driver-inl.h | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/compiler/driver/compiler_driver-inl.h b/compiler/driver/compiler_driver-inl.h index 332556853c..1805d59961 100644 --- a/compiler/driver/compiler_driver-inl.h +++ b/compiler/driver/compiler_driver-inl.h @@ -93,6 +93,10 @@ inline bool CompilerDriver::IsFieldVolatile(mirror::ArtField* field) { return field->IsVolatile(); } +inline MemberOffset CompilerDriver::GetFieldOffset(mirror::ArtField* field) { + return field->GetOffset(); +} + inline std::pair<bool, bool> CompilerDriver::IsFastInstanceField( mirror::DexCache* dex_cache, mirror::Class* referrer_class, mirror::ArtField* resolved_field, uint16_t field_idx) { @@ -107,16 +111,12 @@ inline std::pair<bool, bool> CompilerDriver::IsFastInstanceField( inline std::pair<bool, bool> CompilerDriver::IsFastStaticField( mirror::DexCache* dex_cache, mirror::Class* referrer_class, - mirror::ArtField* resolved_field, uint16_t field_idx, MemberOffset* field_offset, - uint32_t* storage_index, bool* is_referrers_class, bool* is_initialized) { + mirror::ArtField* resolved_field, uint16_t field_idx, uint32_t* storage_index) { DCHECK(resolved_field->IsStatic()); if (LIKELY(referrer_class != nullptr)) { mirror::Class* fields_class = resolved_field->GetDeclaringClass(); if (fields_class == referrer_class) { - *field_offset = resolved_field->GetOffset(); *storage_index = fields_class->GetDexTypeIndex(); - *is_referrers_class = true; // implies no worrying about class initialization - *is_initialized = true; return std::make_pair(true, true); } if (referrer_class->CanAccessResolvedField(fields_class, resolved_field, @@ -148,23 +148,30 @@ inline std::pair<bool, bool> CompilerDriver::IsFastStaticField( } } if (storage_idx != DexFile::kDexNoIndex) { - *field_offset = resolved_field->GetOffset(); *storage_index = storage_idx; - *is_referrers_class = false; - *is_initialized = fields_class->IsInitialized() && - CanAssumeTypeIsPresentInDexCache(*dex_file, storage_idx); return std::make_pair(true, !resolved_field->IsFinal()); } } } // Conservative defaults. - *field_offset = MemberOffset(0u); *storage_index = DexFile::kDexNoIndex; - *is_referrers_class = false; - *is_initialized = false; return std::make_pair(false, false); } +inline bool CompilerDriver::IsStaticFieldInReferrerClass(mirror::Class* referrer_class, + mirror::ArtField* resolved_field) { + DCHECK(resolved_field->IsStatic()); + mirror::Class* fields_class = resolved_field->GetDeclaringClass(); + return referrer_class == fields_class; +} + +inline bool CompilerDriver::IsStaticFieldsClassInitialized(mirror::Class* referrer_class, + mirror::ArtField* resolved_field) { + DCHECK(resolved_field->IsStatic()); + mirror::Class* fields_class = resolved_field->GetDeclaringClass(); + return fields_class == referrer_class || fields_class->IsInitialized(); +} + inline mirror::ArtMethod* CompilerDriver::ResolveMethod( ScopedObjectAccess& soa, Handle<mirror::DexCache> dex_cache, Handle<mirror::ClassLoader> class_loader, const DexCompilationUnit* mUnit, @@ -312,14 +319,13 @@ inline int CompilerDriver::IsFastInvoke( return stats_flags; } -inline bool CompilerDriver::NeedsClassInitialization(mirror::Class* referrer_class, - mirror::ArtMethod* resolved_method) { +inline bool CompilerDriver::IsMethodsClassInitialized(mirror::Class* referrer_class, + mirror::ArtMethod* resolved_method) { if (!resolved_method->IsStatic()) { - return false; + return true; } mirror::Class* methods_class = resolved_method->GetDeclaringClass(); - // NOTE: Unlike in IsFastStaticField(), we don't check CanAssumeTypeIsPresentInDexCache() here. - return methods_class != referrer_class && !methods_class->IsInitialized(); + return methods_class == referrer_class || methods_class->IsInitialized(); } } // namespace art |