summaryrefslogtreecommitdiff
path: root/compiler/optimizing
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2017-04-21 07:59:53 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2017-04-21 07:59:55 +0000
commitd1a05c90882a3aa413b8bf5363b6ad90b3a1549b (patch)
treece69ac6e5a7a2bb5f84be7e5d7f9e63a281804cc /compiler/optimizing
parentbdbc63b892c571101a301ce805ca136acd769218 (diff)
parent13445e7176d67098a5d94754a9d3cd2928616bd8 (diff)
Merge "Handle catch phis in code sinking."
Diffstat (limited to 'compiler/optimizing')
-rw-r--r--compiler/optimizing/code_sinking.cc12
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()) {