aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Target/RISCV/RISCVPipeline.cpp
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-13 21:11:10 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-13 21:11:10 +0800
commitcd30fb546e389d1fb78ce8e579b3dba3a8fdb52a (patch)
tree891d7065c52e56d3f559b146f3a07055105d9d4e /backend/lib/Target/RISCV/RISCVPipeline.cpp
parent98cae0e8835a1eb8fcb0e43870c04ed934cc51ac (diff)
downloadrcc-project-cd30fb546e389d1fb78ce8e579b3dba3a8fdb52a.tar.gz
rcc-project-cd30fb546e389d1fb78ce8e579b3dba3a8fdb52a.tar.xz
[CodeGen] Match LLVM machine copy propagation
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVPipeline.cpp')
-rw-r--r--backend/lib/Target/RISCV/RISCVPipeline.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/backend/lib/Target/RISCV/RISCVPipeline.cpp b/backend/lib/Target/RISCV/RISCVPipeline.cpp
index 60f798c..9ce9f92 100644
--- a/backend/lib/Target/RISCV/RISCVPipeline.cpp
+++ b/backend/lib/Target/RISCV/RISCVPipeline.cpp
@@ -65,7 +65,8 @@ template <typename PassT, typename... ArgumentT>
}
[[nodiscard]] Expected<void> addCompleteRegistry(MachineFunctionPassManager &Pipeline,
- const RISCVSubtarget &Subtarget) {
+ const RISCVSubtarget &Subtarget,
+ RISCVPipelineOptions Options) {
auto Added = addInitialPipeline(Pipeline, Subtarget);
if (!Added)
return std::unexpected(Added.error());
@@ -75,14 +76,17 @@ template <typename PassT, typename... ArgumentT>
Added = addRegisterAllocationPipeline(Pipeline);
if (!Added)
return std::unexpected(Added.error());
- return addPostRegisterAllocationPipeline(Pipeline, optimizationPipelineInfo());
+ return addPostRegisterAllocationPipeline(
+ Pipeline, optimizationPipelineInfo(),
+ MachineOptimizationPipelineOptions{.UseTargetCopyInstructions =
+ Options.UseTargetCopyInstructions});
}
} // namespace
Expected<void> addCanonicalPipeline(MachineFunctionPassManager &Pipeline,
const MachineFunction &Function,
- const RISCVSubtarget &Subtarget) {
+ const RISCVSubtarget &Subtarget, RISCVPipelineOptions Options) {
if (!Function.properties().has(MachineFunctionProperty::Legalized)) {
auto Added = addPass<MachineCombinerPass>(Pipeline, machineCombinerInfo(),
MachineCombinerStage::PreLegalizer);
@@ -123,7 +127,10 @@ Expected<void> addCanonicalPipeline(MachineFunctionPassManager &Pipeline,
return std::unexpected(Added.error());
}
if (!Function.properties().has(MachineFunctionProperty::NoExecutablePseudos)) {
- auto Added = addPostRegisterAllocationPipeline(Pipeline, optimizationPipelineInfo());
+ auto Added = addPostRegisterAllocationPipeline(
+ Pipeline, optimizationPipelineInfo(),
+ MachineOptimizationPipelineOptions{.UseTargetCopyInstructions =
+ Options.UseTargetCopyInstructions});
if (!Added)
return std::unexpected(Added.error());
}
@@ -131,11 +138,12 @@ Expected<void> addCanonicalPipeline(MachineFunctionPassManager &Pipeline,
}
Expected<std::unique_ptr<MachineFunctionPass>>
-createCanonicalPipelinePass(std::string_view Name, const RISCVSubtarget &Subtarget) {
+createCanonicalPipelinePass(std::string_view Name, const RISCVSubtarget &Subtarget,
+ RISCVPipelineOptions Options) {
if (Name.empty())
return makeUnexpected(ErrorCode::InvalidArgument, "pipeline pass name cannot be empty");
MachineFunctionPassManager Registry;
- auto Added = addCompleteRegistry(Registry, Subtarget);
+ auto Added = addCompleteRegistry(Registry, Subtarget, Options);
if (!Added)
return std::unexpected(Added.error());
MachineFunctionPassManager::PassList Passes = std::move(Registry).takePasses();