summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
diff options
context:
space:
mode:
authorNadav Rotem <nrotem@apple.com>2013-07-12 00:04:18 +0000
committerNadav Rotem <nrotem@apple.com>2013-07-12 00:04:18 +0000
commitfa3c2db211dbc780777ccc8092cee8a7f002739f (patch)
tree0b4478246e053a9d63176eea9615a566fb17da86 /llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
parent05b3a8b60443c7521c6afd5974a6fa9b21757f9c (diff)
downloadbcm5719-llvm-fa3c2db211dbc780777ccc8092cee8a7f002739f.tar.gz
bcm5719-llvm-fa3c2db211dbc780777ccc8092cee8a7f002739f.zip
SLPVectorize: Replace the code that checks for vectorization candidates in successor blocks with code that scans PHINodes.
Before we could vectorize PHINodes scanning successors was a good way of finding candidates. Now we can vectorize the phinodes which is simpler. llvm-svn: 186139
Diffstat (limited to 'llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp')
-rw-r--r--llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp47
1 files changed, 22 insertions, 25 deletions
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 7b9be652d44..2cf843da5df 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -1550,8 +1550,7 @@ private:
/// \brief Try to vectorize a chain that starts at two arithmetic instrs.
bool tryToVectorizePair(Value *A, Value *B, BoUpSLP &R);
- /// \brief Try to vectorize a list of operands. If \p NeedExtracts is true
- /// then we calculate the cost of extracting the scalars from the vector.
+ /// \brief Try to vectorize a list of operands.
/// \returns true if a value was vectorized.
bool tryToVectorizeList(ArrayRef<Value *> VL, BoUpSLP &R);
@@ -1791,6 +1790,27 @@ bool SLPVectorizer::tryToVectorize(BinaryOperator *V, BoUpSLP &R) {
bool SLPVectorizer::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
bool Changed = false;
+ SmallVector<Value *, 4> Incoming;
+ // Collect the incoming values from the PHIs.
+ for (BasicBlock::iterator instr = BB->begin(), ie = BB->end(); instr != ie;
+ ++instr) {
+ PHINode *P = dyn_cast<PHINode>(instr);
+
+ if (!P)
+ break;
+
+ // Stop constructing the list when you reach a different type.
+ if (Incoming.size() && P->getType() != Incoming[0]->getType()) {
+ Changed |= tryToVectorizeList(Incoming, R);
+ Incoming.clear();
+ }
+
+ Incoming.push_back(P);
+ }
+
+ if (Incoming.size() > 1)
+ Changed |= tryToVectorizeList(Incoming, R);
+
for (BasicBlock::iterator it = BB->begin(), e = BB->end(); it != e; ++it) {
if (isa<DbgInfoIntrinsic>(it))
continue;
@@ -1831,29 +1851,6 @@ bool SLPVectorizer::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
}
}
- // Scan the PHINodes in our successors in search for pairing hints.
- for (succ_iterator it = succ_begin(BB), e = succ_end(BB); it != e; ++it) {
- BasicBlock *Succ = *it;
- SmallVector<Value *, 4> Incoming;
-
- // Collect the incoming values from the PHIs.
- for (BasicBlock::iterator instr = Succ->begin(), ie = Succ->end();
- instr != ie; ++instr) {
- PHINode *P = dyn_cast<PHINode>(instr);
-
- if (!P)
- break;
-
- Value *V = P->getIncomingValueForBlock(BB);
- if (Instruction *I = dyn_cast<Instruction>(V))
- if (I->getParent() == BB)
- Incoming.push_back(I);
- }
-
- if (Incoming.size() > 1)
- Changed |= tryToVectorizeList(Incoming, R);
- }
-
return Changed;
}
OpenPOWER on IntegriCloud