@@ -970,42 +970,13 @@ RISCVTTIImpl::getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty,
970970 }
971971
972972 // IR Reduction is composed by two vmv and one rvv reduction instruction.
973- unsigned SplitOp;
974- SmallVector<unsigned , 3 > Opcodes;
975- switch (IID) {
976- default :
977- llvm_unreachable (" Unsupported intrinsic" );
978- case Intrinsic::smax:
979- SplitOp = RISCV::VMAX_VV;
980- Opcodes = {RISCV::VMV_S_X, RISCV::VREDMAX_VS, RISCV::VMV_X_S};
981- break ;
982- case Intrinsic::smin:
983- SplitOp = RISCV::VMIN_VV;
984- Opcodes = {RISCV::VMV_S_X, RISCV::VREDMIN_VS, RISCV::VMV_X_S};
985- break ;
986- case Intrinsic::umax:
987- SplitOp = RISCV::VMAXU_VV;
988- Opcodes = {RISCV::VMV_S_X, RISCV::VREDMAXU_VS, RISCV::VMV_X_S};
989- break ;
990- case Intrinsic::umin:
991- SplitOp = RISCV::VMINU_VV;
992- Opcodes = {RISCV::VMV_S_X, RISCV::VREDMINU_VS, RISCV::VMV_X_S};
993- break ;
994- case Intrinsic::maxnum:
995- SplitOp = RISCV::VFMAX_VV;
996- Opcodes = {RISCV::VFMV_S_F, RISCV::VFREDMAX_VS, RISCV::VFMV_F_S};
997- break ;
998- case Intrinsic::minnum:
999- SplitOp = RISCV::VFMIN_VV;
1000- Opcodes = {RISCV::VFMV_S_F, RISCV::VFREDMIN_VS, RISCV::VFMV_F_S};
1001- break ;
1002- }
1003- // Add a cost for data larger than LMUL8
1004- InstructionCost SplitCost =
1005- (LT.first > 1 ) ? (LT.first - 1 ) *
1006- getRISCVInstructionCost (SplitOp, LT.second , CostKind)
1007- : 0 ;
1008- return SplitCost + getRISCVInstructionCost (Opcodes, LT.second , CostKind);
973+ InstructionCost BaseCost = 2 ;
974+
975+ if (CostKind == TTI::TCK_CodeSize)
976+ return (LT.first - 1 ) + BaseCost;
977+
978+ unsigned VL = getEstimatedVLFor (Ty);
979+ return (LT.first - 1 ) + BaseCost + Log2_32_Ceil (VL);
1009980}
1010981
1011982InstructionCost
0 commit comments