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()) {