From 495c675771f43cfa12ab7a426a538be72fec1805 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Sun, 9 Aug 2026 17:03:19 +0800 Subject: [CodeGen] Implement machine optimization and scheduling --- .../lib/CodeGen/MachineOptimizationPipeline.cpp | 156 +++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 backend/lib/CodeGen/MachineOptimizationPipeline.cpp (limited to 'backend/lib/CodeGen/MachineOptimizationPipeline.cpp') diff --git a/backend/lib/CodeGen/MachineOptimizationPipeline.cpp b/backend/lib/CodeGen/MachineOptimizationPipeline.cpp new file mode 100644 index 0000000..76dbd44 --- /dev/null +++ b/backend/lib/CodeGen/MachineOptimizationPipeline.cpp @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "rcc/CodeGen/MachineOptimizationPipeline.h" + +#include "rcc/CodeGen/MachineAnalyses.h" +#include "rcc/CodeGen/MachineBlockPlacement.h" +#include "rcc/CodeGen/MachineBranchOptimization.h" +#include "rcc/CodeGen/MachineBranchRelaxation.h" +#include "rcc/CodeGen/MachineCSE.h" +#include "rcc/CodeGen/MachineCombiner.h" +#include "rcc/CodeGen/MachineCopyPropagation.h" +#include "rcc/CodeGen/MachineDCE.h" +#include "rcc/CodeGen/MachineFallthrough.h" +#include "rcc/CodeGen/MachineFinalization.h" +#include "rcc/CodeGen/MachineLICM.h" +#include "rcc/CodeGen/MachineLiveness.h" +#include "rcc/CodeGen/MachineMemoryFolding.h" +#include "rcc/CodeGen/MachinePseudoExpansion.h" +#include "rcc/CodeGen/MachineScheduler.h" +#include "rcc/CodeGen/MachineShrinkWrapping.h" +#include "rcc/CodeGen/MachineSink.h" +#include "rcc/CodeGen/MachineStackSlotColoring.h" +#include "rcc/CodeGen/MachineTailDuplication.h" +#include "rcc/CodeGen/MachineTailMerge.h" +#include "rcc/CodeGen/PostRAScheduler.h" +#include "rcc/CodeGen/PrologueEpilogueInsertion.h" + +#include +#include + +namespace rcc { +namespace { + +template +[[nodiscard]] Expected addPass(MachinePassManager &Pipeline, Arguments &&...Values) { + return Pipeline.addPass(std::make_unique(std::forward(Values)...)); +} + +} // namespace + +Expected registerMachineOptimizationAnalyses(MachineAnalysisManager &Analyses) { + auto Registered = registerStage8MachineAnalyses(Analyses); + if (!Registered) + return std::unexpected(Registered.error()); + return registerStage11MachineAnalyses(Analyses); +} + +Expected +addSelectedSSAOptimizationPipeline(MachinePassManager &Pipeline, + const MachineOptimizationPipelineTargetInfo &TargetInfo) { + auto Added = addPass(Pipeline, TargetInfo.Combiner, + MachineCombinerStage::SelectedSSA); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.MemoryFolding); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, MachineCodeMotionStage::SelectedSSA); + if (!Added) + return std::unexpected(Added.error()); + return addPass(Pipeline, MachineCodeMotionStage::SelectedSSA); +} + +Expected addPreRegisterAllocationOptimizationPipeline( + MachinePassManager &Pipeline, const MachineOptimizationPipelineTargetInfo &TargetInfo) { + auto Added = addPass(Pipeline, TargetInfo.BranchInfo); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.SSA, + MachineCopyPropagationStage::PreRegisterAllocation); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.Combiner, + MachineCombinerStage::PreRegisterAllocation); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline); + if (!Added) + return std::unexpected(Added.error()); + return addPass(Pipeline, TargetInfo.SchedulingModel); +} + +Expected +addPostRegisterAllocationPipeline(MachinePassManager &Pipeline, + const MachineOptimizationPipelineTargetInfo &TargetInfo) { + auto Added = addPass(Pipeline); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.SSA, + MachineCopyPropagationStage::PostRegisterAllocation); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.Combiner, + MachineCombinerStage::PostRegisterAllocation); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, MachineCodeMotionStage::PostRegisterAllocation); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, MachineCodeMotionStage::PostRegisterAllocation); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.FrameLowering); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.PseudoExpansion); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.FrameLowering); + if (!Added) + return std::unexpected(Added.error()); + Added = + addPass(Pipeline, TargetInfo.Combiner, MachineCombinerStage::PostFrame); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.PseudoExpansion); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.SchedulingModel); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.BranchInfo); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.BranchInfo); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.BranchInfo); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.BranchInfo); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline, TargetInfo.PseudoExpansion, + TargetInfo.BranchInfo); + if (!Added) + return std::unexpected(Added.error()); + Added = addPass(Pipeline); + if (!Added) + return std::unexpected(Added.error()); + return addPass(Pipeline, TargetInfo.BranchInfo); +} + +} // namespace rcc -- cgit v1.2.3