Treat SSA transformation special, as we may have to bailout.

We forgot to bailout when we found a non-natural loop (on which
our optimizations don't work).

Change-Id: I11976b5af4c98f4f29267a74c74d34b5ad81e20c
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc
index 34485a3..6c9f3fc 100644
--- a/compiler/optimizing/optimizing_compiler.cc
+++ b/compiler/optimizing/optimizing_compiler.cc
@@ -192,7 +192,6 @@
 }
 
 static void RunOptimizations(HGraph* graph, const HGraphVisualizer& visualizer) {
-  TransformToSsa ssa(graph);
   HDeadCodeElimination opt1(graph);
   HConstantFolding opt2(graph);
   SsaRedundantPhiElimination opt3(graph);
@@ -202,7 +201,6 @@
   InstructionSimplifier opt7(graph);
 
   HOptimization* optimizations[] = {
-    &ssa,
     &opt1,
     &opt2,
     &opt3,
@@ -220,6 +218,23 @@
   }
 }
 
+static bool TryBuildingSsa(HGraph* graph,
+                           const DexCompilationUnit& dex_compilation_unit,
+                           const HGraphVisualizer& visualizer) {
+  graph->BuildDominatorTree();
+  graph->TransformToSSA();
+
+  if (!graph->AnalyzeNaturalLoops()) {
+    LOG(INFO) << "Skipping compilation of "
+              << PrettyMethod(dex_compilation_unit.GetDexMethodIndex(),
+                              *dex_compilation_unit.GetDexFile())
+              << ": it contains a non natural loop";
+    return false;
+  }
+  visualizer.DumpGraph("ssa transform");
+  return true;
+}
+
 CompiledMethod* OptimizingCompiler::Compile(const DexFile::CodeItem* code_item,
                                             uint32_t access_flags,
                                             InvokeType invoke_type,
@@ -282,6 +297,10 @@
       && CanOptimize(*code_item)
       && RegisterAllocator::CanAllocateRegistersFor(*graph, instruction_set)) {
     optimized_compiled_methods_++;
+    if (!TryBuildingSsa(graph, dex_compilation_unit, visualizer)) {
+      // We could not transform the graph to SSA, bailout.
+      return nullptr;
+    }
     RunOptimizations(graph, visualizer);
 
     PrepareForRegisterAllocation(graph).Run();