summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorNadav Rotem <nrotem@apple.com>2013-01-11 07:11:59 +0000
committerNadav Rotem <nrotem@apple.com>2013-01-11 07:11:59 +0000
commit853fe0acb96c40afb5db9f211b15a3672553a196 (patch)
tree7f2622571e5094788be6b9d1b95fe52c5301542c /llvm/lib/Transforms
parentf1bb07f1d831cfa47ccc701c03b8308c0988b9ea (diff)
downloadbcm5719-llvm-853fe0acb96c40afb5db9f211b15a3672553a196.tar.gz
bcm5719-llvm-853fe0acb96c40afb5db9f211b15a3672553a196.zip
ARM Cost Model: We need to detect the max bitwidth of types in the loop in order to select the max vectorization factor.
We don't have a detailed analysis on which values are vectorized and which stay scalars in the vectorized loop so we use another method. We look at reduction variables, loads and stores, which are the only ways to get information in and out of loop iterations. If the data types are extended and truncated then the cost model will catch the cost of the vector zext/sext/trunc operations. llvm-svn: 172178
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Vectorize/LoopVectorize.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 4803a9d038c..4bb8c436564 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -2635,7 +2635,7 @@ LoopVectorizationCostModel::selectVectorizationFactor(bool OptForSize,
assert(MaxVectorSize <= 32 && "Did not expect to pack so many elements"
" into one vector.");
-
+
unsigned VF = MaxVectorSize;
// If we optimize the program for size, avoid creating the tail loop.
@@ -2697,17 +2697,23 @@ unsigned LoopVectorizationCostModel::getWidestType() {
// For each instruction in the loop.
for (BasicBlock::iterator it = BB->begin(), e = BB->end(); it != e; ++it) {
- if (Legal->isUniformAfterVectorization(it))
+ Type *T = it->getType();
+
+ // Only examine Loads, Stores and PHINodes.
+ if (!isa<LoadInst>(it) && !isa<StoreInst>(it) && !isa<PHINode>(it))
continue;
- Type *T = it->getType();
+ // Examine PHI nodes that are reduction variables.
+ if (PHINode *PN = dyn_cast<PHINode>(it))
+ if (!Legal->getReductionVars()->count(PN))
+ continue;
+ // Examine the stored values.
if (StoreInst *ST = dyn_cast<StoreInst>(it))
T = ST->getValueOperand()->getType();
- // PHINodes and pointers are difficult to analyze, but we catch all other
- // uses of the types in other instructions.
- if (isa<PHINode>(it) || T->isPointerTy() || T->isVoidTy())
+ // Ignore stored/loaded pointer types.
+ if (T->isPointerTy())
continue;
MaxWidth = std::max(MaxWidth, T->getScalarSizeInBits());
OpenPOWER on IntegriCloud