diff options
author | Nadav Rotem <nrotem@apple.com> | 2013-11-26 17:29:19 +0000 |
---|---|---|
committer | Nadav Rotem <nrotem@apple.com> | 2013-11-26 17:29:19 +0000 |
commit | bba8da2ba0e4e88ba8b8125c6754d653c8ef1ef7 (patch) | |
tree | cd3158ea79eef96bfcd9c75c9e58671a98313bb4 /lib/Transforms/Vectorize | |
parent | 15f7d261b5443e3b2259480ccd7bbcd1de5bfc54 (diff) | |
download | llvm-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.cpp | 8 |
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); } |