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