Fall back to Quick when Optimizing cannot compile.
Currently applies when seeing unresolved types/methods/fields,
and methods with try/catch.
Change-Id: I93b12d440b39f0b9faf98f08f2bfddedfeff7182
diff --git a/compiler/dex/mir_graph.cc b/compiler/dex/mir_graph.cc
index f354a49..3103f96 100644
--- a/compiler/dex/mir_graph.cc
+++ b/compiler/dex/mir_graph.cc
@@ -2459,11 +2459,9 @@
return res;
}
-void MIRGraph::CalculateBasicBlockInformation() {
- auto* quick_compiler = down_cast<QuickCompiler*>(cu_->compiler_driver->GetCompiler());
- DCHECK(quick_compiler != nullptr);
+void MIRGraph::CalculateBasicBlockInformation(const PassManager* const post_opt_pass_manager) {
/* Create the pass driver and launch it */
- PassDriverMEPostOpt driver(quick_compiler->GetPostOptPassManager(), cu_);
+ PassDriverMEPostOpt driver(post_opt_pass_manager, cu_);
driver.Launch();
}
diff --git a/compiler/dex/mir_graph.h b/compiler/dex/mir_graph.h
index 3dae5b4..9da39d1 100644
--- a/compiler/dex/mir_graph.h
+++ b/compiler/dex/mir_graph.h
@@ -38,6 +38,7 @@
class DexFileMethodInliner;
class GlobalValueNumbering;
class GvnDeadCodeElimination;
+class PassManager;
// Forward declaration.
class MIRGraph;
@@ -1201,7 +1202,7 @@
void AllocateSSAUseData(MIR *mir, int num_uses);
void AllocateSSADefData(MIR *mir, int num_defs);
- void CalculateBasicBlockInformation();
+ void CalculateBasicBlockInformation(const PassManager* const post_opt);
void ComputeDFSOrders();
void ComputeDefBlockMatrix();
void ComputeDominators();
diff --git a/compiler/dex/pass_driver_me_opts.cc b/compiler/dex/pass_driver_me_opts.cc
index 320d06a..2e871da 100644
--- a/compiler/dex/pass_driver_me_opts.cc
+++ b/compiler/dex/pass_driver_me_opts.cc
@@ -66,7 +66,7 @@
// Is it dirty at least?
if (pass_me_data_holder->dirty == true) {
CompilationUnit* c_unit = pass_me_data_holder->c_unit;
- c_unit->mir_graph.get()->CalculateBasicBlockInformation();
+ c_unit->mir_graph.get()->CalculateBasicBlockInformation(post_opt_pass_manager_);
}
}
}
diff --git a/compiler/dex/pass_driver_me_opts.h b/compiler/dex/pass_driver_me_opts.h
index b930d02..e94c189 100644
--- a/compiler/dex/pass_driver_me_opts.h
+++ b/compiler/dex/pass_driver_me_opts.h
@@ -29,8 +29,10 @@
class PassDriverMEOpts : public PassDriverME {
public:
- explicit PassDriverMEOpts(const PassManager* const manager, CompilationUnit* cu)
- : PassDriverME(manager, cu) {
+ explicit PassDriverMEOpts(const PassManager* const manager,
+ const PassManager* const post_opt_pass_manager,
+ CompilationUnit* cu)
+ : PassDriverME(manager, cu), post_opt_pass_manager_(post_opt_pass_manager) {
}
~PassDriverMEOpts() {
@@ -45,6 +47,8 @@
* @brief Apply a patch: perform start/work/end functions.
*/
virtual void ApplyPass(PassDataHolder* data, const Pass* pass) OVERRIDE;
+
+ const PassManager* const post_opt_pass_manager_;
};
} // namespace art
diff --git a/compiler/dex/quick/quick_compiler.cc b/compiler/dex/quick/quick_compiler.cc
index 02d74a0..922f2f7 100644
--- a/compiler/dex/quick/quick_compiler.cc
+++ b/compiler/dex/quick/quick_compiler.cc
@@ -708,7 +708,7 @@
}
/* Create the pass driver and launch it */
- PassDriverMEOpts pass_driver(GetPreOptPassManager(), &cu);
+ PassDriverMEOpts pass_driver(GetPreOptPassManager(), GetPostOptPassManager(), &cu);
pass_driver.Launch();
/* For non-leaf methods check if we should skip compilation when the profiler is enabled. */