xref: /llvm-project/llvm/lib/Target/Mips/MipsPostLegalizerCombiner.cpp (revision ee7ca0dddafb609090ad1789570c099d95c0afb6)
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