diff options
author | Yuta Mukai <mukai.yuta@fujitsu.com> | 2024-06-12 10:27:35 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-12 10:27:35 +0900 |
commit | 0c5319e546321d7a766999e49e0ccf801ff2b3dc (patch) | |
tree | 9f58c95e1518157ffaebf73ceed691c195f291e7 /llvm/lib/CodeGen/MachinePipeliner.cpp | |
parent | 46c05dfb6c98870f8416eeb9bf787d54ac806b12 (diff) | |
download | llvm-0c5319e546321d7a766999e49e0ccf801ff2b3dc.zip llvm-0c5319e546321d7a766999e49e0ccf801ff2b3dc.tar.gz llvm-0c5319e546321d7a766999e49e0ccf801ff2b3dc.tar.bz2 |
[ModuloSchedule][AArch64] Implement modulo variable expansion for pipelining (#65609)
Modulo variable expansion is a technique that resolves overlap of
variable lifetimes by unrolling. The existing implementation solves it
by making a copy by move instruction for processors with ordinary
registers such as Arm and x86. This method may result in a very large
number of move instructions, which can cause performance problems.
Modulo variable expansion is enabled by specifying -pipeliner-mve-cg. A
backend must implement some newly defined interfaces in
PipelinerLoopInfo. They were implemented for AArch64.
Discourse thread:
https://discourse.llvm.org/t/implementing-modulo-variable-expansion-for-machinepipeliner
Diffstat (limited to 'llvm/lib/CodeGen/MachinePipeliner.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachinePipeliner.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachinePipeliner.cpp b/llvm/lib/CodeGen/MachinePipeliner.cpp index 32f65f0..6c24cfc 100644 --- a/llvm/lib/CodeGen/MachinePipeliner.cpp +++ b/llvm/lib/CodeGen/MachinePipeliner.cpp @@ -192,6 +192,10 @@ static cl::opt<int> cl::desc("Margin representing the unused percentage of " "the register pressure limit")); +static cl::opt<bool> + MVECodeGen("pipeliner-mve-cg", cl::Hidden, cl::init(false), + cl::desc("Use the MVE code generator for software pipelining")); + namespace llvm { // A command line option to enable the CopyToPhi DAG mutation. @@ -677,6 +681,11 @@ void SwingSchedulerDAG::schedule() { if (ExperimentalCodeGen && NewInstrChanges.empty()) { PeelingModuloScheduleExpander MSE(MF, MS, &LIS); MSE.expand(); + } else if (MVECodeGen && NewInstrChanges.empty() && + LoopPipelinerInfo->isMVEExpanderSupported() && + ModuloScheduleExpanderMVE::canApply(Loop)) { + ModuloScheduleExpanderMVE MSE(MF, MS, LIS); + MSE.expand(); } else { ModuloScheduleExpander MSE(MF, MS, LIS, std::move(NewInstrChanges)); MSE.expand(); |