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. |
} |