diff options
author | 2017-04-21 07:59:53 +0000 | |
---|---|---|
committer | 2017-04-21 07:59:55 +0000 | |
commit | d1a05c90882a3aa413b8bf5363b6ad90b3a1549b (patch) | |
tree | ce69ac6e5a7a2bb5f84be7e5d7f9e63a281804cc /compiler/optimizing | |
parent | bdbc63b892c571101a301ce805ca136acd769218 (diff) | |
parent | 13445e7176d67098a5d94754a9d3cd2928616bd8 (diff) |
Merge "Handle catch phis in code sinking."
Diffstat (limited to 'compiler/optimizing')
-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()) { |