[llvm] r179757 - LoopVectorize: Use a set to avoid longer cycles in the reduction chain too.
Benjamin Kramer
benny.kra at googlemail.com
Thu Apr 18 07:29:13 PDT 2013
Author: d0k
Date: Thu Apr 18 09:29:13 2013
New Revision: 179757
URL: http://llvm.org/viewvc/llvm-project?rev=179757&view=rev
Log:
LoopVectorize: Use a set to avoid longer cycles in the reduction chain too.
Fixes PR15748.
Modified:
llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/trunk/test/Transforms/LoopVectorize/phi-hang.ll
Modified: llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=179757&r1=179756&r2=179757&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)
+++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Thu Apr 18 09:29:13 2013
@@ -2733,7 +2733,10 @@ bool LoopVectorizationLegality::AddReduc
// used as reduction variables (such as ADD). We may have a single
// out-of-block user. The cycle must end with the original PHI.
Instruction *Iter = Phi;
- while (true) {
+
+ // Avoid cycles in the chain.
+ SmallPtrSet<Instruction *, 8> VisitedInsts;
+ while (VisitedInsts.insert(Iter)) {
// If the instruction has no users then this is a broken
// chain and can't be a reduction variable.
if (Iter->use_empty())
@@ -2747,9 +2750,6 @@ bool LoopVectorizationLegality::AddReduc
// Is this a bin op ?
FoundBinOp |= !isa<PHINode>(Iter);
- // Remember the current instruction.
- Instruction *OldIter = Iter;
-
// For each of the *users* of iter.
for (Value::use_iterator it = Iter->use_begin(), e = Iter->use_end();
it != e; ++it) {
@@ -2795,10 +2795,6 @@ bool LoopVectorizationLegality::AddReduc
Iter = U;
}
- // If all uses were skipped this can't be a reduction variable.
- if (Iter == OldIter)
- return false;
-
// We found a reduction var if we have reached the original
// phi node and we only have a single instruction with out-of-loop
// users.
@@ -2814,6 +2810,8 @@ bool LoopVectorizationLegality::AddReduc
return FoundBinOp && ExitInstruction;
}
}
+
+ return false;
}
bool
Modified: llvm/trunk/test/Transforms/LoopVectorize/phi-hang.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/phi-hang.ll?rev=179757&r1=179756&r2=179757&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/LoopVectorize/phi-hang.ll (original)
+++ llvm/trunk/test/Transforms/LoopVectorize/phi-hang.ll Thu Apr 18 09:29:13 2013
@@ -27,3 +27,21 @@ bb5:
bb11: ; preds = %bb5
ret void
}
+
+; PR15748
+define void @test2() {
+bb:
+ br label %bb1
+
+bb1: ; preds = %bb1, %bb
+ %tmp = phi i32 [ 0, %bb ], [ %tmp5, %bb1 ]
+ %tmp2 = phi i32 [ 0, %bb ], [ 1, %bb1 ]
+ %tmp3 = phi i32 [ 0, %bb ], [ %tmp4, %bb1 ]
+ %tmp4 = or i32 %tmp2, %tmp3
+ %tmp5 = add nsw i32 %tmp, 1
+ %tmp6 = icmp eq i32 %tmp5, 0
+ br i1 %tmp6, label %bb7, label %bb1
+
+bb7: ; preds = %bb1
+ ret void
+}
More information about the llvm-commits
mailing list