Remove HTemporary when building the SSA graph.

- They are useless afterwards. If we keep them around, they can
  crash the dump of the graph, where they always assume a previous
  instruction.

- In the call to HTemporary::GetType, check that the previous
  instruction exists.

Change-Id: Ie7bf44d05cb61e3654a69725c1980925580dd3a6
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 2dab605..36e286d 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -2114,7 +2114,11 @@
 
   size_t GetIndex() const { return index_; }
 
-  Primitive::Type GetType() const OVERRIDE { return GetPrevious()->GetType(); }
+  Primitive::Type GetType() const OVERRIDE {
+    // The previous instruction is the one that will be stored in the temporary location.
+    DCHECK(GetPrevious() != nullptr);
+    return GetPrevious()->GetType();
+  }
 
   DECLARE_INSTRUCTION(Temporary);
 
diff --git a/compiler/optimizing/ssa_builder.cc b/compiler/optimizing/ssa_builder.cc
index e83c528..fec40f9 100644
--- a/compiler/optimizing/ssa_builder.cc
+++ b/compiler/optimizing/ssa_builder.cc
@@ -253,4 +253,9 @@
   instruction->SetEnvironment(environment);
 }
 
+void SsaBuilder::VisitTemporary(HTemporary* temp) {
+  // Temporaries are only used by the baseline register allocator.
+  temp->GetBlock()->RemoveInstruction(temp);
+}
+
 }  // namespace art
diff --git a/compiler/optimizing/ssa_builder.h b/compiler/optimizing/ssa_builder.h
index 24f5ac5..2207cd6 100644
--- a/compiler/optimizing/ssa_builder.h
+++ b/compiler/optimizing/ssa_builder.h
@@ -51,6 +51,7 @@
   void VisitLoadLocal(HLoadLocal* load);
   void VisitStoreLocal(HStoreLocal* store);
   void VisitInstruction(HInstruction* instruction);
+  void VisitTemporary(HTemporary* instruction);
 
   static HInstruction* GetFloatOrDoubleEquivalent(HInstruction* user,
                                                   HInstruction* instruction,