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 @@ -17,6 +17,40 @@ // Used for widening floating-point Reduction as it doesn't contain MF8. defvar SchedMxListFWRed = !listremove(SchedMxList, ["MF8"]); +// Multiplier of ResourceCycle for different LMULs. +// +// For resources whose cycles are relevant to LMULs, the differences between +// fractional LMULs and M1 are not so big. So the multipliers of fractional LMULs +// are 1 here (which is the same as M1) to simplify the scheduling model, so that +// we can focus on modeling resource cycles based on M1. +class multiplier { + int value = !cond(!eq(mx, "UpperBound") : 8, + !eq(mx, "M1") : 1, + !eq(mx, "M2") : 2, + !eq(mx, "M4") : 4, + !eq(mx, "M8") : 8, + !eq(mx, "MF2") : 1, + !eq(mx, "MF4") : 1, + !eq(mx, "MF8") : 1); +} +class ResourceCycle { + int Cycles = cycles; +} +// ResourceCycle whose cycles are relevant to LMUL. +class LMULResourceCycle : ResourceCycle; +// ResourceCycle whose cycles are fixed. +class FixedResourceCycle : ResourceCycle; +// Helper class for generating a list of resource cycles of different LMULs. +class ResourceCycles resourceCycles, string mx> { + list value = !foreach(resourceCycle, resourceCycles, + !cond(!isa(resourceCycle): + !mul(resourceCycle.Cycles, multiplier.value), + !isa(resourceCycle): + resourceCycle.Cycles + ) + ); +} + // Define multiclasses to define SchedWrite, SchedRead, WriteRes, and // ReadAdvance for each (name, LMUL) pair for each LMUL in each of the // SchedMxList variants above. @@ -31,10 +65,13 @@ def name # "_" # mx : SchedRead; } } -multiclass LMULWriteResImpl resources> { +multiclass LMULWriteResImpl resources, + list resourceCycles> { foreach mx = SchedMxList in { if !exists(name # "_" # mx) then - def : WriteRes(name # "_" # mx), resources>; + def : WriteRes(name # "_" # mx), resources> { + let ResourceCycles = ResourceCycles.value; + } } } multiclass LMULReadAdvanceImpl : LMULSchedWritesImpl; multiclass LMULSchedReads : LMULSchedReadsImpl; -multiclass LMULWriteRes resources> - : LMULWriteResImpl; +multiclass LMULWriteRes resources, + list resourceCycles = []> + : LMULWriteResImpl; multiclass LMULReadAdvance writes = []> : LMULReadAdvanceImpl; class LMULSchedWriteList names> : LMULSchedWriteListImpl; multiclass LMULSchedWritesW : LMULSchedWritesImpl; multiclass LMULSchedReadsW : LMULSchedReadsImpl; -multiclass LMULWriteResW resources> - : LMULWriteResImpl; +multiclass LMULWriteResW resources, + list resourceCycles = []> + : LMULWriteResImpl; multiclass LMULReadAdvanceW writes = []> : LMULReadAdvanceImpl; class LMULSchedWriteListW names> : LMULSchedWriteListImpl; multiclass LMULSchedWritesFW : LMULSchedWritesImpl; multiclass LMULSchedReadsFW : LMULSchedReadsImpl; -multiclass LMULWriteResFW resources> - : LMULWriteResImpl; +multiclass LMULWriteResFW resources, + list resourceCycles = []> + : LMULWriteResImpl; multiclass LMULReadAdvanceFW writes = []> : LMULReadAdvanceImpl; class LMULSchedWriteListFW names> : LMULSchedWriteListImpl; multiclass LMULSchedWritesFWRed : LMULSchedWritesImpl; -multiclass LMULWriteResFWRed resources> - : LMULWriteResImpl; +multiclass LMULWriteResFWRed resources, + list resourceCycles = []> + : LMULWriteResImpl; class LMULSchedWriteListFWRed names> : LMULSchedWriteListImpl;