From 66c6d7bdfdd535e6ecf4461bba3804f1a7794fcd Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Thu, 16 Oct 2014 15:41:48 +0100 Subject: 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 --- compiler/driver/compiler_driver.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'compiler/driver/compiler_driver.cc') diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index a60c5bc98e..eb5739f3e4 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -1094,11 +1094,17 @@ bool CompilerDriver::ComputeStaticFieldInfo(uint32_t field_idx, const DexCompila if (resolved_field != nullptr && referrer_class != nullptr) { *is_volatile = IsFieldVolatile(resolved_field); std::pair fast_path = IsFastStaticField( - dex_cache, referrer_class, resolved_field, field_idx, field_offset, - storage_index, is_referrers_class, is_initialized); + dex_cache, referrer_class, resolved_field, field_idx, storage_index); result = is_put ? fast_path.second : fast_path.first; } - if (!result) { + if (result) { + *field_offset = GetFieldOffset(resolved_field); + *is_referrers_class = IsStaticFieldInReferrerClass(referrer_class, resolved_field); + // *is_referrers_class == true implies no worrying about class initialization. + *is_initialized = (*is_referrers_class) || + (IsStaticFieldsClassInitialized(referrer_class, resolved_field) && + CanAssumeTypeIsPresentInDexCache(*mUnit->GetDexFile(), *storage_index)); + } else { // Conservative defaults. *is_volatile = true; *field_offset = MemberOffset(static_cast(-1)); -- cgit v1.2.3-59-g8ed1b