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 @@ -725,32 +725,38 @@ multiclass VRED_MV_V funct6> { def _VS : VALUVV, - Sched<[WriteVIRedV, ReadVIRedV, ReadVIRedV0, ReadVMask]>; + Sched<[WriteVIRedV_From_UpperBound, ReadVIRedV, ReadVIRedV0, + ReadVMask]>; } multiclass VWRED_IV_V funct6> { def _VS : VALUVV, - Sched<[WriteVIWRedV, ReadVIWRedV, ReadVIWRedV0, ReadVMask]>; + Sched<[WriteVIWRedV_From_UpperBound, ReadVIWRedV, ReadVIWRedV0, + ReadVMask]>; } multiclass VRED_FV_V funct6> { def _VS : VALUVV, - Sched<[WriteVFRedV, ReadVFRedV, ReadVFRedV0, ReadVMask]>; + Sched<[WriteVFRedV_From_UpperBound, ReadVFRedV, ReadVFRedV0, + ReadVMask]>; } multiclass VREDO_FV_V funct6> { def _VS : VALUVV, - Sched<[WriteVFRedOV, ReadVFRedOV, ReadVFRedOV0, ReadVMask]>; + Sched<[WriteVFRedOV_From_UpperBound, ReadVFRedOV, ReadVFRedOV0, + ReadVMask]>; } multiclass VWRED_FV_V funct6> { def _VS : VALUVV, - Sched<[WriteVFWRedV, ReadVFWRedV, ReadVFWRedV0, ReadVMask]>; + Sched<[WriteVFWRedV_From_UpperBound, ReadVFWRedV, ReadVFWRedV0, + ReadVMask]>; } multiclass VWREDO_FV_V funct6> { def _VS : VALUVV, - Sched<[WriteVFWRedOV, ReadVFWRedOV, ReadVFWRedOV0, ReadVMask]>; + Sched<[WriteVFWRedOV_From_UpperBound, ReadVFWRedOV, ReadVFWRedOV0, + ReadVMask]>; } multiclass VMALU_MV_Mask funct6, string vm = "v"> { 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 @@ -3297,36 +3297,51 @@ multiclass VPseudoVRED_VS { foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVIRedV_From_MX = !cast("WriteVIRedV_From_" # mx); defm _VS : VPseudoTernary, - Sched<[WriteVIRedV, ReadVIRedV, ReadVIRedV, ReadVIRedV, ReadVMask]>; + Sched<[WriteVIRedV_From_MX, ReadVIRedV, ReadVIRedV, ReadVIRedV, + ReadVMask]>; } } multiclass VPseudoVWRED_VS { foreach m = MxList in { + defvar mx = m.MX; + defvar WriteVIWRedV_From_MX = !cast("WriteVIWRedV_From_" # mx); defm _VS : VPseudoTernary, - Sched<[WriteVIWRedV, ReadVIWRedV, ReadVIWRedV, ReadVIWRedV, ReadVMask]>; + Sched<[WriteVIWRedV_From_MX, ReadVIWRedV, ReadVIWRedV, + ReadVIWRedV, ReadVMask]>; } } multiclass VPseudoVFRED_VS { foreach m = MxListF in { + defvar mx = m.MX; + defvar WriteVFRedV_From_MX = !cast("WriteVFRedV_From_" # mx); defm _VS : VPseudoTernary, - Sched<[WriteVFRedV, ReadVFRedV, ReadVFRedV, ReadVFRedV, ReadVMask]>; + Sched<[WriteVFRedV_From_MX, ReadVFRedV, ReadVFRedV, ReadVFRedV, + ReadVMask]>; } } multiclass VPseudoVFREDO_VS { foreach m = MxListF in { + defvar mx = m.MX; + defvar WriteVFRedOV_From_MX = !cast("WriteVFRedOV_From_" # mx); defm _VS : VPseudoTernary, - Sched<[WriteVFRedOV, ReadVFRedOV, ReadVFRedOV, ReadVFRedOV, ReadVMask]>; + Sched<[WriteVFRedOV_From_MX, ReadVFRedOV, ReadVFRedOV, + ReadVFRedOV, ReadVMask]>; } } multiclass VPseudoVFWRED_VS { foreach m = MxListF in { + defvar mx = m.MX; + defvar WriteVFWRedV_From_MX = !cast("WriteVFWRedV_From_" # mx); defm _VS : VPseudoTernary, - Sched<[WriteVFWRedV, ReadVFWRedV, ReadVFWRedV, ReadVFWRedV, ReadVMask]>; + Sched<[WriteVFWRedV_From_MX, ReadVFWRedV, ReadVFWRedV, + ReadVFWRedV, ReadVMask]>; } } 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 @@ -298,15 +298,15 @@ // 14. Vector Reduction Operations // 14.1. Vector Single-Width Integer Reduction Instructions -def WriteVIRedV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVIRedV_From">; // 14.2. Vector Widening Integer Reduction Instructions -def WriteVIWRedV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVIWRedV_From">; // 14.3. Vector Single-Width Floating-Point Reduction Instructions -def WriteVFRedV : SchedWrite; -def WriteVFRedOV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVFRedV_From">; +defm "" : LMULSchedWrites<"WriteVFRedOV_From">; // 14.4. Vector Widening Floating-Point Reduction Instructions -def WriteVFWRedV : SchedWrite; -def WriteVFWRedOV : SchedWrite; +defm "" : LMULSchedWrites<"WriteVFWRedV_From">; +defm "" : LMULSchedWrites<"WriteVFWRedOV_From">; // 15. Vector Mask Instructions // 15.1. Vector Mask-Register Logical Instructions @@ -727,12 +727,12 @@ defm "" : LMULWriteResFW<"WriteVFNCvtFToFV", []>; // 14. Vector Reduction Operations -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; -def : WriteRes; +defm "" : LMULWriteRes<"WriteVIRedV_From", []>; +defm "" : LMULWriteRes<"WriteVIWRedV_From", []>; +defm "" : LMULWriteRes<"WriteVFRedV_From", []>; +defm "" : LMULWriteRes<"WriteVFRedOV_From", []>; +defm "" : LMULWriteRes<"WriteVFWRedV_From", []>; +defm "" : LMULWriteRes<"WriteVFWRedOV_From", []>; // 15. Vector Mask Instructions defm "" : LMULWriteRes<"WriteVMALUV", []>;