diff options
Diffstat (limited to 'compiler/optimizing')
-rw-r--r-- | compiler/optimizing/dead_code_elimination.cc | 2 | ||||
-rw-r--r-- | compiler/optimizing/nodes.h | 16 |
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`? |