Run DCE again after all the other optimizations have run.

On docs this doubles the amount of instructions removed.

Change-Id: I1712a92c0c0b3b32b111d194b64d8ea81d652822
diff --git a/compiler/optimizing/dead_code_elimination.cc b/compiler/optimizing/dead_code_elimination.cc
index 9499040..8045cc5 100644
--- a/compiler/optimizing/dead_code_elimination.cc
+++ b/compiler/optimizing/dead_code_elimination.cc
@@ -41,6 +41,7 @@
           && !inst->IsMemoryBarrier()  // If we added an explicit barrier then we should keep it.
           && !inst->HasUses()) {
         block->RemoveInstruction(inst);
+        MaybeRecordStat(MethodCompilationStat::kRemovedDeadInstruction);
       }
     }
   }
diff --git a/compiler/optimizing/dead_code_elimination.h b/compiler/optimizing/dead_code_elimination.h
index 3db2c3f..3f309c5 100644
--- a/compiler/optimizing/dead_code_elimination.h
+++ b/compiler/optimizing/dead_code_elimination.h
@@ -19,6 +19,7 @@
 
 #include "nodes.h"
 #include "optimization.h"
+#include "optimizing_compiler_stats.h"
 
 namespace art {
 
@@ -28,8 +29,8 @@
  */
 class HDeadCodeElimination : public HOptimization {
  public:
-  explicit HDeadCodeElimination(HGraph* graph)
-      : HOptimization(graph, true, kDeadCodeEliminationPassName) {}
+  HDeadCodeElimination(HGraph* graph, OptimizingCompilerStats* stats)
+      : HOptimization(graph, true, kDeadCodeEliminationPassName, stats) {}
 
   void Run() OVERRIDE;
 
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc
index 6d2a8d7..bffd639 100644
--- a/compiler/optimizing/inliner.cc
+++ b/compiler/optimizing/inliner.cc
@@ -190,7 +190,7 @@
   }
 
   // Run simple optimizations on the graph.
-  HDeadCodeElimination dce(callee_graph);
+  HDeadCodeElimination dce(callee_graph, stats_);
   HConstantFolding fold(callee_graph);
   InstructionSimplifier simplify(callee_graph, stats_);
 
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc
index 2ec8536..ab752c3 100644
--- a/compiler/optimizing/optimizing_compiler.cc
+++ b/compiler/optimizing/optimizing_compiler.cc
@@ -320,7 +320,8 @@
                              const DexCompilationUnit& dex_compilation_unit,
                              PassInfoPrinter* pass_info_printer,
                              StackHandleScopeCollection* handles) {
-  HDeadCodeElimination dce(graph);
+  HDeadCodeElimination dce1(graph, stats);
+  HDeadCodeElimination dce2(graph, stats);
   HConstantFolding fold1(graph);
   InstructionSimplifier simplify1(graph, stats);
   HBooleanSimplifier boolean_not(graph);
@@ -339,7 +340,7 @@
 
   HOptimization* optimizations[] = {
     &intrinsics,
-    &dce,
+    &dce1,
     &fold1,
     &simplify1,
     // BooleanSimplifier depends on the InstructionSimplifier removing redundant
@@ -352,7 +353,8 @@
     &licm,
     &bce,
     &type_propagation,
-    &simplify2
+    &simplify2,
+    &dce2,
   };
 
   RunOptimizations(optimizations, arraysize(optimizations), pass_info_printer);
diff --git a/compiler/optimizing/optimizing_compiler_stats.h b/compiler/optimizing/optimizing_compiler_stats.h
index 9bfa543..e6508c9 100644
--- a/compiler/optimizing/optimizing_compiler_stats.h
+++ b/compiler/optimizing/optimizing_compiler_stats.h
@@ -29,6 +29,7 @@
   kCompiledBaseline,
   kCompiledOptimized,
   kCompiledQuick,
+  kInstructionSimplifications,
   kInlinedInvoke,
   kNotCompiledUnsupportedIsa,
   kNotCompiledPathological,
@@ -48,8 +49,8 @@
   kNotCompiledVerifyAtRuntime,
   kNotCompiledClassNotVerified,
   kRemovedCheckedCast,
+  kRemovedDeadInstruction,
   kRemovedNullCheck,
-  kInstructionSimplifications,
   kLastStat
 };
 
@@ -96,6 +97,7 @@
       case kCompiledOptimized : return "kCompiledOptimized";
       case kCompiledQuick : return "kCompiledQuick";
       case kInlinedInvoke : return "kInlinedInvoke";
+      case kInstructionSimplifications: return "kInstructionSimplifications";
       case kNotCompiledUnsupportedIsa : return "kNotCompiledUnsupportedIsa";
       case kNotCompiledPathological : return "kNotCompiledPathological";
       case kNotCompiledHugeMethod : return "kNotCompiledHugeMethod";
@@ -114,8 +116,8 @@
       case kNotCompiledVerifyAtRuntime : return "kNotCompiledVerifyAtRuntime";
       case kNotCompiledClassNotVerified : return "kNotCompiledClassNotVerified";
       case kRemovedCheckedCast: return "kRemovedCheckedCast";
+      case kRemovedDeadInstruction: return "kRemovedDeadInstruction";
       case kRemovedNullCheck: return "kRemovedNullCheck";
-      case kInstructionSimplifications: return "kInstructionSimplifications";
       default: LOG(FATAL) << "invalid stat";
     }
     return "";