diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2016-04-01 17:28:15 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2016-04-01 17:28:15 +0000 |
| commit | 6f1f85f0e1bc88b1151080edddbe4794a0b81b32 (patch) | |
| tree | 3a8b0152ac404ee901a3c4ca9184285b39d23112 /llvm/lib | |
| parent | f7f52ef65df2efbb6619be15afd0864c84466346 (diff) | |
| download | bcm5719-llvm-6f1f85f0e1bc88b1151080edddbe4794a0b81b32.tar.gz bcm5719-llvm-6f1f85f0e1bc88b1151080edddbe4794a0b81b32.zip | |
[SLPVectorizer] Don't insert an extractelement before a catchswitch
A catchswitch cannot be preceded by another instruction in the same
basic block (other than a PHI node).
Instead, insert the extract element right after the materialization of
the vectorized value. This isn't optimal but is a reasonable compromise
given the constraints of WinEH.
This fixes PR27163.
llvm-svn: 265157
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index aac1f9acf48..0254ef47225 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -2570,11 +2570,18 @@ Value *BoUpSLP::vectorizeTree() { Value *Lane = Builder.getInt32(it->Lane); // Generate extracts for out-of-tree users. // Find the insertion point for the extractelement lane. - if (isa<Instruction>(Vec)){ + if (auto *VecI = dyn_cast<Instruction>(Vec)) { if (PHINode *PH = dyn_cast<PHINode>(User)) { for (int i = 0, e = PH->getNumIncomingValues(); i != e; ++i) { if (PH->getIncomingValue(i) == Scalar) { - Builder.SetInsertPoint(PH->getIncomingBlock(i)->getTerminator()); + TerminatorInst *IncomingTerminator = + PH->getIncomingBlock(i)->getTerminator(); + if (isa<CatchSwitchInst>(IncomingTerminator)) { + Builder.SetInsertPoint(VecI->getParent(), + std::next(VecI->getIterator())); + } else { + Builder.SetInsertPoint(PH->getIncomingBlock(i)->getTerminator()); + } Value *Ex = Builder.CreateExtractElement(Vec, Lane); if (MinBWs.count(ScalarRoot)) Ex = Builder.CreateSExt(Ex, Scalar->getType()); |

