xref: /llvm-project/llvm/lib/Target/RISCV/GISel/RISCVPostLegalizerCombiner.cpp (revision ee7ca0dddafb609090ad1789570c099d95c0afb6)
18e87dc10SCraig Topper //=== RISCVPostLegalizerCombiner.cpp --------------------------*- C++ -*-===//
28e87dc10SCraig Topper //
38e87dc10SCraig Topper // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48e87dc10SCraig Topper // See https://llvm.org/LICENSE.txt for license information.
58e87dc10SCraig Topper // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68e87dc10SCraig Topper //
78e87dc10SCraig Topper //===----------------------------------------------------------------------===//
88e87dc10SCraig Topper ///
98e87dc10SCraig Topper /// \file
108e87dc10SCraig Topper /// Post-legalization combines on generic MachineInstrs.
118e87dc10SCraig Topper ///
128e87dc10SCraig Topper /// The combines here must preserve instruction legality.
138e87dc10SCraig Topper ///
148e87dc10SCraig Topper /// Combines which don't rely on instruction legality should go in the
158e87dc10SCraig Topper /// RISCVPreLegalizerCombiner.
168e87dc10SCraig Topper ///
178e87dc10SCraig Topper //===----------------------------------------------------------------------===//
188e87dc10SCraig Topper 
198e87dc10SCraig Topper #include "RISCVTargetMachine.h"
208e87dc10SCraig Topper #include "llvm/CodeGen/GlobalISel/CSEInfo.h"
218e87dc10SCraig Topper #include "llvm/CodeGen/GlobalISel/Combiner.h"
228e87dc10SCraig Topper #include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
238e87dc10SCraig Topper #include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
248e87dc10SCraig Topper #include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
258e87dc10SCraig Topper #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
268e87dc10SCraig Topper #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
278e87dc10SCraig Topper #include "llvm/CodeGen/MachineDominators.h"
288e87dc10SCraig Topper #include "llvm/CodeGen/MachineFunctionPass.h"
298e87dc10SCraig Topper #include "llvm/CodeGen/TargetPassConfig.h"
308e87dc10SCraig Topper 
318e87dc10SCraig Topper #define GET_GICOMBINER_DEPS
328e87dc10SCraig Topper #include "RISCVGenPostLegalizeGICombiner.inc"
338e87dc10SCraig Topper #undef GET_GICOMBINER_DEPS
348e87dc10SCraig Topper 
358e87dc10SCraig Topper #define DEBUG_TYPE "riscv-postlegalizer-combiner"
368e87dc10SCraig Topper 
378e87dc10SCraig Topper using namespace llvm;
388e87dc10SCraig Topper 
398e87dc10SCraig Topper namespace {
408e87dc10SCraig Topper 
418e87dc10SCraig Topper #define GET_GICOMBINER_TYPES
428e87dc10SCraig Topper #include "RISCVGenPostLegalizeGICombiner.inc"
438e87dc10SCraig Topper #undef GET_GICOMBINER_TYPES
448e87dc10SCraig Topper 
458e87dc10SCraig Topper class RISCVPostLegalizerCombinerImpl : public Combiner {
468e87dc10SCraig Topper protected:
47*ee7ca0ddSPaul Bowen-Huggett   const CombinerHelper Helper;
488e87dc10SCraig Topper   const RISCVPostLegalizerCombinerImplRuleConfig &RuleConfig;
498e87dc10SCraig Topper   const RISCVSubtarget &STI;
508e87dc10SCraig Topper 
518e87dc10SCraig Topper public:
528e87dc10SCraig Topper   RISCVPostLegalizerCombinerImpl(
538e87dc10SCraig Topper       MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC,
548e87dc10SCraig Topper       GISelKnownBits &KB, GISelCSEInfo *CSEInfo,
558e87dc10SCraig Topper       const RISCVPostLegalizerCombinerImplRuleConfig &RuleConfig,
568e87dc10SCraig Topper       const RISCVSubtarget &STI, MachineDominatorTree *MDT,
578e87dc10SCraig Topper       const LegalizerInfo *LI);
588e87dc10SCraig Topper 
598e87dc10SCraig Topper   static const char *getName() { return "RISCVPostLegalizerCombiner"; }
608e87dc10SCraig Topper 
618e87dc10SCraig Topper   bool tryCombineAll(MachineInstr &I) const override;
628e87dc10SCraig Topper 
638e87dc10SCraig Topper private:
648e87dc10SCraig Topper #define GET_GICOMBINER_CLASS_MEMBERS
658e87dc10SCraig Topper #include "RISCVGenPostLegalizeGICombiner.inc"
668e87dc10SCraig Topper #undef GET_GICOMBINER_CLASS_MEMBERS
678e87dc10SCraig Topper };
688e87dc10SCraig Topper 
698e87dc10SCraig Topper #define GET_GICOMBINER_IMPL
708e87dc10SCraig Topper #include "RISCVGenPostLegalizeGICombiner.inc"
718e87dc10SCraig Topper #undef GET_GICOMBINER_IMPL
728e87dc10SCraig Topper 
738e87dc10SCraig Topper RISCVPostLegalizerCombinerImpl::RISCVPostLegalizerCombinerImpl(
748e87dc10SCraig Topper     MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC,
758e87dc10SCraig Topper     GISelKnownBits &KB, GISelCSEInfo *CSEInfo,
768e87dc10SCraig Topper     const RISCVPostLegalizerCombinerImplRuleConfig &RuleConfig,
778e87dc10SCraig Topper     const RISCVSubtarget &STI, MachineDominatorTree *MDT,
788e87dc10SCraig Topper     const LegalizerInfo *LI)
798e87dc10SCraig Topper     : Combiner(MF, CInfo, TPC, &KB, CSEInfo),
808e87dc10SCraig Topper       Helper(Observer, B, /*IsPreLegalize*/ false, &KB, MDT, LI),
818e87dc10SCraig Topper       RuleConfig(RuleConfig), STI(STI),
828e87dc10SCraig Topper #define GET_GICOMBINER_CONSTRUCTOR_INITS
838e87dc10SCraig Topper #include "RISCVGenPostLegalizeGICombiner.inc"
848e87dc10SCraig Topper #undef GET_GICOMBINER_CONSTRUCTOR_INITS
858e87dc10SCraig Topper {
868e87dc10SCraig Topper }
878e87dc10SCraig Topper 
888e87dc10SCraig Topper class RISCVPostLegalizerCombiner : public MachineFunctionPass {
898e87dc10SCraig Topper public:
908e87dc10SCraig Topper   static char ID;
918e87dc10SCraig Topper 
928e87dc10SCraig Topper   RISCVPostLegalizerCombiner();
938e87dc10SCraig Topper 
948e87dc10SCraig Topper   StringRef getPassName() const override {
958e87dc10SCraig Topper     return "RISCVPostLegalizerCombiner";
968e87dc10SCraig Topper   }
978e87dc10SCraig Topper 
988e87dc10SCraig Topper   bool runOnMachineFunction(MachineFunction &MF) override;
998e87dc10SCraig Topper   void getAnalysisUsage(AnalysisUsage &AU) const override;
1008e87dc10SCraig Topper 
1018e87dc10SCraig Topper private:
1028e87dc10SCraig Topper   RISCVPostLegalizerCombinerImplRuleConfig RuleConfig;
1038e87dc10SCraig Topper };
1048e87dc10SCraig Topper } // end anonymous namespace
1058e87dc10SCraig Topper 
1068e87dc10SCraig Topper void RISCVPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
1078e87dc10SCraig Topper   AU.addRequired<TargetPassConfig>();
1088e87dc10SCraig Topper   AU.setPreservesCFG();
1098e87dc10SCraig Topper   getSelectionDAGFallbackAnalysisUsage(AU);
1108e87dc10SCraig Topper   AU.addRequired<GISelKnownBitsAnalysis>();
1118e87dc10SCraig Topper   AU.addPreserved<GISelKnownBitsAnalysis>();
112837dc542Spaperchalice   AU.addRequired<MachineDominatorTreeWrapperPass>();
113837dc542Spaperchalice   AU.addPreserved<MachineDominatorTreeWrapperPass>();
1148e87dc10SCraig Topper   AU.addRequired<GISelCSEAnalysisWrapperPass>();
1158e87dc10SCraig Topper   AU.addPreserved<GISelCSEAnalysisWrapperPass>();
1168e87dc10SCraig Topper   MachineFunctionPass::getAnalysisUsage(AU);
1178e87dc10SCraig Topper }
1188e87dc10SCraig Topper 
1198e87dc10SCraig Topper RISCVPostLegalizerCombiner::RISCVPostLegalizerCombiner()
1208e87dc10SCraig Topper     : MachineFunctionPass(ID) {
1218e87dc10SCraig Topper   initializeRISCVPostLegalizerCombinerPass(*PassRegistry::getPassRegistry());
1228e87dc10SCraig Topper 
1238e87dc10SCraig Topper   if (!RuleConfig.parseCommandLineOption())
1248e87dc10SCraig Topper     report_fatal_error("Invalid rule identifier");
1258e87dc10SCraig Topper }
1268e87dc10SCraig Topper 
1278e87dc10SCraig Topper bool RISCVPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
1288e87dc10SCraig Topper   if (MF.getProperties().hasProperty(
1298e87dc10SCraig Topper           MachineFunctionProperties::Property::FailedISel))
1308e87dc10SCraig Topper     return false;
1318e87dc10SCraig Topper   assert(MF.getProperties().hasProperty(
1328e87dc10SCraig Topper              MachineFunctionProperties::Property::Legalized) &&
1338e87dc10SCraig Topper          "Expected a legalized function?");
1348e87dc10SCraig Topper   auto *TPC = &getAnalysis<TargetPassConfig>();
1358e87dc10SCraig Topper   const Function &F = MF.getFunction();
1368e87dc10SCraig Topper   bool EnableOpt =
1378e87dc10SCraig Topper       MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
1388e87dc10SCraig Topper 
1398e87dc10SCraig Topper   const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>();
1408e87dc10SCraig Topper   const auto *LI = ST.getLegalizerInfo();
1418e87dc10SCraig Topper 
1428e87dc10SCraig Topper   GISelKnownBits *KB = &getAnalysis<GISelKnownBitsAnalysis>().get(MF);
143837dc542Spaperchalice   MachineDominatorTree *MDT =
144837dc542Spaperchalice       &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
1458e87dc10SCraig Topper   GISelCSEAnalysisWrapper &Wrapper =
1468e87dc10SCraig Topper       getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper();
1478e87dc10SCraig Topper   auto *CSEInfo = &Wrapper.get(TPC->getCSEConfig());
1488e87dc10SCraig Topper 
1498e87dc10SCraig Topper   CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
1508e87dc10SCraig Topper                      /*LegalizerInfo*/ nullptr, EnableOpt, F.hasOptSize(),
1518e87dc10SCraig Topper                      F.hasMinSize());
1528e87dc10SCraig Topper   RISCVPostLegalizerCombinerImpl Impl(MF, CInfo, TPC, *KB, CSEInfo,
1538e87dc10SCraig Topper                                         RuleConfig, ST, MDT, LI);
1548e87dc10SCraig Topper   return Impl.combineMachineInstrs();
1558e87dc10SCraig Topper }
1568e87dc10SCraig Topper 
1578e87dc10SCraig Topper char RISCVPostLegalizerCombiner::ID = 0;
1588e87dc10SCraig Topper INITIALIZE_PASS_BEGIN(RISCVPostLegalizerCombiner, DEBUG_TYPE,
1598e87dc10SCraig Topper                       "Combine RISC-V MachineInstrs after legalization", false,
1608e87dc10SCraig Topper                       false)
1618e87dc10SCraig Topper INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
1628e87dc10SCraig Topper INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis)
1638e87dc10SCraig Topper INITIALIZE_PASS_END(RISCVPostLegalizerCombiner, DEBUG_TYPE,
1648e87dc10SCraig Topper                     "Combine RISC-V MachineInstrs after legalization", false,
1658e87dc10SCraig Topper                     false)
1668e87dc10SCraig Topper 
1678e87dc10SCraig Topper namespace llvm {
1688e87dc10SCraig Topper FunctionPass *createRISCVPostLegalizerCombiner() {
1698e87dc10SCraig Topper   return new RISCVPostLegalizerCombiner();
1708e87dc10SCraig Topper }
1718e87dc10SCraig Topper } // end namespace llvm
172