| Index: lib/Transforms/Vectorize/LoopVectorize.cpp
|
| diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp
|
| index 11ee99ddf18019c9db53c97ccee0bc9c7cd405d6..491e9cc248095b950776c2c896f82d469816152d 100644
|
| --- a/lib/Transforms/Vectorize/LoopVectorize.cpp
|
| +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp
|
| @@ -80,7 +80,6 @@
|
| #include "llvm/Support/Debug.h"
|
| #include "llvm/Support/PatternMatch.h"
|
| #include "llvm/Support/raw_ostream.h"
|
| -#include "llvm/Support/ValueHandle.h"
|
| #include "llvm/Target/TargetLibraryInfo.h"
|
| #include "llvm/Transforms/Scalar.h"
|
| #include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
| @@ -217,7 +216,7 @@ private:
|
| /// This function adds 0, 1, 2 ... to each vector element, starting at zero.
|
| /// If Negate is set then negative numbers are added e.g. (0, -1, -2, ...).
|
| /// The sequence starts at StartIndex.
|
| - Value *getConsecutiveVector(Value* Val, int StartIdx, bool Negate);
|
| + Value *getConsecutiveVector(Value* Val, unsigned StartIdx, bool Negate);
|
|
|
| /// When we go over instructions in the basic block we rely on previous
|
| /// values within the current basic block or on loop invariant values.
|
| @@ -383,7 +382,7 @@ public:
|
|
|
| // The starting value of the reduction.
|
| // It does not have to be zero!
|
| - TrackingVH<Value> StartValue;
|
| + Value *StartValue;
|
| // The instruction who's value is used outside the loop.
|
| Instruction *LoopExitInstr;
|
| // The kind of the reduction.
|
| @@ -428,7 +427,7 @@ public:
|
| /// This flag indicates if we need to add the runtime check.
|
| bool Need;
|
| /// Holds the pointers that we need to check.
|
| - SmallVector<TrackingVH<Value>, 2> Pointers;
|
| + SmallVector<Value*, 2> Pointers;
|
| /// Holds the pointer value at the beginning of the loop.
|
| SmallVector<const SCEV*, 2> Starts;
|
| /// Holds the pointer value at the end of the loop.
|
| @@ -442,7 +441,7 @@ public:
|
| InductionInfo(Value *Start, InductionKind K) : StartValue(Start), IK(K) {}
|
| InductionInfo() : StartValue(0), IK(IK_NoInduction) {}
|
| /// Start value.
|
| - TrackingVH<Value> StartValue;
|
| + Value *StartValue;
|
| /// Induction kind.
|
| InductionKind IK;
|
| };
|
| @@ -830,7 +829,7 @@ Value *InnerLoopVectorizer::getBroadcastInstrs(Value *V) {
|
| return Shuf;
|
| }
|
|
|
| -Value *InnerLoopVectorizer::getConsecutiveVector(Value* Val, int StartIdx,
|
| +Value *InnerLoopVectorizer::getConsecutiveVector(Value* Val, unsigned StartIdx,
|
| bool Negate) {
|
| assert(Val->getType()->isVectorTy() && "Must be a vector");
|
| assert(Val->getType()->getScalarType()->isIntegerTy() &&
|
| @@ -843,8 +842,8 @@ Value *InnerLoopVectorizer::getConsecutiveVector(Value* Val, int StartIdx,
|
|
|
| // Create a vector of consecutive numbers from zero to VF.
|
| for (int i = 0; i < VLen; ++i) {
|
| - int64_t Idx = Negate ? (-i) : i;
|
| - Indices.push_back(ConstantInt::get(ITy, StartIdx + Idx, Negate));
|
| + int Idx = Negate ? (-i): i;
|
| + Indices.push_back(ConstantInt::get(ITy, StartIdx + Idx));
|
| }
|
|
|
| // Add the consecutive indices to the vector value.
|
| @@ -964,7 +963,7 @@ void InnerLoopVectorizer::vectorizeMemoryInstruction(Instruction *Instr,
|
| Type *DataTy = VectorType::get(ScalarDataTy, VF);
|
| Value *Ptr = LI ? LI->getPointerOperand() : SI->getPointerOperand();
|
| unsigned Alignment = LI ? LI->getAlignment() : SI->getAlignment();
|
| - unsigned AddressSpace = Ptr->getType()->getPointerAddressSpace();
|
| +
|
| unsigned ScalarAllocatedSize = DL->getTypeAllocSize(ScalarDataTy);
|
| unsigned VectorElementSize = DL->getTypeStoreSize(DataTy)/VF;
|
|
|
| @@ -1039,7 +1038,7 @@ void InnerLoopVectorizer::vectorizeMemoryInstruction(Instruction *Instr,
|
| PartPtr = Builder.CreateGEP(PartPtr, Builder.getInt32(1 - VF));
|
| }
|
|
|
| - Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo(AddressSpace));
|
| + Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo());
|
| Builder.CreateStore(StoredVal[Part], VecPtr)->setAlignment(Alignment);
|
| }
|
| }
|
| @@ -1055,7 +1054,7 @@ void InnerLoopVectorizer::vectorizeMemoryInstruction(Instruction *Instr,
|
| PartPtr = Builder.CreateGEP(PartPtr, Builder.getInt32(1 - VF));
|
| }
|
|
|
| - Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo(AddressSpace));
|
| + Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo());
|
| Value *LI = Builder.CreateLoad(VecPtr, "wide.load");
|
| cast<LoadInst>(LI)->setAlignment(Alignment);
|
| Entry[Part] = Reverse ? reverseVector(LI) : LI;
|
| @@ -2073,8 +2072,7 @@ InnerLoopVectorizer::vectorizeBlockInLoop(LoopVectorizationLegality *Legal,
|
| // After broadcasting the induction variable we need to make the
|
| // vector consecutive by adding ... -3, -2, -1, 0.
|
| for (unsigned part = 0; part < UF; ++part)
|
| - Entry[part] = getConsecutiveVector(Broadcasted, -(int)VF * part,
|
| - true);
|
| + Entry[part] = getConsecutiveVector(Broadcasted, -VF * part, true);
|
| continue;
|
| }
|
|
|
| @@ -2308,10 +2306,7 @@ bool LoopVectorizationLegality::canVectorizeWithIfConvert() {
|
| }
|
|
|
| bool LoopVectorizationLegality::canVectorize() {
|
| - // We must have a loop in canonical form. Loops with indirectbr in them cannot
|
| - // be canonicalized.
|
| - if (!TheLoop->getLoopPreheader())
|
| - return false;
|
| + assert(TheLoop->getLoopPreheader() && "No preheader!!");
|
|
|
| // We can only vectorize innermost loops.
|
| if (TheLoop->getSubLoopsVector().size())
|
| @@ -2378,26 +2373,6 @@ bool LoopVectorizationLegality::canVectorize() {
|
| return true;
|
| }
|
|
|
| -/// \brief Check that the instruction has outside loop users and is not an
|
| -/// identified reduction variable.
|
| -static bool hasOutsideLoopUser(const Loop *TheLoop, Instruction *Inst,
|
| - SmallPtrSet<Value *, 4> &Reductions) {
|
| - // Reduction instructions are allowed to have exit users. All other
|
| - // instructions must not have external users.
|
| - if (!Reductions.count(Inst))
|
| - //Check that all of the users of the loop are inside the BB.
|
| - for (Value::use_iterator I = Inst->use_begin(), E = Inst->use_end();
|
| - I != E; ++I) {
|
| - Instruction *U = cast<Instruction>(*I);
|
| - // This user may be a reduction exit value.
|
| - if (!TheLoop->contains(U)) {
|
| - DEBUG(dbgs() << "LV: Found an outside user for : "<< *U << "\n");
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| bool LoopVectorizationLegality::canVectorizeInstrs() {
|
| BasicBlock *PreHeader = TheLoop->getLoopPreheader();
|
| BasicBlock *Header = TheLoop->getHeader();
|
| @@ -2436,13 +2411,8 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
| // If this PHINode is not in the header block, then we know that we
|
| // can convert it to select during if-conversion. No need to check if
|
| // the PHIs in this block are induction or reduction variables.
|
| - if (*bb != Header) {
|
| - // Check that this instruction has no outside users or is an
|
| - // identified reduction value with an outside user.
|
| - if(!hasOutsideLoopUser(TheLoop, it, AllowedExit))
|
| - continue;
|
| - return false;
|
| - }
|
| + if (*bb != Header)
|
| + continue;
|
|
|
| // We only allow if-converted PHIs with more than two incoming values.
|
| if (Phi->getNumIncomingValues() != 2) {
|
| @@ -2535,9 +2505,17 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
|
|
|
| // Reduction instructions are allowed to have exit users.
|
| // All other instructions must not have external users.
|
| - if (hasOutsideLoopUser(TheLoop, it, AllowedExit))
|
| - return false;
|
| -
|
| + if (!AllowedExit.count(it))
|
| + //Check that all of the users of the loop are inside the BB.
|
| + for (Value::use_iterator I = it->use_begin(), E = it->use_end();
|
| + I != E; ++I) {
|
| + Instruction *U = cast<Instruction>(*I);
|
| + // This user may be a reduction exit value.
|
| + if (!TheLoop->contains(U)) {
|
| + DEBUG(dbgs() << "LV: Found an outside user for : "<< *U << "\n");
|
| + return false;
|
| + }
|
| + }
|
| } // next instr.
|
|
|
| }
|
|
|