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 @@ -2364,7 +2364,7 @@ multiclass VPseudoVSQR_V { foreach m = MxListF in { defvar mx = m.MX; - defvar sews = SchedSEWSetF.val; + defvar sews = SchedSEWSet.val; let VLMul = m.value in foreach e = sews in { @@ -2719,7 +2719,7 @@ multiclass VPseudoVFDIV_VV_VF { foreach m = MxListF in { defvar mx = m.MX; - defvar sews = SchedSEWSetF.val; + defvar sews = SchedSEWSet.val; foreach e = sews in { defvar WriteVFDivV_MX_E = !cast("WriteVFDivV_" # mx # "_E" # e); defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # e); @@ -2732,7 +2732,7 @@ foreach f = FPList in { foreach m = f.MxList in { defvar mx = m.MX; - defvar sews = SchedSEWSetF.val; + defvar sews = SchedSEWSet.val; foreach e = sews in { defvar WriteVFDivF_MX_E = !cast("WriteVFDivF_" # mx # "_E" # e); defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # e); @@ -2749,7 +2749,7 @@ foreach f = FPList in { foreach m = f.MxList in { defvar mx = m.MX; - defvar sews = SchedSEWSetF.val; + defvar sews = SchedSEWSet.val; foreach e = sews in { defvar WriteVFDivF_MX_E = !cast("WriteVFDivF_" # mx # "_E" # e); defvar ReadVFDivV_MX_E = !cast("ReadVFDivV_" # mx # "_E" # e); @@ -3464,7 +3464,7 @@ multiclass VPseudoVWRED_VS { foreach m = MxListWRed in { defvar mx = m.MX; - foreach e = SchedSEWSet.val in { + foreach e = SchedSEWSet.val in { defvar WriteVIWRedV_From_MX_E = !cast("WriteVIWRedV_From_" # mx # "_E" # e); defm _VS : VPseudoTernaryWithTailPolicy_E, Sched<[WriteVIWRedV_From_MX_E, ReadVIWRedV, ReadVIWRedV, @@ -3476,7 +3476,7 @@ multiclass VPseudoVFRED_VS { foreach m = MxListF in { defvar mx = m.MX; - foreach e = SchedSEWSetF.val in { + foreach e = SchedSEWSet.val in { defvar WriteVFRedV_From_MX_E = !cast("WriteVFRedV_From_" # mx # "_E" # e); defm _VS : VPseudoTernaryWithTailPolicy_E, Sched<[WriteVFRedV_From_MX_E, ReadVFRedV, ReadVFRedV, ReadVFRedV, @@ -3488,7 +3488,7 @@ multiclass VPseudoVFREDO_VS { foreach m = MxListF in { defvar mx = m.MX; - foreach e = SchedSEWSetF.val in { + foreach e = SchedSEWSet.val in { defvar WriteVFRedOV_From_MX_E = !cast("WriteVFRedOV_From_" # mx # "_E" # e); defm _VS : VPseudoTernaryWithTailPolicy_E, Sched<[WriteVFRedOV_From_MX_E, ReadVFRedOV, ReadVFRedOV, @@ -3500,7 +3500,7 @@ multiclass VPseudoVFWRED_VS { foreach m = MxListFWRed in { defvar mx = m.MX; - foreach e = SchedSEWSetF.val in { + foreach e = SchedSEWSet.val in { defvar WriteVFWRedV_From_MX_E = !cast("WriteVFWRedV_From_" # mx # "_E" # e); defm _VS : VPseudoTernaryWithTailPolicy_E, Sched<[WriteVFWRedV_From_MX_E, ReadVFWRedV, ReadVFWRedV, 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 @@ -567,7 +567,7 @@ } } foreach mx = SchedMxListF in { - foreach sew = SchedSEWSetF.val in { + foreach sew = SchedSEWSet.val in { defvar Cycles = !mul(SiFive7GetDivOrSqrtFactor.c, !div(SiFive7GetCyclesOnePerElement.c, 4)); defvar IsWorstCase = SiFive7IsWorstCaseMXSEW.c; 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 @@ -20,8 +20,8 @@ // Used for widening floating-point Reduction as it doesn't contain MF8. defvar SchedMxListFWRed = SchedMxListF; -// For widening instructions, SEW will not be 64. -class SchedSEWSet { +class SchedSEWSet { + assert !or(!not(isF), !ne(mx, "MF8")), "LMUL shouldn't be MF8 for floating-point"; defvar t = !cond(!eq(mx, "M1"): [8, 16, 32, 64], !eq(mx, "M2"): [8, 16, 32, 64], !eq(mx, "M4"): [8, 16, 32, 64], @@ -29,18 +29,11 @@ !eq(mx, "MF2"): [8, 16, 32], !eq(mx, "MF4"): [8, 16], !eq(mx, "MF8"): [8]); - list val = !if(isWidening, !listremove(t, [64]), t); -} - -// For floating-point instructions, SEW won't be 8. -class SchedSEWSetF { - defvar t = !cond(!eq(mx, "M1"): [16, 32, 64], - !eq(mx, "M2"): [16, 32, 64], - !eq(mx, "M4"): [16, 32, 64], - !eq(mx, "M8"): [16, 32, 64], - !eq(mx, "MF2"): [16, 32], - !eq(mx, "MF4"): [16]); - list val = !if(isWidening, !listremove(t, [64]), t); + // For floating-point instructions, SEW won't be 8. + defvar remove8 = !if(isF, !listremove(t, [8]), t); + // For widening instructions, SEW will not be 64. + defvar remove64 = !if(isWidening, !listremove(remove8, [64]), remove8); + list val = remove64; } // Helper function to get the largest LMUL from MxList @@ -52,7 +45,7 @@ // Helper function to get the smallest SEW that can be used with LMUL mx // Precondition: MxList is sorted in ascending LMUL order and SchedSEWSet class SmallestSEW { - int r = !head(!if(isF, SchedSEWSetF.val, SchedSEWSet.val)); + int r = !head(SchedSEWSet.val); } // Creates WriteRes for (name, mx, resources) tuple @@ -111,8 +104,7 @@ bit isWidening = 0> { def name # "_WorstCase" : SchedWrite; foreach mx = MxList in { - foreach sew = !if(isF, SchedSEWSetF.val, - SchedSEWSet.val) in + foreach sew = SchedSEWSet.val in def name # "_" # mx # "_E" # sew : SchedWrite; } } @@ -120,8 +112,7 @@ bit isWidening = 0> { def name # "_WorstCase" : SchedRead; foreach mx = MxList in { - foreach sew = !if(isF,SchedSEWSetF.val, - SchedSEWSet.val) in + foreach sew = SchedSEWSet.val in def name # "_" # mx # "_E" # sew : SchedRead; } } @@ -131,8 +122,7 @@ if !exists(name # "_WorstCase") then def : WriteRes(name # "_WorstCase"), resources>; foreach mx = MxList in { - foreach sew = !if(isF,SchedSEWSetF.val, - SchedSEWSet.val) in + foreach sew = SchedSEWSet.val in if !exists(name # "_" # mx # "_E" # sew) then def : WriteRes(name # "_" # mx # "_E" # sew), resources>; } @@ -143,8 +133,7 @@ if !exists(name # "_WorstCase") then def : ReadAdvance(name # "_WorstCase"), val, writes>; foreach mx = MxList in { - foreach sew = !if(isF,SchedSEWSetF.val, - SchedSEWSet.val) in + foreach sew = SchedSEWSet.val in if !exists(name # "_" # mx # "_E" # sew) then def : ReadAdvance(name # "_" # mx # "_E" # sew), val, writes>; }