diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td @@ -726,6 +726,12 @@ ReadVMask]>; } +multiclass VREDMINMAX_MV_V funct6> { + def _VS : VALUVV, + Sched<[WriteVIRedMinMaxV_From_WorstCase, ReadVIRedV, ReadVIRedV0, + ReadVMask]>; +} + multiclass VWRED_IV_V funct6> { def _VS : VALUVV, Sched<[WriteVIWRedV_From_WorstCase, ReadVIWRedV, ReadVIWRedV0, @@ -1490,14 +1496,14 @@ // Vector Single-Width Integer Reduction Instructions let RVVConstraint = NoConstraint in { -defm VREDSUM : VRED_MV_V<"vredsum", 0b000000>; -defm VREDMAXU : VRED_MV_V<"vredmaxu", 0b000110>; -defm VREDMAX : VRED_MV_V<"vredmax", 0b000111>; -defm VREDMINU : VRED_MV_V<"vredminu", 0b000100>; -defm VREDMIN : VRED_MV_V<"vredmin", 0b000101>; -defm VREDAND : VRED_MV_V<"vredand", 0b000001>; -defm VREDOR : VRED_MV_V<"vredor", 0b000010>; -defm VREDXOR : VRED_MV_V<"vredxor", 0b000011>; +defm VREDSUM : VRED_MV_V<"vredsum", 0b000000>; +defm VREDMAXU : VREDMINMAX_MV_V<"vredmaxu", 0b000110>; +defm VREDMAX : VREDMINMAX_MV_V<"vredmax", 0b000111>; +defm VREDMINU : VREDMINMAX_MV_V<"vredminu", 0b000100>; +defm VREDMIN : VREDMINMAX_MV_V<"vredmin", 0b000101>; +defm VREDAND : VRED_MV_V<"vredand", 0b000001>; +defm VREDOR : VRED_MV_V<"vredor", 0b000010>; +defm VREDXOR : VRED_MV_V<"vredxor", 0b000011>; } // RVVConstraint = NoConstraint // Vector Widening Integer Reduction Instructions diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -3322,6 +3322,18 @@ } } +multiclass VPseudoVREDMINMAX_VS { + foreach m = MxList in { + defvar mx = m.MX; + foreach e = SchedSEWSet.val in { + defvar WriteVIRedMinMaxV_From_MX_E = !cast("WriteVIRedMinMaxV_From_" # mx # "_E" # e); + defm _VS : VPseudoTernaryWithTailPolicy, + Sched<[WriteVIRedMinMaxV_From_MX_E, ReadVIRedV, ReadVIRedV, + ReadVIRedV, ReadVMask]>; + } + } +} + multiclass VPseudoVWRED_VS { foreach m = MxListWRed in { defvar mx = m.MX; @@ -5895,10 +5907,10 @@ defm PseudoVREDAND : VPseudoVRED_VS; defm PseudoVREDOR : VPseudoVRED_VS; defm PseudoVREDXOR : VPseudoVRED_VS; -defm PseudoVREDMINU : VPseudoVRED_VS; -defm PseudoVREDMIN : VPseudoVRED_VS; -defm PseudoVREDMAXU : VPseudoVRED_VS; -defm PseudoVREDMAX : VPseudoVRED_VS; +defm PseudoVREDMINU : VPseudoVREDMINMAX_VS; +defm PseudoVREDMIN : VPseudoVREDMINMAX_VS; +defm PseudoVREDMAXU : VPseudoVREDMINMAX_VS; +defm PseudoVREDMAX : VPseudoVREDMINMAX_VS; //===----------------------------------------------------------------------===// // 14.2. Vector Widening Integer Reduction Instructions diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td --- a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td @@ -779,6 +779,8 @@ let Latency = Cycles, ResourceCycles = [Cycles] in defm "" : LMULSEWWriteResMXSEW<"WriteVIRedV_From", [SiFive7VA], mx, sew, IsWorstCase>; + defm "" : LMULSEWWriteResMXSEW<"WriteVIRedMinMaxV_From", [SiFive7VA], + mx, sew, IsWorstCase>; } } diff --git a/llvm/lib/Target/RISCV/RISCVScheduleV.td b/llvm/lib/Target/RISCV/RISCVScheduleV.td --- a/llvm/lib/Target/RISCV/RISCVScheduleV.td +++ b/llvm/lib/Target/RISCV/RISCVScheduleV.td @@ -404,6 +404,7 @@ // LMUL from VS2. // 14.1. Vector Single-Width Integer Reduction Instructions defm "" : LMULSEWSchedWrites<"WriteVIRedV_From">; +defm "" : LMULSEWSchedWrites<"WriteVIRedMinMaxV_From">; // 14.2. Vector Widening Integer Reduction Instructions defm "" : LMULSEWSchedWritesWRed<"WriteVIWRedV_From">; // 14.3. Vector Single-Width Floating-Point Reduction Instructions @@ -846,6 +847,7 @@ // 14. Vector Reduction Operations defm "" : LMULSEWWriteRes<"WriteVIRedV_From", []>; +defm "" : LMULSEWWriteRes<"WriteVIRedMinMaxV_From", []>; defm "" : LMULSEWWriteResWRed<"WriteVIWRedV_From", []>; defm "" : LMULSEWWriteResF<"WriteVFRedV_From", []>; defm "" : LMULSEWWriteResF<"WriteVFRedOV_From", []>;