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. */