summaryrefslogtreecommitdiff
path: root/lib/Transforms/Vectorize
diff options
context:
space:
mode:
authorNadav Rotem <nrotem@apple.com>2013-11-26 17:29:19 +0000
committerNadav Rotem <nrotem@apple.com>2013-11-26 17:29:19 +0000
commitbba8da2ba0e4e88ba8b8125c6754d653c8ef1ef7 (patch)
treecd3158ea79eef96bfcd9c75c9e58671a98313bb4 /lib/Transforms/Vectorize
parent15f7d261b5443e3b2259480ccd7bbcd1de5bfc54 (diff)
downloadllvm-bba8da2ba0e4e88ba8b8125c6754d653c8ef1ef7.tar.gz
llvm-bba8da2ba0e4e88ba8b8125c6754d653c8ef1ef7.tar.bz2
llvm-bba8da2ba0e4e88ba8b8125c6754d653c8ef1ef7.tar.xz
PR18060 - When we RAUW values with ExtractElement instructions in some cases
we generate PHI nodes with multiple entries from the same basic block but with different values. Enabling CSE on ExtractElement instructions make sure that all of the RAUWed instructions are the same. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195773 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Vectorize')
-rw-r--r--lib/Transforms/Vectorize/SLPVectorizer.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp b/lib/Transforms/Vectorize/SLPVectorizer.cpp
index f2a099ac69..78caab3b50 100644
--- a/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -1591,6 +1591,8 @@ Value *BoUpSLP::vectorizeTree() {
if (PHINode *PN = dyn_cast<PHINode>(Vec)) {
Builder.SetInsertPoint(PN->getParent()->getFirstInsertionPt());
Value *Ex = Builder.CreateExtractElement(Vec, Lane);
+ if (Instruction *Ins = dyn_cast<Instruction>(Ex))
+ GatherSeq.insert(Ins);
User->replaceUsesOfWith(Scalar, Ex);
} else if (isa<Instruction>(Vec)){
if (PHINode *PH = dyn_cast<PHINode>(User)) {
@@ -1598,17 +1600,23 @@ Value *BoUpSLP::vectorizeTree() {
if (PH->getIncomingValue(i) == Scalar) {
Builder.SetInsertPoint(PH->getIncomingBlock(i)->getTerminator());
Value *Ex = Builder.CreateExtractElement(Vec, Lane);
+ if (Instruction *Ins = dyn_cast<Instruction>(Ex))
+ GatherSeq.insert(Ins);
PH->setOperand(i, Ex);
}
}
} else {
Builder.SetInsertPoint(cast<Instruction>(User));
Value *Ex = Builder.CreateExtractElement(Vec, Lane);
+ if (Instruction *Ins = dyn_cast<Instruction>(Ex))
+ GatherSeq.insert(Ins);
User->replaceUsesOfWith(Scalar, Ex);
}
} else {
Builder.SetInsertPoint(F->getEntryBlock().begin());
Value *Ex = Builder.CreateExtractElement(Vec, Lane);
+ if (Instruction *Ins = dyn_cast<Instruction>(Ex))
+ GatherSeq.insert(Ins);
User->replaceUsesOfWith(Scalar, Ex);
}