diff --git a/llvm/include/llvm/Support/InstructionCost.h b/llvm/include/llvm/Support/InstructionCost.h --- a/llvm/include/llvm/Support/InstructionCost.h +++ b/llvm/include/llvm/Support/InstructionCost.h @@ -28,7 +28,7 @@ class InstructionCost { public: - using CostType = int; + using CostType = int64_t; /// CostState describes the state of a cost. enum CostState { diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -5983,8 +5983,8 @@ bool LoopVectorizationCostModel::isMoreProfitable( const VectorizationFactor &A, const VectorizationFactor &B) const { - InstructionCost::CostType CostA = *A.Cost.getValue(); - InstructionCost::CostType CostB = *B.Cost.getValue(); + InstructionCost CostA = A.Cost; + InstructionCost CostB = B.Cost; unsigned MaxTripCount = PSE.getSE()->getSmallConstantMaxTripCount(TheLoop); @@ -5997,8 +5997,8 @@ // be PerIterationCost*floor(TC/VF) + Scalar remainder cost, and so is // approximated with the per-lane cost below instead of using the tripcount // as here. - int64_t RTCostA = CostA * divideCeil(MaxTripCount, A.Width.getFixedValue()); - int64_t RTCostB = CostB * divideCeil(MaxTripCount, B.Width.getFixedValue()); + auto RTCostA = CostA * divideCeil(MaxTripCount, A.Width.getFixedValue()); + auto RTCostB = CostB * divideCeil(MaxTripCount, B.Width.getFixedValue()); return RTCostA < RTCostB; } @@ -6569,10 +6569,14 @@ // A lambda that gets the register usage for the given type and VF. const auto &TTICapture = TTI; - auto GetRegUsage = [&TTICapture](Type *Ty, ElementCount VF) { + auto GetRegUsage = [&TTICapture](Type *Ty, ElementCount VF) -> unsigned { if (Ty->isTokenTy() || !VectorType::isValidElementType(Ty)) return 0; - return *TTICapture.getRegUsageForType(VectorType::get(Ty, VF)).getValue(); + InstructionCost::CostType RegUsage = + *TTICapture.getRegUsageForType(VectorType::get(Ty, VF)).getValue(); + assert(RegUsage >= 0 && RegUsage <= std::numeric_limits::max() && + "Nonsensical values for register usage."); + return RegUsage; }; for (unsigned int i = 0, s = IdxToInstr.size(); i < s; ++i) {