1*81ad6265SDimitry Andric //=== lib/CodeGen/GlobalISel/MipsPostLegalizerCombiner.cpp ----------------===// 2*81ad6265SDimitry Andric // 3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*81ad6265SDimitry Andric // 7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===// 8*81ad6265SDimitry Andric // 9*81ad6265SDimitry Andric // This pass does combining of machine instructions at the generic MI level, 10*81ad6265SDimitry Andric // after the legalizer. 11*81ad6265SDimitry Andric // 12*81ad6265SDimitry Andric //===----------------------------------------------------------------------===// 13*81ad6265SDimitry Andric 14*81ad6265SDimitry Andric #include "MCTargetDesc/MipsMCTargetDesc.h" 15*81ad6265SDimitry Andric #include "Mips.h" 16*81ad6265SDimitry Andric #include "MipsLegalizerInfo.h" 17*81ad6265SDimitry Andric #include "MipsSubtarget.h" 18*81ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/Combiner.h" 19*81ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/CombinerHelper.h" 20*81ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/CombinerInfo.h" 21*81ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h" 22*81ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h" 23*81ad6265SDimitry Andric #include "llvm/CodeGen/MachineDominators.h" 24*81ad6265SDimitry Andric #include "llvm/CodeGen/TargetPassConfig.h" 25*81ad6265SDimitry Andric #include "llvm/Target/TargetMachine.h" 26*81ad6265SDimitry Andric 27*81ad6265SDimitry Andric #define DEBUG_TYPE "mips-postlegalizer-combiner" 28*81ad6265SDimitry Andric 29*81ad6265SDimitry Andric using namespace llvm; 30*81ad6265SDimitry Andric using namespace MIPatternMatch; 31*81ad6265SDimitry Andric 32*81ad6265SDimitry Andric #define MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS 33*81ad6265SDimitry Andric #include "MipsGenPostLegalizeGICombiner.inc" 34*81ad6265SDimitry Andric #undef MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS 35*81ad6265SDimitry Andric 36*81ad6265SDimitry Andric namespace { 37*81ad6265SDimitry Andric #define MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H 38*81ad6265SDimitry Andric #include "MipsGenPostLegalizeGICombiner.inc" 39*81ad6265SDimitry Andric #undef MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H 40*81ad6265SDimitry Andric 41*81ad6265SDimitry Andric class MipsPostLegalizerCombinerInfo final : public CombinerInfo { 42*81ad6265SDimitry Andric GISelKnownBits *KB; 43*81ad6265SDimitry Andric 44*81ad6265SDimitry Andric public: 45*81ad6265SDimitry Andric MipsGenPostLegalizerCombinerHelperRuleConfig GeneratedRuleCfg; 46*81ad6265SDimitry Andric 47*81ad6265SDimitry Andric MipsPostLegalizerCombinerInfo(bool EnableOpt, bool OptSize, bool MinSize, 48*81ad6265SDimitry Andric GISelKnownBits *KB, const MipsLegalizerInfo *LI) 49*81ad6265SDimitry Andric : CombinerInfo(/*AllowIllegalOps*/ false, /*ShouldLegalizeIllegal*/ true, 50*81ad6265SDimitry Andric /*LegalizerInfo*/ LI, EnableOpt, OptSize, MinSize), 51*81ad6265SDimitry Andric KB(KB) { 52*81ad6265SDimitry Andric if (!GeneratedRuleCfg.parseCommandLineOption()) 53*81ad6265SDimitry Andric report_fatal_error("Invalid rule identifier"); 54*81ad6265SDimitry Andric } 55*81ad6265SDimitry Andric 56*81ad6265SDimitry Andric bool combine(GISelChangeObserver &Observer, MachineInstr &MI, 57*81ad6265SDimitry Andric MachineIRBuilder &B) const override; 58*81ad6265SDimitry Andric }; 59*81ad6265SDimitry Andric 60*81ad6265SDimitry Andric bool MipsPostLegalizerCombinerInfo::combine(GISelChangeObserver &Observer, 61*81ad6265SDimitry Andric MachineInstr &MI, 62*81ad6265SDimitry Andric MachineIRBuilder &B) const { 63*81ad6265SDimitry Andric 64*81ad6265SDimitry Andric CombinerHelper Helper(Observer, B, KB, 65*81ad6265SDimitry Andric /*DominatorTree*/ nullptr, LInfo); 66*81ad6265SDimitry Andric MipsGenPostLegalizerCombinerHelper Generated(GeneratedRuleCfg, Helper); 67*81ad6265SDimitry Andric return Generated.tryCombineAll(Observer, MI, B, Helper); 68*81ad6265SDimitry Andric } 69*81ad6265SDimitry Andric 70*81ad6265SDimitry Andric #define MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP 71*81ad6265SDimitry Andric #include "MipsGenPostLegalizeGICombiner.inc" 72*81ad6265SDimitry Andric #undef MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP 73*81ad6265SDimitry Andric 74*81ad6265SDimitry Andric // Pass boilerplate 75*81ad6265SDimitry Andric // ================ 76*81ad6265SDimitry Andric 77*81ad6265SDimitry Andric class MipsPostLegalizerCombiner : public MachineFunctionPass { 78*81ad6265SDimitry Andric public: 79*81ad6265SDimitry Andric static char ID; 80*81ad6265SDimitry Andric 81*81ad6265SDimitry Andric MipsPostLegalizerCombiner(bool IsOptNone = false); 82*81ad6265SDimitry Andric 83*81ad6265SDimitry Andric StringRef getPassName() const override { 84*81ad6265SDimitry Andric return "MipsPostLegalizerCombiner"; 85*81ad6265SDimitry Andric } 86*81ad6265SDimitry Andric 87*81ad6265SDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override; 88*81ad6265SDimitry Andric 89*81ad6265SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override; 90*81ad6265SDimitry Andric 91*81ad6265SDimitry Andric private: 92*81ad6265SDimitry Andric bool IsOptNone; 93*81ad6265SDimitry Andric }; 94*81ad6265SDimitry Andric } // end anonymous namespace 95*81ad6265SDimitry Andric 96*81ad6265SDimitry Andric void MipsPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { 97*81ad6265SDimitry Andric AU.addRequired<TargetPassConfig>(); 98*81ad6265SDimitry Andric AU.setPreservesCFG(); 99*81ad6265SDimitry Andric getSelectionDAGFallbackAnalysisUsage(AU); 100*81ad6265SDimitry Andric AU.addRequired<GISelKnownBitsAnalysis>(); 101*81ad6265SDimitry Andric AU.addPreserved<GISelKnownBitsAnalysis>(); 102*81ad6265SDimitry Andric if (!IsOptNone) { 103*81ad6265SDimitry Andric AU.addRequired<MachineDominatorTree>(); 104*81ad6265SDimitry Andric AU.addPreserved<MachineDominatorTree>(); 105*81ad6265SDimitry Andric } 106*81ad6265SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 107*81ad6265SDimitry Andric } 108*81ad6265SDimitry Andric 109*81ad6265SDimitry Andric MipsPostLegalizerCombiner::MipsPostLegalizerCombiner(bool IsOptNone) 110*81ad6265SDimitry Andric : MachineFunctionPass(ID), IsOptNone(IsOptNone) { 111*81ad6265SDimitry Andric initializeMipsPostLegalizerCombinerPass(*PassRegistry::getPassRegistry()); 112*81ad6265SDimitry Andric } 113*81ad6265SDimitry Andric 114*81ad6265SDimitry Andric bool MipsPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { 115*81ad6265SDimitry Andric if (MF.getProperties().hasProperty( 116*81ad6265SDimitry Andric MachineFunctionProperties::Property::FailedISel)) 117*81ad6265SDimitry Andric return false; 118*81ad6265SDimitry Andric auto *TPC = &getAnalysis<TargetPassConfig>(); 119*81ad6265SDimitry Andric const Function &F = MF.getFunction(); 120*81ad6265SDimitry Andric bool EnableOpt = 121*81ad6265SDimitry Andric MF.getTarget().getOptLevel() != CodeGenOpt::None && !skipFunction(F); 122*81ad6265SDimitry Andric 123*81ad6265SDimitry Andric const MipsSubtarget &ST = MF.getSubtarget<MipsSubtarget>(); 124*81ad6265SDimitry Andric const MipsLegalizerInfo *LI = 125*81ad6265SDimitry Andric static_cast<const MipsLegalizerInfo *>(ST.getLegalizerInfo()); 126*81ad6265SDimitry Andric 127*81ad6265SDimitry Andric GISelKnownBits *KB = &getAnalysis<GISelKnownBitsAnalysis>().get(MF); 128*81ad6265SDimitry Andric MipsPostLegalizerCombinerInfo PCInfo(EnableOpt, F.hasOptSize(), 129*81ad6265SDimitry Andric F.hasMinSize(), KB, LI); 130*81ad6265SDimitry Andric Combiner C(PCInfo, TPC); 131*81ad6265SDimitry Andric return C.combineMachineInstrs(MF, /*CSEInfo*/ nullptr); 132*81ad6265SDimitry Andric } 133*81ad6265SDimitry Andric 134*81ad6265SDimitry Andric char MipsPostLegalizerCombiner::ID = 0; 135*81ad6265SDimitry Andric INITIALIZE_PASS_BEGIN(MipsPostLegalizerCombiner, DEBUG_TYPE, 136*81ad6265SDimitry Andric "Combine Mips machine instrs after legalization", false, 137*81ad6265SDimitry Andric false) 138*81ad6265SDimitry Andric INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) 139*81ad6265SDimitry Andric INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis) 140*81ad6265SDimitry Andric INITIALIZE_PASS_END(MipsPostLegalizerCombiner, DEBUG_TYPE, 141*81ad6265SDimitry Andric "Combine Mips machine instrs after legalization", false, 142*81ad6265SDimitry Andric false) 143*81ad6265SDimitry Andric 144*81ad6265SDimitry Andric namespace llvm { 145*81ad6265SDimitry Andric FunctionPass *createMipsPostLegalizeCombiner(bool IsOptNone) { 146*81ad6265SDimitry Andric return new MipsPostLegalizerCombiner(IsOptNone); 147*81ad6265SDimitry Andric } 148*81ad6265SDimitry Andric } // end namespace llvm 149