diff --git a/llvm/include/llvm/Transforms/Vectorize/LoopVectorizationLegality.h b/llvm/include/llvm/Transforms/Vectorize/LoopVectorizationLegality.h index 2d69c2f8664224..91f5676e0d1f40 100644 --- a/llvm/include/llvm/Transforms/Vectorize/LoopVectorizationLegality.h +++ b/llvm/include/llvm/Transforms/Vectorize/LoopVectorizationLegality.h @@ -352,20 +352,11 @@ class LoopVectorizationLegality { int isConsecutivePtr(Type *AccessTy, Value *Ptr) const; /// Returns true if the value V is uniform within the loop. - bool isUniform(Value *V); + bool isUniform(Value *V) const; /// A uniform memory op is a load or store which accesses the same memory /// location on all lanes. - bool isUniformMemOp(Instruction &I) { - Value *Ptr = getLoadStorePointerOperand(&I); - if (!Ptr) - return false; - // Note: There's nothing inherent which prevents predicated loads and - // stores from being uniform. The current lowering simply doesn't handle - // it; in particular, the cost model distinguishes scatter/gather from - // scalar w/predication, and we currently rely on the scalar path. - return isUniform(Ptr) && !blockNeedsPredication(I.getParent()); - } + bool isUniformMemOp(Instruction &I) const; /// Returns the information that we collected about runtime memory check. const RuntimePointerChecking *getRuntimePointerChecking() const { diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp index 303f6143b8442e..f39fab1dbafdae 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp @@ -462,10 +462,21 @@ int LoopVectorizationLegality::isConsecutivePtr(Type *AccessTy, return 0; } -bool LoopVectorizationLegality::isUniform(Value *V) { +bool LoopVectorizationLegality::isUniform(Value *V) const { return LAI->isUniform(V); } +bool LoopVectorizationLegality::isUniformMemOp(Instruction &I) const { + Value *Ptr = getLoadStorePointerOperand(&I); + if (!Ptr) + return false; + // Note: There's nothing inherent which prevents predicated loads and + // stores from being uniform. The current lowering simply doesn't handle + // it; in particular, the cost model distinguishes scatter/gather from + // scalar w/predication, and we currently rely on the scalar path. + return isUniform(Ptr) && !blockNeedsPredication(I.getParent()); +} + bool LoopVectorizationLegality::canVectorizeOuterLoop() { assert(!TheLoop->isInnermost() && "We are not vectorizing an outer loop."); // Store the result and return it at the end instead of exiting early, in case