diff options
Diffstat (limited to 'compiler/optimizing/code_sinking.cc')
-rw-r--r-- | compiler/optimizing/code_sinking.cc | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/compiler/optimizing/code_sinking.cc b/compiler/optimizing/code_sinking.cc index dc3d378e75..0b4dcd30a1 100644 --- a/compiler/optimizing/code_sinking.cc +++ b/compiler/optimizing/code_sinking.cc @@ -161,9 +161,15 @@ static HInstruction* FindIdealPosition(HInstruction* instruction, 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()) { |