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
diff --git a/compiler/dex/mir_field_info.cc b/compiler/dex/mir_field_info.cc
index 68247b7..1db3b5b 100644
--- a/compiler/dex/mir_field_info.cc
+++ b/compiler/dex/mir_field_info.cc
@@ -62,7 +62,7 @@
compiler_driver->GetResolvedFieldDexFileLocation(resolved_field,
&it->declaring_dex_file_, &it->declaring_class_idx_, &it->declaring_field_idx_);
bool is_volatile = compiler_driver->IsFieldVolatile(resolved_field);
- it->field_offset_ = resolved_field->GetOffset();
+ it->field_offset_ = compiler_driver->GetFieldOffset(resolved_field);
std::pair<bool, bool> fast_path = compiler_driver->IsFastInstanceField(
dex_cache.Get(), referrer_class.Get(), resolved_field, field_idx);
it->flags_ = 0u | // Without kFlagIsStatic.
@@ -94,7 +94,7 @@
Handle<mirror::DexCache> dex_cache(hs.NewHandle(compiler_driver->GetDexCache(mUnit)));
Handle<mirror::ClassLoader> class_loader(
hs.NewHandle(compiler_driver->GetClassLoader(soa, mUnit)));
- Handle<mirror::Class> referrer_class(hs.NewHandle(
+ Handle<mirror::Class> referrer_class_handle(hs.NewHandle(
compiler_driver->ResolveCompilingMethodsClass(soa, dex_cache, class_loader, mUnit)));
// Even if the referrer class is unresolved (i.e. we're compiling a method without class
// definition) we still want to resolve fields and record all available info.
@@ -110,16 +110,27 @@
&it->declaring_dex_file_, &it->declaring_class_idx_, &it->declaring_field_idx_);
bool is_volatile = compiler_driver->IsFieldVolatile(resolved_field) ? 1u : 0u;
- bool is_referrers_class, is_initialized;
+ mirror::Class* referrer_class = referrer_class_handle.Get();
std::pair<bool, bool> fast_path = compiler_driver->IsFastStaticField(
- dex_cache.Get(), referrer_class.Get(), resolved_field, field_idx, &it->field_offset_,
- &it->storage_index_, &is_referrers_class, &is_initialized);
- it->flags_ = kFlagIsStatic |
+ dex_cache.Get(), referrer_class, resolved_field, field_idx, &it->storage_index_);
+ uint16_t flags = kFlagIsStatic |
(is_volatile ? kFlagIsVolatile : 0u) |
(fast_path.first ? kFlagFastGet : 0u) |
- (fast_path.second ? kFlagFastPut : 0u) |
- (is_referrers_class ? kFlagIsReferrersClass : 0u) |
- (is_initialized ? kFlagIsInitialized : 0u);
+ (fast_path.second ? kFlagFastPut : 0u);
+ if (fast_path.first) {
+ it->field_offset_ = compiler_driver->GetFieldOffset(resolved_field);
+ bool is_referrers_class =
+ compiler_driver->IsStaticFieldInReferrerClass(referrer_class, resolved_field);
+ bool is_class_initialized =
+ compiler_driver->IsStaticFieldsClassInitialized(referrer_class, resolved_field);
+ bool is_class_in_dex_cache = !is_referrers_class && // If referrer's class, we don't care.
+ compiler_driver->CanAssumeTypeIsPresentInDexCache(*dex_cache->GetDexFile(),
+ it->storage_index_);
+ flags |= (is_referrers_class ? kFlagIsReferrersClass : 0u) |
+ (is_class_initialized ? kFlagClassIsInitialized : 0u) |
+ (is_class_in_dex_cache ? kFlagClassIsInDexCache : 0u);
+ }
+ it->flags_ = flags;
}
}