181ad6265SDimitry Andric //=== lib/CodeGen/GlobalISel/MipsPostLegalizerCombiner.cpp ----------------===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric // 981ad6265SDimitry Andric // This pass does combining of machine instructions at the generic MI level, 1081ad6265SDimitry Andric // after the legalizer. 1181ad6265SDimitry Andric // 1281ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1381ad6265SDimitry Andric 1481ad6265SDimitry Andric #include "MCTargetDesc/MipsMCTargetDesc.h" 1581ad6265SDimitry Andric #include "Mips.h" 1681ad6265SDimitry Andric #include "MipsLegalizerInfo.h" 1781ad6265SDimitry Andric #include "MipsSubtarget.h" 1881ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/Combiner.h" 1981ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/CombinerHelper.h" 2081ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/CombinerInfo.h" 2181ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h" 2281ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h" 2381ad6265SDimitry Andric #include "llvm/CodeGen/MachineDominators.h" 2481ad6265SDimitry Andric #include "llvm/CodeGen/TargetPassConfig.h" 2581ad6265SDimitry Andric #include "llvm/Target/TargetMachine.h" 2681ad6265SDimitry Andric 2781ad6265SDimitry Andric #define DEBUG_TYPE "mips-postlegalizer-combiner" 2881ad6265SDimitry Andric 2981ad6265SDimitry Andric using namespace llvm; 3081ad6265SDimitry Andric using namespace MIPatternMatch; 3181ad6265SDimitry Andric 3281ad6265SDimitry Andric #define MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS 3381ad6265SDimitry Andric #include "MipsGenPostLegalizeGICombiner.inc" 3481ad6265SDimitry Andric #undef MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS 3581ad6265SDimitry Andric 3681ad6265SDimitry Andric namespace { 3781ad6265SDimitry Andric #define MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H 3881ad6265SDimitry Andric #include "MipsGenPostLegalizeGICombiner.inc" 3981ad6265SDimitry Andric #undef MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H 4081ad6265SDimitry Andric 4181ad6265SDimitry Andric class MipsPostLegalizerCombinerInfo final : public CombinerInfo { 4281ad6265SDimitry Andric GISelKnownBits *KB; 4381ad6265SDimitry Andric 4481ad6265SDimitry Andric public: 4581ad6265SDimitry Andric MipsGenPostLegalizerCombinerHelperRuleConfig GeneratedRuleCfg; 4681ad6265SDimitry Andric 4781ad6265SDimitry Andric MipsPostLegalizerCombinerInfo(bool EnableOpt, bool OptSize, bool MinSize, 4881ad6265SDimitry Andric GISelKnownBits *KB, const MipsLegalizerInfo *LI) 4981ad6265SDimitry Andric : CombinerInfo(/*AllowIllegalOps*/ false, /*ShouldLegalizeIllegal*/ true, 5081ad6265SDimitry Andric /*LegalizerInfo*/ LI, EnableOpt, OptSize, MinSize), 5181ad6265SDimitry Andric KB(KB) { 5281ad6265SDimitry Andric if (!GeneratedRuleCfg.parseCommandLineOption()) 5381ad6265SDimitry Andric report_fatal_error("Invalid rule identifier"); 5481ad6265SDimitry Andric } 5581ad6265SDimitry Andric 5681ad6265SDimitry Andric bool combine(GISelChangeObserver &Observer, MachineInstr &MI, 5781ad6265SDimitry Andric MachineIRBuilder &B) const override; 5881ad6265SDimitry Andric }; 5981ad6265SDimitry Andric 6081ad6265SDimitry Andric bool MipsPostLegalizerCombinerInfo::combine(GISelChangeObserver &Observer, 6181ad6265SDimitry Andric MachineInstr &MI, 6281ad6265SDimitry Andric MachineIRBuilder &B) const { 6381ad6265SDimitry Andric 64*bdd1243dSDimitry Andric CombinerHelper Helper(Observer, B, /* IsPreLegalize*/ false, KB, 6581ad6265SDimitry Andric /*DominatorTree*/ nullptr, LInfo); 6681ad6265SDimitry Andric MipsGenPostLegalizerCombinerHelper Generated(GeneratedRuleCfg, Helper); 6781ad6265SDimitry Andric return Generated.tryCombineAll(Observer, MI, B, Helper); 6881ad6265SDimitry Andric } 6981ad6265SDimitry Andric 7081ad6265SDimitry Andric #define MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP 7181ad6265SDimitry Andric #include "MipsGenPostLegalizeGICombiner.inc" 7281ad6265SDimitry Andric #undef MIPSPOSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP 7381ad6265SDimitry Andric 7481ad6265SDimitry Andric // Pass boilerplate 7581ad6265SDimitry Andric // ================ 7681ad6265SDimitry Andric 7781ad6265SDimitry Andric class MipsPostLegalizerCombiner : public MachineFunctionPass { 7881ad6265SDimitry Andric public: 7981ad6265SDimitry Andric static char ID; 8081ad6265SDimitry Andric 8181ad6265SDimitry Andric MipsPostLegalizerCombiner(bool IsOptNone = false); 8281ad6265SDimitry Andric 8381ad6265SDimitry Andric StringRef getPassName() const override { 8481ad6265SDimitry Andric return "MipsPostLegalizerCombiner"; 8581ad6265SDimitry Andric } 8681ad6265SDimitry Andric 8781ad6265SDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override; 8881ad6265SDimitry Andric 8981ad6265SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override; 9081ad6265SDimitry Andric 9181ad6265SDimitry Andric private: 9281ad6265SDimitry Andric bool IsOptNone; 9381ad6265SDimitry Andric }; 9481ad6265SDimitry Andric } // end anonymous namespace 9581ad6265SDimitry Andric 9681ad6265SDimitry Andric void MipsPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { 9781ad6265SDimitry Andric AU.addRequired<TargetPassConfig>(); 9881ad6265SDimitry Andric AU.setPreservesCFG(); 9981ad6265SDimitry Andric getSelectionDAGFallbackAnalysisUsage(AU); 10081ad6265SDimitry Andric AU.addRequired<GISelKnownBitsAnalysis>(); 10181ad6265SDimitry Andric AU.addPreserved<GISelKnownBitsAnalysis>(); 10281ad6265SDimitry Andric if (!IsOptNone) { 10381ad6265SDimitry Andric AU.addRequired<MachineDominatorTree>(); 10481ad6265SDimitry Andric AU.addPreserved<MachineDominatorTree>(); 10581ad6265SDimitry Andric } 10681ad6265SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 10781ad6265SDimitry Andric } 10881ad6265SDimitry Andric 10981ad6265SDimitry Andric MipsPostLegalizerCombiner::MipsPostLegalizerCombiner(bool IsOptNone) 11081ad6265SDimitry Andric : MachineFunctionPass(ID), IsOptNone(IsOptNone) { 11181ad6265SDimitry Andric initializeMipsPostLegalizerCombinerPass(*PassRegistry::getPassRegistry()); 11281ad6265SDimitry Andric } 11381ad6265SDimitry Andric 11481ad6265SDimitry Andric bool MipsPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { 11581ad6265SDimitry Andric if (MF.getProperties().hasProperty( 11681ad6265SDimitry Andric MachineFunctionProperties::Property::FailedISel)) 11781ad6265SDimitry Andric return false; 11881ad6265SDimitry Andric auto *TPC = &getAnalysis<TargetPassConfig>(); 11981ad6265SDimitry Andric const Function &F = MF.getFunction(); 12081ad6265SDimitry Andric bool EnableOpt = 12181ad6265SDimitry Andric MF.getTarget().getOptLevel() != CodeGenOpt::None && !skipFunction(F); 12281ad6265SDimitry Andric 12381ad6265SDimitry Andric const MipsSubtarget &ST = MF.getSubtarget<MipsSubtarget>(); 12481ad6265SDimitry Andric const MipsLegalizerInfo *LI = 12581ad6265SDimitry Andric static_cast<const MipsLegalizerInfo *>(ST.getLegalizerInfo()); 12681ad6265SDimitry Andric 12781ad6265SDimitry Andric GISelKnownBits *KB = &getAnalysis<GISelKnownBitsAnalysis>().get(MF); 12881ad6265SDimitry Andric MipsPostLegalizerCombinerInfo PCInfo(EnableOpt, F.hasOptSize(), 12981ad6265SDimitry Andric F.hasMinSize(), KB, LI); 13081ad6265SDimitry Andric Combiner C(PCInfo, TPC); 13181ad6265SDimitry Andric return C.combineMachineInstrs(MF, /*CSEInfo*/ nullptr); 13281ad6265SDimitry Andric } 13381ad6265SDimitry Andric 13481ad6265SDimitry Andric char MipsPostLegalizerCombiner::ID = 0; 13581ad6265SDimitry Andric INITIALIZE_PASS_BEGIN(MipsPostLegalizerCombiner, DEBUG_TYPE, 13681ad6265SDimitry Andric "Combine Mips machine instrs after legalization", false, 13781ad6265SDimitry Andric false) 13881ad6265SDimitry Andric INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) 13981ad6265SDimitry Andric INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis) 14081ad6265SDimitry Andric INITIALIZE_PASS_END(MipsPostLegalizerCombiner, DEBUG_TYPE, 14181ad6265SDimitry Andric "Combine Mips machine instrs after legalization", false, 14281ad6265SDimitry Andric false) 14381ad6265SDimitry Andric 14481ad6265SDimitry Andric namespace llvm { 14581ad6265SDimitry Andric FunctionPass *createMipsPostLegalizeCombiner(bool IsOptNone) { 14681ad6265SDimitry Andric return new MipsPostLegalizerCombiner(IsOptNone); 14781ad6265SDimitry Andric } 14881ad6265SDimitry Andric } // end namespace llvm 149