summaryrefslogtreecommitdiffstats
path: root/llvm/lib
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
commitf9f8482e3a24b899827362fe1acf02e876fca38b (patch)
tree7b9dc263acea63fa83266201c3cac2f877593fa5 /llvm/lib
parent47f46fd42c113a8d5323d4cee64817bb5c7532f4 (diff)
downloadbcm5719-llvm-f9f8482e3a24b899827362fe1acf02e876fca38b.tar.gz
bcm5719-llvm-f9f8482e3a24b899827362fe1acf02e876fca38b.zip
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. llvm-svn: 195773
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index f2a099ac691..78caab3b50a 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/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);
}
OpenPOWER on IntegriCloud