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_method_info.h b/compiler/dex/mir_method_info.h
index efe92f3..e64b028 100644
--- a/compiler/dex/mir_method_info.h
+++ b/compiler/dex/mir_method_info.h
@@ -123,8 +123,12 @@
return (flags_ & kFlagFastPath) != 0u;
}
- bool NeedsClassInitialization() const {
- return (flags_ & kFlagNeedsClassInitialization) != 0u;
+ bool IsReferrersClass() const {
+ return (flags_ & kFlagIsReferrersClass) != 0;
+ }
+
+ bool IsClassInitialized() const {
+ return (flags_ & kFlagClassIsInitialized) != 0u;
}
InvokeType GetInvokeType() const {
@@ -162,12 +166,14 @@
kBitInvokeTypeEnd = kBitInvokeTypeBegin + 3, // 3 bits for invoke type.
kBitSharpTypeBegin,
kBitSharpTypeEnd = kBitSharpTypeBegin + 3, // 3 bits for sharp type.
- kBitNeedsClassInitialization = kBitSharpTypeEnd,
- kMethodLoweringInfoEnd
+ kBitIsReferrersClass = kBitSharpTypeEnd,
+ kBitClassIsInitialized,
+ kMethodLoweringInfoBitEnd
};
- COMPILE_ASSERT(kMethodLoweringInfoEnd <= 16, too_many_flags);
+ COMPILE_ASSERT(kMethodLoweringInfoBitEnd <= 16, too_many_flags);
static constexpr uint16_t kFlagFastPath = 1u << kBitFastPath;
- static constexpr uint16_t kFlagNeedsClassInitialization = 1u << kBitNeedsClassInitialization;
+ static constexpr uint16_t kFlagIsReferrersClass = 1u << kBitIsReferrersClass;
+ static constexpr uint16_t kFlagClassIsInitialized = 1u << kBitClassIsInitialized;
static constexpr uint16_t kInvokeTypeMask = 7u;
COMPILE_ASSERT((1u << (kBitInvokeTypeEnd - kBitInvokeTypeBegin)) - 1u == kInvokeTypeMask,
assert_invoke_type_bits_ok);
@@ -185,7 +191,7 @@
uint16_t vtable_idx_;
int stats_flags_;
- friend class ClassInitCheckEliminationTest;
+ friend class MirOptimizationTest;
};
} // namespace art