Handle catch phis in code sinking.

When the user of an instruction we want to sink is a catch
phi, we should not look at predecessors (which don't map 1-1
for catch phis), but can only look at its dominator.

bug:37247890
Test: 647-sinking-catch
Change-Id: Ib64bd6f95d3ef45c394137e76819fa8d7d3d960a
diff --git a/compiler/optimizing/code_sinking.cc b/compiler/optimizing/code_sinking.cc
index dc3d378..0b4dcd3 100644
--- a/compiler/optimizing/code_sinking.cc
+++ b/compiler/optimizing/code_sinking.cc
@@ -161,9 +161,15 @@
   for (const HUseListNode<HInstruction*>& use : instruction->GetUses()) {
     HInstruction* user = use.GetUser();
     if (!(filter && ShouldFilterUse(instruction, user, post_dominated))) {
-      finder.Update(user->IsPhi()
-          ? user->GetBlock()->GetPredecessors()[use.GetIndex()]
-          : user->GetBlock());
+      HBasicBlock* block = user->GetBlock();
+      if (user->IsPhi()) {
+        // Special case phis by taking the incoming block for regular ones,
+        // or the dominator for catch phis.
+        block = user->AsPhi()->IsCatchPhi()
+            ? block->GetDominator()
+            : block->GetPredecessors()[use.GetIndex()];
+      }
+      finder.Update(block);
     }
   }
   for (const HUseListNode<HEnvironment*>& use : instruction->GetEnvUses()) {