Class initialization check elimination.

Also, move null check elimination temporaries to the
ScopedArenaAllocator and reuse the same variables in the
class initialization check elimination.

Change-Id: Ic746f95427065506fa6016d4931e4cb8b34937af
diff --git a/compiler/dex/bb_optimizations.h b/compiler/dex/bb_optimizations.h
index 1ad4958..fb482bf 100644
--- a/compiler/dex/bb_optimizations.h
+++ b/compiler/dex/bb_optimizations.h
@@ -137,20 +137,6 @@
 };
 
 /**
- * @class NullCheckEliminationAndTypeInferenceInit
- * @brief Null check elimination and type inference initialization step.
- */
-class NullCheckEliminationAndTypeInferenceInit : public Pass {
- public:
-  NullCheckEliminationAndTypeInferenceInit() : Pass("NCE_TypeInferenceInit") {
-  }
-
-  bool WalkBasicBlocks(CompilationUnit* cUnit, BasicBlock* bb) const;
-
-  bool Gate(const CompilationUnit* cUnit) const;
-};
-
-/**
  * @class NullCheckEliminationAndTypeInference
  * @brief Null check elimination and type inference.
  */
@@ -160,9 +146,35 @@
     : Pass("NCE_TypeInference", kRepeatingPreOrderDFSTraversal, "4_post_nce_cfg") {
   }
 
+  void Start(CompilationUnit* cUnit) const {
+    cUnit->mir_graph->EliminateNullChecksAndInferTypesStart();
+  }
+
   bool WalkBasicBlocks(CompilationUnit* cUnit, BasicBlock* bb) const {
     return cUnit->mir_graph->EliminateNullChecksAndInferTypes(bb);
   }
+
+  void End(CompilationUnit* cUnit) const {
+    cUnit->mir_graph->EliminateNullChecksAndInferTypesEnd();
+  }
+};
+
+class ClassInitCheckElimination : public Pass {
+ public:
+  ClassInitCheckElimination() : Pass("ClInitCheckElimination", kRepeatingPreOrderDFSTraversal) {
+  }
+
+  bool Gate(const CompilationUnit* cUnit) const {
+    return cUnit->mir_graph->EliminateClassInitChecksGate();
+  }
+
+  bool WalkBasicBlocks(CompilationUnit* cUnit, BasicBlock* bb) const {
+    return cUnit->mir_graph->EliminateClassInitChecks(bb);
+  }
+
+  void End(CompilationUnit* cUnit) const {
+    cUnit->mir_graph->EliminateClassInitChecksEnd();
+  }
 };
 
 /**