summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-04-01 17:28:15 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-04-01 17:28:15 +0000
commit6f1f85f0e1bc88b1151080edddbe4794a0b81b32 (patch)
tree3a8b0152ac404ee901a3c4ca9184285b39d23112 /llvm/lib
parentf7f52ef65df2efbb6619be15afd0864c84466346 (diff)
downloadbcm5719-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.cpp11
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());
OpenPOWER on IntegriCloud