16d45558cSMatt Arsenault //=== lib/CodeGen/GlobalISel/MipsPostLegalizerCombiner.cpp ----------------===// 26d45558cSMatt Arsenault // 36d45558cSMatt Arsenault // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 46d45558cSMatt Arsenault // See https://llvm.org/LICENSE.txt for license information. 56d45558cSMatt Arsenault // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 66d45558cSMatt Arsenault // 76d45558cSMatt Arsenault //===----------------------------------------------------------------------===// 86d45558cSMatt Arsenault // 96d45558cSMatt Arsenault // This pass does combining of machine instructions at the generic MI level, 106d45558cSMatt Arsenault // after the legalizer. 116d45558cSMatt Arsenault // 126d45558cSMatt Arsenault //===----------------------------------------------------------------------===// 136d45558cSMatt Arsenault 146d45558cSMatt Arsenault #include "MCTargetDesc/MipsMCTargetDesc.h" 156d45558cSMatt Arsenault #include "Mips.h" 166d45558cSMatt Arsenault #include "MipsLegalizerInfo.h" 176d45558cSMatt Arsenault #include "MipsSubtarget.h" 186d45558cSMatt Arsenault #include "llvm/CodeGen/GlobalISel/Combiner.h" 196d45558cSMatt Arsenault #include "llvm/CodeGen/GlobalISel/CombinerHelper.h" 206d45558cSMatt Arsenault #include "llvm/CodeGen/GlobalISel/CombinerInfo.h" 212f608131Spvanhout #include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h" 226d45558cSMatt Arsenault #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h" 236d45558cSMatt Arsenault #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h" 246d45558cSMatt Arsenault #include "llvm/CodeGen/MachineDominators.h" 256d45558cSMatt Arsenault #include "llvm/CodeGen/TargetPassConfig.h" 266d45558cSMatt Arsenault #include "llvm/Target/TargetMachine.h" 276d45558cSMatt Arsenault 282f608131Spvanhout #define GET_GICOMBINER_DEPS 292f608131Spvanhout #include "MipsGenPostLegalizeGICombiner.inc" 302f608131Spvanhout #undef GET_GICOMBINER_DEPS 312f608131Spvanhout 326d45558cSMatt Arsenault #define DEBUG_TYPE "mips-postlegalizer-combiner" 336d45558cSMatt Arsenault 346d45558cSMatt Arsenault using namespace llvm; 356d45558cSMatt Arsenault using namespace MIPatternMatch; 366d45558cSMatt Arsenault 376d45558cSMatt Arsenault namespace { 382f608131Spvanhout #define GET_GICOMBINER_TYPES 396d45558cSMatt Arsenault #include "MipsGenPostLegalizeGICombiner.inc" 402f608131Spvanhout #undef GET_GICOMBINER_TYPES 412f608131Spvanhout 42aaf67556Spvanhout class MipsPostLegalizerCombinerImpl : public Combiner { 432f608131Spvanhout protected: 442f608131Spvanhout const MipsPostLegalizerCombinerImplRuleConfig &RuleConfig; 452f608131Spvanhout const MipsSubtarget &STI; 46*ee7ca0ddSPaul Bowen-Huggett const CombinerHelper Helper; 472f608131Spvanhout 482f608131Spvanhout public: 492f608131Spvanhout MipsPostLegalizerCombinerImpl( 50aaf67556Spvanhout MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC, 51aaf67556Spvanhout GISelKnownBits &KB, GISelCSEInfo *CSEInfo, 522f608131Spvanhout const MipsPostLegalizerCombinerImplRuleConfig &RuleConfig, 53aaf67556Spvanhout const MipsSubtarget &STI, MachineDominatorTree *MDT, 54aaf67556Spvanhout const LegalizerInfo *LI); 552f608131Spvanhout 562f608131Spvanhout static const char *getName() { return "MipsPostLegalizerCombiner"; } 572f608131Spvanhout 58aaf67556Spvanhout bool tryCombineAll(MachineInstr &I) const override; 592f608131Spvanhout 602f608131Spvanhout private: 612f608131Spvanhout #define GET_GICOMBINER_CLASS_MEMBERS 622f608131Spvanhout #include "MipsGenPostLegalizeGICombiner.inc" 632f608131Spvanhout #undef GET_GICOMBINER_CLASS_MEMBERS 642f608131Spvanhout }; 652f608131Spvanhout 662f608131Spvanhout #define GET_GICOMBINER_IMPL 672f608131Spvanhout #include "MipsGenPostLegalizeGICombiner.inc" 682f608131Spvanhout #undef GET_GICOMBINER_IMPL 692f608131Spvanhout 702f608131Spvanhout MipsPostLegalizerCombinerImpl::MipsPostLegalizerCombinerImpl( 71aaf67556Spvanhout MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC, 72aaf67556Spvanhout GISelKnownBits &KB, GISelCSEInfo *CSEInfo, 732f608131Spvanhout const MipsPostLegalizerCombinerImplRuleConfig &RuleConfig, 74aaf67556Spvanhout const MipsSubtarget &STI, MachineDominatorTree *MDT, 75aaf67556Spvanhout const LegalizerInfo *LI) 76aaf67556Spvanhout : Combiner(MF, CInfo, TPC, &KB, CSEInfo), RuleConfig(RuleConfig), STI(STI), 77aaf67556Spvanhout Helper(Observer, B, /*IsPreLegalize*/ false, &KB, MDT, LI), 782f608131Spvanhout #define GET_GICOMBINER_CONSTRUCTOR_INITS 792f608131Spvanhout #include "MipsGenPostLegalizeGICombiner.inc" 802f608131Spvanhout #undef GET_GICOMBINER_CONSTRUCTOR_INITS 812f608131Spvanhout { 822f608131Spvanhout } 836d45558cSMatt Arsenault 846d45558cSMatt Arsenault // Pass boilerplate 856d45558cSMatt Arsenault // ================ 866d45558cSMatt Arsenault 876d45558cSMatt Arsenault class MipsPostLegalizerCombiner : public MachineFunctionPass { 886d45558cSMatt Arsenault public: 896d45558cSMatt Arsenault static char ID; 906d45558cSMatt Arsenault 916d45558cSMatt Arsenault MipsPostLegalizerCombiner(bool IsOptNone = false); 926d45558cSMatt Arsenault 93aaf67556Spvanhout StringRef getPassName() const override { return "MipsPostLegalizerCombiner"; } 946d45558cSMatt Arsenault 956d45558cSMatt Arsenault bool runOnMachineFunction(MachineFunction &MF) override; 966d45558cSMatt Arsenault 976d45558cSMatt Arsenault void getAnalysisUsage(AnalysisUsage &AU) const override; 986d45558cSMatt Arsenault 996d45558cSMatt Arsenault private: 1006d45558cSMatt Arsenault bool IsOptNone; 101aaf67556Spvanhout MipsPostLegalizerCombinerImplRuleConfig RuleConfig; 1026d45558cSMatt Arsenault }; 1036d45558cSMatt Arsenault } // end anonymous namespace 1046d45558cSMatt Arsenault 1056d45558cSMatt Arsenault void MipsPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { 1066d45558cSMatt Arsenault AU.addRequired<TargetPassConfig>(); 1076d45558cSMatt Arsenault AU.setPreservesCFG(); 1086d45558cSMatt Arsenault getSelectionDAGFallbackAnalysisUsage(AU); 1096d45558cSMatt Arsenault AU.addRequired<GISelKnownBitsAnalysis>(); 1106d45558cSMatt Arsenault AU.addPreserved<GISelKnownBitsAnalysis>(); 1116d45558cSMatt Arsenault if (!IsOptNone) { 112837dc542Spaperchalice AU.addRequired<MachineDominatorTreeWrapperPass>(); 113837dc542Spaperchalice AU.addPreserved<MachineDominatorTreeWrapperPass>(); 1146d45558cSMatt Arsenault } 1156d45558cSMatt Arsenault MachineFunctionPass::getAnalysisUsage(AU); 1166d45558cSMatt Arsenault } 1176d45558cSMatt Arsenault 1186d45558cSMatt Arsenault MipsPostLegalizerCombiner::MipsPostLegalizerCombiner(bool IsOptNone) 1196d45558cSMatt Arsenault : MachineFunctionPass(ID), IsOptNone(IsOptNone) { 1206d45558cSMatt Arsenault initializeMipsPostLegalizerCombinerPass(*PassRegistry::getPassRegistry()); 121aaf67556Spvanhout 122aaf67556Spvanhout if (!RuleConfig.parseCommandLineOption()) 123aaf67556Spvanhout report_fatal_error("Invalid rule identifier"); 1246d45558cSMatt Arsenault } 1256d45558cSMatt Arsenault 1266d45558cSMatt Arsenault bool MipsPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { 1276d45558cSMatt Arsenault if (MF.getProperties().hasProperty( 1286d45558cSMatt Arsenault MachineFunctionProperties::Property::FailedISel)) 1296d45558cSMatt Arsenault return false; 1306d45558cSMatt Arsenault auto *TPC = &getAnalysis<TargetPassConfig>(); 1316d45558cSMatt Arsenault const Function &F = MF.getFunction(); 1326d45558cSMatt Arsenault bool EnableOpt = 1330a1aa6cdSArthur Eubanks MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F); 1346d45558cSMatt Arsenault 1356d45558cSMatt Arsenault const MipsSubtarget &ST = MF.getSubtarget<MipsSubtarget>(); 1366d45558cSMatt Arsenault const MipsLegalizerInfo *LI = 1376d45558cSMatt Arsenault static_cast<const MipsLegalizerInfo *>(ST.getLegalizerInfo()); 1386d45558cSMatt Arsenault 1396d45558cSMatt Arsenault GISelKnownBits *KB = &getAnalysis<GISelKnownBitsAnalysis>().get(MF); 140aaf67556Spvanhout MachineDominatorTree *MDT = 141837dc542Spaperchalice IsOptNone ? nullptr 142837dc542Spaperchalice : &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree(); 143aaf67556Spvanhout CombinerInfo CInfo(/*AllowIllegalOps*/ false, /*ShouldLegalizeIllegal*/ true, 144aaf67556Spvanhout LI, EnableOpt, F.hasOptSize(), F.hasMinSize()); 145aaf67556Spvanhout MipsPostLegalizerCombinerImpl Impl(MF, CInfo, TPC, *KB, /*CSEInfo*/ nullptr, 146aaf67556Spvanhout RuleConfig, ST, MDT, LI); 147aaf67556Spvanhout return Impl.combineMachineInstrs(); 1486d45558cSMatt Arsenault } 1496d45558cSMatt Arsenault 1506d45558cSMatt Arsenault char MipsPostLegalizerCombiner::ID = 0; 1516d45558cSMatt Arsenault INITIALIZE_PASS_BEGIN(MipsPostLegalizerCombiner, DEBUG_TYPE, 1526d45558cSMatt Arsenault "Combine Mips machine instrs after legalization", false, 1536d45558cSMatt Arsenault false) 1546d45558cSMatt Arsenault INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) 1556d45558cSMatt Arsenault INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis) 1566d45558cSMatt Arsenault INITIALIZE_PASS_END(MipsPostLegalizerCombiner, DEBUG_TYPE, 1576d45558cSMatt Arsenault "Combine Mips machine instrs after legalization", false, 1586d45558cSMatt Arsenault false) 1596d45558cSMatt Arsenault 1606d45558cSMatt Arsenault namespace llvm { 1616d45558cSMatt Arsenault FunctionPass *createMipsPostLegalizeCombiner(bool IsOptNone) { 1626d45558cSMatt Arsenault return new MipsPostLegalizerCombiner(IsOptNone); 1636d45558cSMatt Arsenault } 1646d45558cSMatt Arsenault } // end namespace llvm 165