Put in place the ARM64 instruction simplification framework.

This commit introduces and runs the empty InstructionSimplifierArm64
pass. Further commits will introduce arm64-specific transformations in
that pass.

Change-Id: I458f8a2b15470297b87fc1f7ff85bd52155d93ef
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc
index 6a50b7d..866e717 100644
--- a/compiler/optimizing/optimizing_compiler.cc
+++ b/compiler/optimizing/optimizing_compiler.cc
@@ -19,6 +19,10 @@
 #include <fstream>
 #include <stdint.h>
 
+#ifdef ART_ENABLE_CODEGEN_arm64
+#include "instruction_simplifier_arm64.h"
+#endif
+
 #include "art_method-inl.h"
 #include "base/arena_allocator.h"
 #include "base/dumpable.h"
@@ -399,6 +403,32 @@
   RunOptimizations(optimizations, arraysize(optimizations), pass_observer);
 }
 
+static void RunArchOptimizations(InstructionSet instruction_set,
+                                 HGraph* graph,
+                                 OptimizingCompilerStats* stats,
+                                 PassObserver* pass_observer) {
+  ArenaAllocator* arena = graph->GetArena();
+  switch (instruction_set) {
+#ifdef ART_ENABLE_CODEGEN_arm64
+    case kArm64: {
+      arm64::InstructionSimplifierArm64* simplifier =
+          new (arena) arm64::InstructionSimplifierArm64(graph, stats);
+      SideEffectsAnalysis* side_effects = new (arena) SideEffectsAnalysis(graph);
+      GVNOptimization* gvn = new (arena) GVNOptimization(graph, *side_effects, "GVN_after_arch");
+      HOptimization* arm64_optimizations[] = {
+        simplifier,
+        side_effects,
+        gvn
+      };
+      RunOptimizations(arm64_optimizations, arraysize(arm64_optimizations), pass_observer);
+      break;
+    }
+#endif
+    default:
+      break;
+  }
+}
+
 static void RunOptimizations(HGraph* graph,
                              CompilerDriver* driver,
                              OptimizingCompilerStats* stats,
@@ -460,6 +490,8 @@
   };
 
   RunOptimizations(optimizations2, arraysize(optimizations2), pass_observer);
+
+  RunArchOptimizations(driver->GetInstructionSet(), graph, stats, pass_observer);
 }
 
 // The stack map we generate must be 4-byte aligned on ARM. Since existing