// SPDX-License-Identifier: GPL-3.0-or-later #include "rcc/CodeGen/MachineOptimizationPipeline.h" #include "rcc/CodeGen/LiveVariables.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/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(MachineFunctionPassManager &Pipeline, Arguments &&...Values) { return Pipeline.addPass(std::make_unique(std::forward(Values)...)); } } // namespace Expected registerMachineOptimizationAnalyses(MachineFunctionAnalysisManager &Analyses) { auto Registered = registerStage8MachineAnalyses(Analyses); if (!Registered) return std::unexpected(Registered.error()); return registerStage11MachineAnalyses(Analyses); } Expected addSelectedSSAOptimizationPipeline(MachineFunctionPassManager &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( MachineFunctionPassManager &Pipeline, const MachineOptimizationPipelineTargetInfo &TargetInfo) { auto Added = addPass(Pipeline, TargetInfo.InstrInfo); 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(MachineFunctionPassManager &Pipeline, const MachineOptimizationPipelineTargetInfo &TargetInfo, MachineOptimizationPipelineOptions Options) { auto Added = addPass(Pipeline); 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.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.InstrInfo); if (!Added) return std::unexpected(Added.error()); Added = addPass(Pipeline, TargetInfo.InstrInfo); if (!Added) return std::unexpected(Added.error()); Added = addPass(Pipeline); if (!Added) return std::unexpected(Added.error()); Added = addPass(Pipeline, TargetInfo.InstrInfo); if (!Added) return std::unexpected(Added.error()); Added = addPass( Pipeline, TargetInfo.InstrInfo, MachineCopyPropagationOptions{.UseTargetCopyInstructions = Options.UseTargetCopyInstructions}); if (!Added) return std::unexpected(Added.error()); Added = addPass(Pipeline, TargetInfo.InstrInfo); if (!Added) return std::unexpected(Added.error()); Added = addPass(Pipeline, TargetInfo.PseudoExpansion, TargetInfo.InstrInfo); if (!Added) return std::unexpected(Added.error()); Added = addPass(Pipeline); if (!Added) return std::unexpected(Added.error()); return addPass(Pipeline, TargetInfo.InstrInfo); } } // namespace rcc