summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
author David Brazdil <dbrazdil@google.com> 2015-04-27 12:42:59 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2015-04-27 12:42:59 +0000
commit0fbfe6f92a2481daf914043262b5854e65d8c3cc (patch)
tree85795f0df38a741ab14c34e0403ba4bc3c317371 /compiler
parent76bf84a196576f902a76a1165516a49dac15856f (diff)
parentc7508e93fa3df3a3890f6b62550cbd5e35bdd8df (diff)
Merge "ART: Fix removing a Phi with RemoveInstruction"
Diffstat (limited to 'compiler')
-rw-r--r--compiler/optimizing/boolean_simplifier.cc2
-rw-r--r--compiler/optimizing/nodes.cc9
-rw-r--r--compiler/optimizing/nodes.h1
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 ca470f4988..df3b1fc681 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 d970e383ed..753c95b477 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);