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