summaryrefslogtreecommitdiff
path: root/lib/Transforms/Vectorize
diff options
context:
space:
mode:
authorNadav Rotem <nrotem@apple.com>2013-08-02 18:40:24 +0000
committerNadav Rotem <nrotem@apple.com>2013-08-02 18:40:24 +0000
commitf2855f88864cb00c774114b80b78f2388821b8ca (patch)
tree5565f4a8c08d17ccacd27bbba6a0444f474a3d5a /lib/Transforms/Vectorize
parent38140c2bbe80d146f59863b96947e83f4942bda0 (diff)
downloadllvm-f2855f88864cb00c774114b80b78f2388821b8ca.tar.gz
llvm-f2855f88864cb00c774114b80b78f2388821b8ca.tar.bz2
llvm-f2855f88864cb00c774114b80b78f2388821b8ca.tar.xz
SLPVectorizer: Fix PR16777. PHInodes may use multiple extracted values that come from different blocks.
Thanks Alexey Samsonov. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187663 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Vectorize')
-rw-r--r--lib/Transforms/Vectorize/SLPVectorizer.cpp23
1 files changed, 13 insertions, 10 deletions
diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp b/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 60d294b259..9312b4bb4b 100644
--- a/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -1401,30 +1401,33 @@ void BoUpSLP::vectorizeTree() {
Value *Vec = E->VectorizedValue;
assert(Vec && "Can't find vectorizable value");
+ Value *Lane = Builder.getInt32(it->Lane);
// Generate extracts for out-of-tree users.
// Find the insertion point for the extractelement lane.
- Instruction *Loc = 0;
if (PHINode *PN = dyn_cast<PHINode>(Vec)) {
- Loc = PN->getParent()->getFirstInsertionPt();
+ Builder.SetInsertPoint(PN->getParent()->getFirstInsertionPt());
+ Value *Ex = Builder.CreateExtractElement(Vec, Lane);
+ User->replaceUsesOfWith(Scalar, Ex);
} else if (isa<Instruction>(Vec)){
if (PHINode *PH = dyn_cast<PHINode>(User)) {
for (int i = 0, e = PH->getNumIncomingValues(); i != e; ++i) {
if (PH->getIncomingValue(i) == Scalar) {
- Loc = PH->getIncomingBlock(i)->getTerminator();
- break;
+ Builder.SetInsertPoint(PH->getIncomingBlock(i)->getTerminator());
+ Value *Ex = Builder.CreateExtractElement(Vec, Lane);
+ PH->setOperand(i, Ex);
}
}
- assert(Loc && "Unable to find incoming value for the PHI");
} else {
- Loc = cast<Instruction>(User);
+ Builder.SetInsertPoint(cast<Instruction>(User));
+ Value *Ex = Builder.CreateExtractElement(Vec, Lane);
+ User->replaceUsesOfWith(Scalar, Ex);
}
} else {
- Loc = F->getEntryBlock().begin();
+ Builder.SetInsertPoint(F->getEntryBlock().begin());
+ Value *Ex = Builder.CreateExtractElement(Vec, Lane);
+ User->replaceUsesOfWith(Scalar, Ex);
}
- Builder.SetInsertPoint(Loc);
- Value *Ex = Builder.CreateExtractElement(Vec, Builder.getInt32(it->Lane));
- User->replaceUsesOfWith(Scalar, Ex);
DEBUG(dbgs() << "SLP: Replaced:" << *User << ".\n");
}