diff options
Diffstat (limited to 'lib/Transforms/Vectorize/LoopVectorize.cpp')
-rw-r--r-- | lib/Transforms/Vectorize/LoopVectorize.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp index 4803a9d038..4bb8c43656 100644 --- a/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/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()); |