forked from OSchip/llvm-project
[RISCV] Add cost modelling for vector widenning reduction.
In RVV, we use vwredsum.vs and vwredsumu.vs for vecreduce.add(ext(Ty A)) if the result type's width is twice of the input vector's SEW-width. In this situation, the cost of extended add reduction should be same as single-width add reduction. So as the vector float widenning reduction. Differential Revision: https://reviews.llvm.org/D129994
This commit is contained in:
parent
6f867f9102
commit
b61cfc91ea
|
@ -377,6 +377,32 @@ RISCVTTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *Ty,
|
|||
return (LT.first - 1) + BaseCost + Log2_32_Ceil(VL);
|
||||
}
|
||||
|
||||
InstructionCost RISCVTTIImpl::getExtendedReductionCost(
|
||||
unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *ValTy,
|
||||
Optional<FastMathFlags> FMF, TTI::TargetCostKind CostKind) {
|
||||
if (isa<FixedVectorType>(ValTy) && !ST->useRVVForFixedLengthVectors())
|
||||
return BaseT::getExtendedReductionCost(Opcode, IsUnsigned, ResTy, ValTy,
|
||||
FMF, CostKind);
|
||||
|
||||
// Skip if scalar size of ResTy is bigger than ELEN.
|
||||
if (ResTy->getScalarSizeInBits() > ST->getELEN())
|
||||
return BaseT::getExtendedReductionCost(Opcode, IsUnsigned, ResTy, ValTy,
|
||||
FMF, CostKind);
|
||||
|
||||
if (Opcode != Instruction::Add && Opcode != Instruction::FAdd)
|
||||
return BaseT::getExtendedReductionCost(Opcode, IsUnsigned, ResTy, ValTy,
|
||||
FMF, CostKind);
|
||||
|
||||
std::pair<InstructionCost, MVT> LT = TLI->getTypeLegalizationCost(DL, ValTy);
|
||||
|
||||
if (ResTy->getScalarSizeInBits() != 2 * LT.second.getScalarSizeInBits())
|
||||
return BaseT::getExtendedReductionCost(Opcode, IsUnsigned, ResTy, ValTy,
|
||||
FMF, CostKind);
|
||||
|
||||
return (LT.first - 1) +
|
||||
getArithmeticReductionCost(Opcode, ValTy, FMF, CostKind);
|
||||
}
|
||||
|
||||
void RISCVTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP,
|
||||
OptimizationRemarkEmitter *ORE) {
|
||||
|
|
|
@ -112,6 +112,11 @@ public:
|
|||
Optional<FastMathFlags> FMF,
|
||||
TTI::TargetCostKind CostKind);
|
||||
|
||||
InstructionCost getExtendedReductionCost(unsigned Opcode, bool IsUnsigned,
|
||||
Type *ResTy, VectorType *ValTy,
|
||||
Optional<FastMathFlags> FMF,
|
||||
TTI::TargetCostKind CostKind);
|
||||
|
||||
bool isElementTypeLegalForScalableVector(Type *Ty) const {
|
||||
return TLI->isLegalElementTypeForRVV(Ty);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue