diff options
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/bounds_check_elimination.cc | 10 | ||||
| -rw-r--r-- | compiler/optimizing/induction_var_analysis.cc | 3 | ||||
| -rw-r--r-- | compiler/optimizing/load_store_elimination.cc | 2 | ||||
| -rw-r--r-- | compiler/optimizing/nodes.cc | 11 | ||||
| -rw-r--r-- | compiler/optimizing/nodes.h | 7 |
5 files changed, 12 insertions, 21 deletions
diff --git a/compiler/optimizing/bounds_check_elimination.cc b/compiler/optimizing/bounds_check_elimination.cc index 7dbfd7c58e..4c3f66aa4f 100644 --- a/compiler/optimizing/bounds_check_elimination.cc +++ b/compiler/optimizing/bounds_check_elimination.cc @@ -1138,8 +1138,8 @@ class BCEVisitor : public HGraphVisitor { void VisitArrayGet(HArrayGet* array_get) OVERRIDE { if (!has_deoptimization_on_constant_subscripts_ && array_get->IsInLoop()) { HLoopInformation* loop = array_get->GetBlock()->GetLoopInformation(); - if (loop->IsLoopInvariant(array_get->InputAt(0), false) && - loop->IsLoopInvariant(array_get->InputAt(1), false)) { + if (loop->IsDefinedOutOfTheLoop(array_get->InputAt(0)) && + loop->IsDefinedOutOfTheLoop(array_get->InputAt(1))) { SideEffects loop_effects = side_effects_.GetLoopEffects(loop->GetHeader()); if (!array_get->GetSideEffects().MayDependOn(loop_effects)) { HoistToPreheaderOrDeoptBlock(loop, array_get); @@ -1349,7 +1349,7 @@ class BCEVisitor : public HGraphVisitor { * by handling the null check under the hood of the array length operation. */ bool CanHandleLength(HLoopInformation* loop, HInstruction* length, bool needs_taken_test) { - if (loop->IsLoopInvariant(length, false)) { + if (loop->IsDefinedOutOfTheLoop(length)) { return true; } else if (length->IsArrayLength() && length->GetBlock()->GetLoopInformation() == loop) { if (CanHandleNullCheck(loop, length->InputAt(0), needs_taken_test)) { @@ -1365,11 +1365,11 @@ class BCEVisitor : public HGraphVisitor { * by generating a deoptimization test. */ bool CanHandleNullCheck(HLoopInformation* loop, HInstruction* check, bool needs_taken_test) { - if (loop->IsLoopInvariant(check, false)) { + if (loop->IsDefinedOutOfTheLoop(check)) { return true; } else if (check->IsNullCheck() && check->GetBlock()->GetLoopInformation() == loop) { HInstruction* array = check->InputAt(0); - if (loop->IsLoopInvariant(array, false)) { + if (loop->IsDefinedOutOfTheLoop(array)) { // Generate: if (array == null) deoptimize; HBasicBlock* block = TransformLoopForDeoptimizationIfNeeded(loop, needs_taken_test); HInstruction* cond = diff --git a/compiler/optimizing/induction_var_analysis.cc b/compiler/optimizing/induction_var_analysis.cc index fdf8cc9c1f..0b7fdf85ea 100644 --- a/compiler/optimizing/induction_var_analysis.cc +++ b/compiler/optimizing/induction_var_analysis.cc @@ -705,7 +705,8 @@ HInductionVarAnalysis::InductionInfo* HInductionVarAnalysis::LookupInfo(HLoopInf return loop_it->second; } } - if (loop->IsLoopInvariant(instruction, true)) { + if (loop->IsDefinedOutOfTheLoop(instruction)) { + DCHECK(instruction->GetBlock()->Dominates(loop->GetPreHeader())); InductionInfo* info = CreateInvariantFetch(instruction); AssignInfo(loop, instruction, info); return info; diff --git a/compiler/optimizing/load_store_elimination.cc b/compiler/optimizing/load_store_elimination.cc index 680f89f9b9..389ada7504 100644 --- a/compiler/optimizing/load_store_elimination.cc +++ b/compiler/optimizing/load_store_elimination.cc @@ -725,7 +725,7 @@ class LSEVisitor : public HGraphVisitor { // instruction is a store in the loop so the loop must does write. DCHECK(side_effects_.GetLoopEffects(loop_info->GetHeader()).DoesAnyWrite()); - if (loop_info->IsLoopInvariant(original_ref, false)) { + if (loop_info->IsDefinedOutOfTheLoop(original_ref)) { DCHECK(original_ref->GetBlock()->Dominates(loop_info->GetPreHeader())); // Keep the store since its value may be needed at the loop header. possibly_redundant = false; diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index 9b26de44fe..461be25887 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -587,15 +587,8 @@ bool HLoopInformation::IsIn(const HLoopInformation& other) const { return other.blocks_.IsBitSet(header_->GetBlockId()); } -bool HLoopInformation::IsLoopInvariant(HInstruction* instruction, bool must_dominate) const { - HLoopInformation* other_loop = instruction->GetBlock()->GetLoopInformation(); - if (other_loop != this && (other_loop == nullptr || !other_loop->IsIn(*this))) { - if (must_dominate) { - return instruction->GetBlock()->Dominates(GetHeader()); - } - return true; - } - return false; +bool HLoopInformation::IsDefinedOutOfTheLoop(HInstruction* instruction) const { + return !blocks_.IsBitSet(instruction->GetBlock()->GetBlockId()); } size_t HLoopInformation::GetLifetimeEnd() const { diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index 9d3c88c79e..3e38e9f2a4 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -564,11 +564,8 @@ class HLoopInformation : public ArenaObject<kArenaAllocLoopInfo> { // Note that `other` *must* be populated before entering this function. bool IsIn(const HLoopInformation& other) const; - // Returns true if instruction is not defined within this loop or any loop nested inside - // this loop. If must_dominate is set, only definitions that actually dominate the loop - // header can be invariant. Otherwise, any definition outside the loop, including - // definitions that appear after the loop, is invariant. - bool IsLoopInvariant(HInstruction* instruction, bool must_dominate) const; + // Returns true if instruction is not defined within this loop. + bool IsDefinedOutOfTheLoop(HInstruction* instruction) const; const ArenaBitVector& GetBlocks() const { return blocks_; } |