diff options
author | David Brazdil <dbrazdil@google.com> | 2015-04-29 17:16:07 +0100 |
---|---|---|
committer | David Brazdil <dbrazdil@google.com> | 2015-04-29 17:36:52 +0100 |
commit | 69a2804c3bb48cf4fd00a66080f613a4fd96c422 (patch) | |
tree | aab3f079d972bae71bbfa27fdca139738f41dbf0 /compiler/optimizing/nodes.h | |
parent | f073a36d1ed866e786f7d7784c709c86b00bc58e (diff) | |
download | android_art-69a2804c3bb48cf4fd00a66080f613a4fd96c422.tar.gz android_art-69a2804c3bb48cf4fd00a66080f613a4fd96c422.tar.bz2 android_art-69a2804c3bb48cf4fd00a66080f613a4fd96c422.zip |
ART: Fix loop information after dead code elimination
Compilation failed when only some blocks of a loop were removed during
dead code elimination.
Bug: 20680703
Change-Id: If31025169ca493f0d7f7f2788576e98d05f03394
Diffstat (limited to 'compiler/optimizing/nodes.h')
-rw-r--r-- | compiler/optimizing/nodes.h | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index 3fe23e1816..25ef78064c 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -636,7 +636,7 @@ class HBasicBlock : public ArenaObject<kArenaAllocMisc> { void RemoveInstructionOrPhi(HInstruction* instruction, bool ensure_safety = true); bool IsLoopHeader() const { - return (loop_information_ != nullptr) && (loop_information_->GetHeader() == this); + return IsInLoop() && (loop_information_->GetHeader() == this); } bool IsLoopPreHeaderFirstPredecessor() const { @@ -655,7 +655,7 @@ class HBasicBlock : public ArenaObject<kArenaAllocMisc> { void SetInLoop(HLoopInformation* info) { if (IsLoopHeader()) { // Nothing to do. This just means `info` is an outer loop. - } else if (loop_information_ == nullptr) { + } else if (!IsInLoop()) { loop_information_ = info; } else if (loop_information_->Contains(*info->GetHeader())) { // Block is currently part of an outer loop. Make it part of this inner loop. @@ -674,6 +674,11 @@ class HBasicBlock : public ArenaObject<kArenaAllocMisc> { loop_information_ = info; } + // Checks if the loop information points to a valid loop. If the loop has been + // dismantled (does not have a back edge any more), loop information is + // removed or replaced with the information of the first valid outer loop. + void UpdateLoopInformation(); + bool IsInLoop() const { return loop_information_ != nullptr; } // Returns wheter this block dominates the blocked passed as parameter. @@ -727,7 +732,7 @@ class HLoopInformationOutwardIterator : public ValueObject { void Advance() { DCHECK(!Done()); - current_ = current_->GetHeader()->GetDominator()->GetLoopInformation(); + current_ = current_->GetPreHeader()->GetLoopInformation(); } HLoopInformation* Current() const { |