18677aaa1SCraig Topper //=== RISCVO0PreLegalizerCombiner.cpp -------------------------------------===// 28677aaa1SCraig Topper // 38677aaa1SCraig Topper // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 48677aaa1SCraig Topper // See https://llvm.org/LICENSE.txt for license information. 58677aaa1SCraig Topper // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68677aaa1SCraig Topper // 78677aaa1SCraig Topper //===----------------------------------------------------------------------===// 88677aaa1SCraig Topper // 98677aaa1SCraig Topper // This pass does combining of machine instructions at the generic MI level, 108677aaa1SCraig Topper // before the legalizer. 118677aaa1SCraig Topper // 128677aaa1SCraig Topper //===----------------------------------------------------------------------===// 138677aaa1SCraig Topper 148677aaa1SCraig Topper #include "RISCVSubtarget.h" 158677aaa1SCraig Topper #include "llvm/CodeGen/GlobalISel/Combiner.h" 168677aaa1SCraig Topper #include "llvm/CodeGen/GlobalISel/CombinerHelper.h" 178677aaa1SCraig Topper #include "llvm/CodeGen/GlobalISel/CombinerInfo.h" 188677aaa1SCraig Topper #include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h" 198677aaa1SCraig Topper #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h" 208677aaa1SCraig Topper #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" 218677aaa1SCraig Topper #include "llvm/CodeGen/MachineDominators.h" 228677aaa1SCraig Topper #include "llvm/CodeGen/MachineFunction.h" 238677aaa1SCraig Topper #include "llvm/CodeGen/MachineFunctionPass.h" 248677aaa1SCraig Topper #include "llvm/CodeGen/TargetPassConfig.h" 258677aaa1SCraig Topper 268677aaa1SCraig Topper #define GET_GICOMBINER_DEPS 278677aaa1SCraig Topper #include "RISCVGenO0PreLegalizeGICombiner.inc" 288677aaa1SCraig Topper #undef GET_GICOMBINER_DEPS 298677aaa1SCraig Topper 308677aaa1SCraig Topper #define DEBUG_TYPE "riscv-O0-prelegalizer-combiner" 318677aaa1SCraig Topper 328677aaa1SCraig Topper using namespace llvm; 338677aaa1SCraig Topper 348677aaa1SCraig Topper namespace { 358677aaa1SCraig Topper #define GET_GICOMBINER_TYPES 368677aaa1SCraig Topper #include "RISCVGenO0PreLegalizeGICombiner.inc" 378677aaa1SCraig Topper #undef GET_GICOMBINER_TYPES 388677aaa1SCraig Topper 398677aaa1SCraig Topper class RISCVO0PreLegalizerCombinerImpl : public Combiner { 408677aaa1SCraig Topper protected: 41*ee7ca0ddSPaul Bowen-Huggett const CombinerHelper Helper; 428677aaa1SCraig Topper const RISCVO0PreLegalizerCombinerImplRuleConfig &RuleConfig; 438677aaa1SCraig Topper const RISCVSubtarget &STI; 448677aaa1SCraig Topper 458677aaa1SCraig Topper public: 468677aaa1SCraig Topper RISCVO0PreLegalizerCombinerImpl( 478677aaa1SCraig Topper MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC, 488677aaa1SCraig Topper GISelKnownBits &KB, GISelCSEInfo *CSEInfo, 498677aaa1SCraig Topper const RISCVO0PreLegalizerCombinerImplRuleConfig &RuleConfig, 508677aaa1SCraig Topper const RISCVSubtarget &STI); 518677aaa1SCraig Topper 528677aaa1SCraig Topper static const char *getName() { return "RISCVO0PreLegalizerCombiner"; } 538677aaa1SCraig Topper 548677aaa1SCraig Topper bool tryCombineAll(MachineInstr &I) const override; 558677aaa1SCraig Topper 568677aaa1SCraig Topper private: 578677aaa1SCraig Topper #define GET_GICOMBINER_CLASS_MEMBERS 588677aaa1SCraig Topper #include "RISCVGenO0PreLegalizeGICombiner.inc" 598677aaa1SCraig Topper #undef GET_GICOMBINER_CLASS_MEMBERS 608677aaa1SCraig Topper }; 618677aaa1SCraig Topper 628677aaa1SCraig Topper #define GET_GICOMBINER_IMPL 638677aaa1SCraig Topper #include "RISCVGenO0PreLegalizeGICombiner.inc" 648677aaa1SCraig Topper #undef GET_GICOMBINER_IMPL 658677aaa1SCraig Topper 668677aaa1SCraig Topper RISCVO0PreLegalizerCombinerImpl::RISCVO0PreLegalizerCombinerImpl( 678677aaa1SCraig Topper MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC, 688677aaa1SCraig Topper GISelKnownBits &KB, GISelCSEInfo *CSEInfo, 698677aaa1SCraig Topper const RISCVO0PreLegalizerCombinerImplRuleConfig &RuleConfig, 708677aaa1SCraig Topper const RISCVSubtarget &STI) 718677aaa1SCraig Topper : Combiner(MF, CInfo, TPC, &KB, CSEInfo), 728677aaa1SCraig Topper Helper(Observer, B, /*IsPreLegalize*/ true, &KB), RuleConfig(RuleConfig), 738677aaa1SCraig Topper STI(STI), 748677aaa1SCraig Topper #define GET_GICOMBINER_CONSTRUCTOR_INITS 758677aaa1SCraig Topper #include "RISCVGenO0PreLegalizeGICombiner.inc" 768677aaa1SCraig Topper #undef GET_GICOMBINER_CONSTRUCTOR_INITS 778677aaa1SCraig Topper { 788677aaa1SCraig Topper } 798677aaa1SCraig Topper 808677aaa1SCraig Topper // Pass boilerplate 818677aaa1SCraig Topper // ================ 828677aaa1SCraig Topper 838677aaa1SCraig Topper class RISCVO0PreLegalizerCombiner : public MachineFunctionPass { 848677aaa1SCraig Topper public: 858677aaa1SCraig Topper static char ID; 868677aaa1SCraig Topper 878677aaa1SCraig Topper RISCVO0PreLegalizerCombiner(); 888677aaa1SCraig Topper 898677aaa1SCraig Topper StringRef getPassName() const override { 908677aaa1SCraig Topper return "RISCVO0PreLegalizerCombiner"; 918677aaa1SCraig Topper } 928677aaa1SCraig Topper 938677aaa1SCraig Topper bool runOnMachineFunction(MachineFunction &MF) override; 948677aaa1SCraig Topper 958677aaa1SCraig Topper void getAnalysisUsage(AnalysisUsage &AU) const override; 968677aaa1SCraig Topper 978677aaa1SCraig Topper private: 988677aaa1SCraig Topper RISCVO0PreLegalizerCombinerImplRuleConfig RuleConfig; 998677aaa1SCraig Topper }; 1008677aaa1SCraig Topper } // end anonymous namespace 1018677aaa1SCraig Topper 1028677aaa1SCraig Topper void RISCVO0PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { 1038677aaa1SCraig Topper AU.addRequired<TargetPassConfig>(); 1048677aaa1SCraig Topper AU.setPreservesCFG(); 1058677aaa1SCraig Topper getSelectionDAGFallbackAnalysisUsage(AU); 1068677aaa1SCraig Topper AU.addRequired<GISelKnownBitsAnalysis>(); 1078677aaa1SCraig Topper AU.addPreserved<GISelKnownBitsAnalysis>(); 1088677aaa1SCraig Topper MachineFunctionPass::getAnalysisUsage(AU); 1098677aaa1SCraig Topper } 1108677aaa1SCraig Topper 1118677aaa1SCraig Topper RISCVO0PreLegalizerCombiner::RISCVO0PreLegalizerCombiner() 1128677aaa1SCraig Topper : MachineFunctionPass(ID) { 1138677aaa1SCraig Topper initializeRISCVO0PreLegalizerCombinerPass(*PassRegistry::getPassRegistry()); 1148677aaa1SCraig Topper 1158677aaa1SCraig Topper if (!RuleConfig.parseCommandLineOption()) 1168677aaa1SCraig Topper report_fatal_error("Invalid rule identifier"); 1178677aaa1SCraig Topper } 1188677aaa1SCraig Topper 1198677aaa1SCraig Topper bool RISCVO0PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { 1208677aaa1SCraig Topper if (MF.getProperties().hasProperty( 1218677aaa1SCraig Topper MachineFunctionProperties::Property::FailedISel)) 1228677aaa1SCraig Topper return false; 1238677aaa1SCraig Topper auto &TPC = getAnalysis<TargetPassConfig>(); 1248677aaa1SCraig Topper 1258677aaa1SCraig Topper const Function &F = MF.getFunction(); 1268677aaa1SCraig Topper GISelKnownBits *KB = &getAnalysis<GISelKnownBitsAnalysis>().get(MF); 1278677aaa1SCraig Topper 1288677aaa1SCraig Topper const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>(); 1298677aaa1SCraig Topper 1308677aaa1SCraig Topper CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false, 1318677aaa1SCraig Topper /*LegalizerInfo*/ nullptr, /*EnableOpt*/ false, 1328677aaa1SCraig Topper F.hasOptSize(), F.hasMinSize()); 1334bd6e15aSCraig Topper // Disable fixed-point iteration in the Combiner. This improves compile-time 1344bd6e15aSCraig Topper // at the cost of possibly missing optimizations. See PR#94291 for details. 1354bd6e15aSCraig Topper CInfo.MaxIterations = 1; 1364bd6e15aSCraig Topper 1378677aaa1SCraig Topper RISCVO0PreLegalizerCombinerImpl Impl(MF, CInfo, &TPC, *KB, 1388677aaa1SCraig Topper /*CSEInfo*/ nullptr, RuleConfig, ST); 1398677aaa1SCraig Topper return Impl.combineMachineInstrs(); 1408677aaa1SCraig Topper } 1418677aaa1SCraig Topper 1428677aaa1SCraig Topper char RISCVO0PreLegalizerCombiner::ID = 0; 1438677aaa1SCraig Topper INITIALIZE_PASS_BEGIN(RISCVO0PreLegalizerCombiner, DEBUG_TYPE, 1444bd6e15aSCraig Topper "Combine RISC-V machine instrs before legalization", 1454bd6e15aSCraig Topper false, false) 1468677aaa1SCraig Topper INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) 1478677aaa1SCraig Topper INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis) 1488677aaa1SCraig Topper INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass) 1498677aaa1SCraig Topper INITIALIZE_PASS_END(RISCVO0PreLegalizerCombiner, DEBUG_TYPE, 1508e87dc10SCraig Topper "Combine RISC-V machine instrs before legalization", false, 1518677aaa1SCraig Topper false) 1528677aaa1SCraig Topper 1538677aaa1SCraig Topper namespace llvm { 1548677aaa1SCraig Topper FunctionPass *createRISCVO0PreLegalizerCombiner() { 1558677aaa1SCraig Topper return new RISCVO0PreLegalizerCombiner(); 1568677aaa1SCraig Topper } 1578677aaa1SCraig Topper } // end namespace llvm 158