diff options
author | Nadav Rotem <nrotem@apple.com> | 2012-12-24 01:22:06 +0000 |
---|---|---|
committer | Nadav Rotem <nrotem@apple.com> | 2012-12-24 01:22:06 +0000 |
commit | 470ea9b72f87f2ce4bb09fc6f9829211a090652a (patch) | |
tree | c1b1ef977069bab5ad4176ee581d582b20c4a4a7 /lib/Transforms/Vectorize/LoopVectorize.cpp | |
parent | a048c237e6848f7c5e9e070a7b701031bb6601e1 (diff) |
LoopVectorizer: Fix an endless loop in the code that looks for reductions.
The bug was in the code that detects PHIs in if-then-else block sequence.
PR14701.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171008 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Vectorize/LoopVectorize.cpp')
-rw-r--r-- | lib/Transforms/Vectorize/LoopVectorize.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp index 1d78fac500..20bcf8681b 100644 --- a/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -1737,10 +1737,9 @@ bool LoopVectorizationLegality::AddReductionVar(PHINode *Phi, Instruction *ExitInstruction = 0; // Iter is our iterator. We start with the PHI node and scan for all of the - // users of this instruction. All users must be instructions which can be + // users of this instruction. All users must be instructions that can be // used as reduction variables (such as ADD). We may have a single - // out-of-block user. They cycle must end with the original PHI. - // Also, we can't have multiple block-local users. + // out-of-block user. The cycle must end with the original PHI. Instruction *Iter = Phi; while (true) { // If the instruction has no users then this is a broken @@ -1752,9 +1751,9 @@ bool LoopVectorizationLegality::AddReductionVar(PHINode *Phi, if (!isReductionInstr(Iter, Kind)) return false; - // Did we find a user inside this block ? + // Did we find a user inside this loop already ? bool FoundInBlockUser = false; - // Did we reach the initial PHI node ? + // Did we reach the initial PHI node already ? bool FoundStartPHI = false; // For each of the *users* of iter. @@ -1779,8 +1778,10 @@ bool LoopVectorizationLegality::AddReductionVar(PHINode *Phi, // We allow in-loop PHINodes which are not the original reduction PHI // node. If this PHI is the only user of Iter (happens in IF w/ no ELSE // structure) then don't skip this PHI. - if (isa<PHINode>(U) && U->getParent() != TheLoop->getHeader() && - TheLoop->contains(U) && Iter->getNumUses() > 1) + if (isa<PHINode>(Iter) && isa<PHINode>(U) && + U->getParent() != TheLoop->getHeader() && + TheLoop->contains(U) && + Iter->getNumUses() > 1) continue; // We can't have multiple inside users. |