From 13445e7176d67098a5d94754a9d3cd2928616bd8 Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Thu, 20 Apr 2017 15:19:46 +0100 Subject: 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 --- compiler/optimizing/code_sinking.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'compiler/optimizing/code_sinking.cc') 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& 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& use : instruction->GetEnvUses()) { -- cgit v1.2.3-59-g8ed1b