summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorErik Eckstein <eeckstein@apple.com>2014-08-02 19:39:42 +0000
committerErik Eckstein <eeckstein@apple.com>2014-08-02 19:39:42 +0000
commit26a1bf7d84c91d8a986cb2093eaf606daa4fece8 (patch)
treea0f555b59267d07eb5b46e2317056a65f562ee0e /llvm/lib/Transforms
parent6b999ae68286f9da1070022388adf4d8800fe88d (diff)
downloadbcm5719-llvm-26a1bf7d84c91d8a986cb2093eaf606daa4fece8.tar.gz
bcm5719-llvm-26a1bf7d84c91d8a986cb2093eaf606daa4fece8.zip
fix bug 20513 - Crash in SLP Vectorizer
llvm-svn: 214638
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp24
1 files changed, 14 insertions, 10 deletions
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index cb9def22542..c91ca280033 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -806,7 +806,7 @@ private:
/// Performs the "real" scheduling. Done before vectorization is actually
/// performed in a basic block.
- void scheduleBlock(BasicBlock *BB);
+ void scheduleBlock(BlockScheduling *BS);
/// List of users to ignore during scheduling and that don't need extracting.
ArrayRef<Value *> UserIgnoreList;
@@ -1741,8 +1741,6 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
setInsertPointAfterBundle(E->Scalars);
return Gather(E->Scalars, VecTy);
}
- BasicBlock *BB = VL0->getParent();
- scheduleBlock(BB);
unsigned Opcode = getSameOpcode(E->Scalars);
@@ -2076,6 +2074,12 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
}
Value *BoUpSLP::vectorizeTree() {
+
+ // All blocks must be scheduled before any instructions are inserted.
+ for (auto &BSIter : BlocksSchedules) {
+ scheduleBlock(BSIter.second.get());
+ }
+
Builder.SetInsertPoint(F->getEntryBlock().begin());
vectorizeTree(&VectorizableTree[0]);
@@ -2548,12 +2552,12 @@ void BoUpSLP::BlockScheduling::resetSchedule() {
ReadyInsts.clear();
}
-void BoUpSLP::scheduleBlock(BasicBlock *BB) {
- DEBUG(dbgs() << "SLP: schedule block " << BB->getName() << "\n");
-
- BlockScheduling *BS = BlocksSchedules[BB].get();
- if (!BS || !BS->ScheduleStart)
+void BoUpSLP::scheduleBlock(BlockScheduling *BS) {
+
+ if (!BS->ScheduleStart)
return;
+
+ DEBUG(dbgs() << "SLP: schedule block " << BS->BB->getName() << "\n");
BS->resetSchedule();
@@ -2598,8 +2602,8 @@ void BoUpSLP::scheduleBlock(BasicBlock *BB) {
while (BundleMember) {
Instruction *pickedInst = BundleMember->Inst;
if (LastScheduledInst->getNextNode() != pickedInst) {
- BB->getInstList().remove(pickedInst);
- BB->getInstList().insert(LastScheduledInst, pickedInst);
+ BS->BB->getInstList().remove(pickedInst);
+ BS->BB->getInstList().insert(LastScheduledInst, pickedInst);
}
LastScheduledInst = pickedInst;
BundleMember = BundleMember->NextInBundle;
OpenPOWER on IntegriCloud