summaryrefslogtreecommitdiffstats
path: root/compiler
diff options
context:
space:
mode:
authorRazvan A Lupusoru <razvan.a.lupusoru@intel.com>2014-09-11 14:12:17 -0700
committerRazvan A Lupusoru <razvan.a.lupusoru@intel.com>2014-09-12 23:48:06 +0000
commitc80605d6f13b0f1e5ac5446c755e6d210f06b19a (patch)
treeea96813e0cd3870fcb97c2db5c496004015728fc /compiler
parentebab3bbcaa09b644acd50ec18d79cb0d239bf347 (diff)
downloadandroid_art-c80605d6f13b0f1e5ac5446c755e6d210f06b19a.tar.gz
android_art-c80605d6f13b0f1e5ac5446c755e6d210f06b19a.tar.bz2
android_art-c80605d6f13b0f1e5ac5446c755e6d210f06b19a.zip
ART: Consider clinit elimination for inlining
Currently inliner rejects inlining method if class initialization is needed. However, if it has been proven already that it was done, then inlining can safely proceed. Change-Id: Iaf1638fcfffff1bcf66010dc39090c77e009a1bb Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Diffstat (limited to 'compiler')
-rw-r--r--compiler/dex/mir_optimization.cc13
1 files changed, 11 insertions, 2 deletions
diff --git a/compiler/dex/mir_optimization.cc b/compiler/dex/mir_optimization.cc
index 7ac878f49b..fdabc3e3cb 100644
--- a/compiler/dex/mir_optimization.cc
+++ b/compiler/dex/mir_optimization.cc
@@ -1360,11 +1360,20 @@ void MIRGraph::InlineSpecialMethods(BasicBlock* bb) {
if (!method_info.FastPath()) {
continue;
}
+
InvokeType sharp_type = method_info.GetSharpType();
- if ((sharp_type != kDirect) &&
- (sharp_type != kStatic || method_info.NeedsClassInitialization())) {
+ if ((sharp_type != kDirect) && (sharp_type != kStatic)) {
continue;
}
+
+ if (sharp_type == kStatic) {
+ bool needs_clinit = method_info.NeedsClassInitialization() &&
+ ((mir->optimization_flags & MIR_IGNORE_CLINIT_CHECK) == 0);
+ if (needs_clinit) {
+ continue;
+ }
+ }
+
DCHECK(cu_->compiler_driver->GetMethodInlinerMap() != nullptr);
MethodReference target = method_info.GetTargetMethod();
if (cu_->compiler_driver->GetMethodInlinerMap()->GetMethodInliner(target.dex_file)