@@ -1047,13 +1047,42 @@ RISCVTTIImpl::getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty,
1047
1047
}
1048
1048
1049
1049
// IR Reduction is composed by two vmv and one rvv reduction instruction.
1050
- InstructionCost BaseCost = 2 ;
1051
-
1052
- if (CostKind == TTI::TCK_CodeSize)
1053
- return (LT.first - 1 ) + BaseCost;
1054
-
1055
- unsigned VL = getEstimatedVLFor (Ty);
1056
- return (LT.first - 1 ) + BaseCost + Log2_32_Ceil (VL);
1050
+ unsigned SplitOp;
1051
+ SmallVector<unsigned , 3 > Opcodes;
1052
+ switch (IID) {
1053
+ default :
1054
+ llvm_unreachable (" Unsupported intrinsic" );
1055
+ case Intrinsic::smax:
1056
+ SplitOp = RISCV::VMAX_VV;
1057
+ Opcodes = {RISCV::VMV_S_X, RISCV::VREDMAX_VS, RISCV::VMV_X_S};
1058
+ break ;
1059
+ case Intrinsic::smin:
1060
+ SplitOp = RISCV::VMIN_VV;
1061
+ Opcodes = {RISCV::VMV_S_X, RISCV::VREDMIN_VS, RISCV::VMV_X_S};
1062
+ break ;
1063
+ case Intrinsic::umax:
1064
+ SplitOp = RISCV::VMAXU_VV;
1065
+ Opcodes = {RISCV::VMV_S_X, RISCV::VREDMAXU_VS, RISCV::VMV_X_S};
1066
+ break ;
1067
+ case Intrinsic::umin:
1068
+ SplitOp = RISCV::VMINU_VV;
1069
+ Opcodes = {RISCV::VMV_S_X, RISCV::VREDMINU_VS, RISCV::VMV_X_S};
1070
+ break ;
1071
+ case Intrinsic::maxnum:
1072
+ SplitOp = RISCV::VFMAX_VV;
1073
+ Opcodes = {RISCV::VFMV_S_F, RISCV::VFREDMAX_VS, RISCV::VFMV_F_S};
1074
+ break ;
1075
+ case Intrinsic::minnum:
1076
+ SplitOp = RISCV::VFMIN_VV;
1077
+ Opcodes = {RISCV::VFMV_S_F, RISCV::VFREDMIN_VS, RISCV::VFMV_F_S};
1078
+ break ;
1079
+ }
1080
+ // Add a cost for data larger than LMUL8
1081
+ InstructionCost SplitCost =
1082
+ (LT.first > 1 ) ? (LT.first - 1 ) *
1083
+ getRISCVInstructionCost (SplitOp, LT.second , CostKind)
1084
+ : 0 ;
1085
+ return SplitCost + getRISCVInstructionCost (Opcodes, LT.second , CostKind);
1057
1086
}
1058
1087
1059
1088
InstructionCost
0 commit comments