[PATCH] D15580: [SLPVectorizer] Ensure dominated reduction values.
Charlie Turner via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 16 10:27:01 PST 2015
This revision was automatically updated to reflect the committed changes.
Closed by commit rL255792: [SLPVectorizer] Ensure dominated reduction values. (authored by chatur01).
Changed prior to commit:
http://reviews.llvm.org/D15580?vs=43023&id=43027#toc
Repository:
rL LLVM
http://reviews.llvm.org/D15580
Files:
llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp
Index: llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp
===================================================================
--- llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -3940,8 +3940,17 @@
///
/// \returns A candidate reduction value if possible, or \code nullptr \endcode
/// if not possible.
-static Value *getReductionValue(PHINode *P, BasicBlock *ParentBB,
- LoopInfo *LI) {
+static Value *getReductionValue(const DominatorTree *DT, PHINode *P,
+ BasicBlock *ParentBB, LoopInfo *LI) {
+ // There are situations where the reduction value is not dominated by the
+ // reduction phi. Vectorizing such cases has been reported to cause
+ // miscompiles. See PR25787.
+ auto DominatedReduxValue = [&](Value *R) {
+ return (
+ dyn_cast<Instruction>(R) &&
+ DT->dominates(P->getParent(), dyn_cast<Instruction>(R)->getParent()));
+ };
+
Value *Rdx = nullptr;
// Return the incoming value if it comes from the same BB as the phi node.
@@ -3951,16 +3960,16 @@
Rdx = P->getIncomingValue(1);
}
- if (Rdx)
+ if (Rdx && DominatedReduxValue(Rdx))
return Rdx;
// Otherwise, check whether we have a loop latch to look at.
Loop *BBL = LI->getLoopFor(ParentBB);
if (!BBL)
- return Rdx;
+ return nullptr;
BasicBlock *BBLatch = BBL->getLoopLatch();
if (!BBLatch)
- return Rdx;
+ return nullptr;
// There is a loop latch, return the incoming value if it comes from
// that. This reduction pattern occassionaly turns up.
@@ -3970,7 +3979,10 @@
Rdx = P->getIncomingValue(1);
}
- return Rdx;
+ if (Rdx && DominatedReduxValue(Rdx))
+ return Rdx;
+
+ return nullptr;
}
/// \brief Attempt to reduce a horizontal reduction.
@@ -4065,7 +4077,7 @@
if (P->getNumIncomingValues() != 2)
return Changed;
- Value *Rdx = getReductionValue(P, BB, LI);
+ Value *Rdx = getReductionValue(DT, P, BB, LI);
// Check if this is a Binary Operator.
BinaryOperator *BI = dyn_cast_or_null<BinaryOperator>(Rdx);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D15580.43027.patch
Type: text/x-patch
Size: 2157 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151216/a05a8783/attachment.bin>
More information about the llvm-commits
mailing list