summaryrefslogtreecommitdiff
path: root/compiler/optimizing
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing')
-rw-r--r--compiler/optimizing/dead_code_elimination.cc2
-rw-r--r--compiler/optimizing/nodes.h16
2 files changed, 13 insertions, 5 deletions
diff --git a/compiler/optimizing/dead_code_elimination.cc b/compiler/optimizing/dead_code_elimination.cc
index 6746771fa4..fe1361c935 100644
--- a/compiler/optimizing/dead_code_elimination.cc
+++ b/compiler/optimizing/dead_code_elimination.cc
@@ -937,7 +937,7 @@ void HDeadCodeElimination::RemoveDeadInstructions() {
for (HBackwardInstructionIterator phi_it(block->GetPhis()); !phi_it.Done(); phi_it.Advance()) {
DCHECK(phi_it.Current()->IsPhi());
HPhi* phi = phi_it.Current()->AsPhi();
- if (phi->IsDeadAndRemovable()) {
+ if (phi->IsPhiDeadAndRemovable()) {
block->RemovePhi(phi);
MaybeRecordStat(stats_, MethodCompilationStat::kRemovedDeadPhi);
}
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 367f45f3a4..bf4a66dfc3 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -2448,18 +2448,26 @@ class HInstruction : public ArenaObject<kArenaAllocInstruction> {
bool IsRemovable() const {
return
!DoesAnyWrite() &&
- !CanThrow() &&
+ // TODO(solanes): Merge calls from IsSuspendCheck to IsControlFlow into one that doesn't
+ // do virtual dispatching.
!IsSuspendCheck() &&
- !IsControlFlow() &&
!IsNop() &&
!IsParameterValue() &&
// If we added an explicit barrier then we should keep it.
!IsMemoryBarrier() &&
- !IsConstructorFence();
+ !IsConstructorFence() &&
+ !IsControlFlow() &&
+ !CanThrow();
}
bool IsDeadAndRemovable() const {
- return IsRemovable() && !HasUses();
+ return !HasUses() && IsRemovable();
+ }
+
+ bool IsPhiDeadAndRemovable() const {
+ DCHECK(IsPhi());
+ DCHECK(IsRemovable()) << " phis are always removable";
+ return !HasUses();
}
// Does this instruction dominate `other_instruction`?