diff options
| author | 2015-04-27 13:28:57 +0100 | |
|---|---|---|
| committer | 2015-04-27 15:16:04 +0100 | |
| commit | 2b1c622d5db941fe06b3ea9c1a5366358fa298c6 (patch) | |
| tree | 72c4e971ece27b9fba7ea5093a8f58074b59d43d /compiler/optimizing | |
| parent | 9e03c1b9474084b73c92ebf3c6fa43de8e2fa91c (diff) | |
ART: Fix removing a Phi with RemoveInstruction
Boolean simplifier might attempt to remove a Phi from the Instruction
list.
(cherry picked from commit c7508e93fa3df3a3890f6b62550cbd5e35bdd8df)
Change-Id: Ic8ad31967aa3e47c1fb1c67553d08681b6063a16
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/boolean_simplifier.cc | 2 | ||||
| -rw-r--r-- | compiler/optimizing/nodes.cc | 9 | ||||
| -rw-r--r-- | compiler/optimizing/nodes.h | 1 |
3 files changed, 11 insertions, 1 deletions
diff --git a/compiler/optimizing/boolean_simplifier.cc b/compiler/optimizing/boolean_simplifier.cc index 30c89f2d15..9a9215135a 100644 --- a/compiler/optimizing/boolean_simplifier.cc +++ b/compiler/optimizing/boolean_simplifier.cc @@ -128,7 +128,7 @@ void HBooleanSimplifier::Run() { // Remove the original condition if it is now unused. if (!if_condition->HasUses()) { - if_condition->GetBlock()->RemoveInstruction(if_condition); + if_condition->GetBlock()->RemoveInstructionOrPhi(if_condition); } } } diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index c158ddf4ee..0ff30eaad5 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -481,6 +481,7 @@ static void Remove(HInstructionList* instruction_list, } void HBasicBlock::RemoveInstruction(HInstruction* instruction, bool ensure_safety) { + DCHECK(!instruction->IsPhi()); Remove(&instructions_, this, instruction, ensure_safety); } @@ -488,6 +489,14 @@ void HBasicBlock::RemovePhi(HPhi* phi, bool ensure_safety) { Remove(&phis_, this, phi, ensure_safety); } +void HBasicBlock::RemoveInstructionOrPhi(HInstruction* instruction, bool ensure_safety) { + if (instruction->IsPhi()) { + RemovePhi(instruction->AsPhi(), ensure_safety); + } else { + RemoveInstruction(instruction, ensure_safety); + } +} + void HEnvironment::CopyFrom(HEnvironment* env) { for (size_t i = 0; i < env->Size(); i++) { HInstruction* instruction = env->GetInstructionAt(i); diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index 938d6fcd64..1f58c4d441 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -589,6 +589,7 @@ class HBasicBlock : public ArenaObject<kArenaAllocMisc> { // instruction is not in use and removes it from the use lists of its inputs. void RemoveInstruction(HInstruction* instruction, bool ensure_safety = true); void RemovePhi(HPhi* phi, bool ensure_safety = true); + void RemoveInstructionOrPhi(HInstruction* instruction, bool ensure_safety = true); bool IsLoopHeader() const { return (loop_information_ != nullptr) && (loop_information_->GetHeader() == this); |