xref: /freebsd/contrib/llvm-project/llvm/lib/Target/Mips/MipsPreLegalizerCombiner.cpp (revision 8bcb0991864975618c09697b1aca10683346d9f0)
10b57cec5SDimitry Andric //=== lib/CodeGen/GlobalISel/MipsPreLegalizerCombiner.cpp --------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This pass does combining of machine instructions at the generic MI level,
100b57cec5SDimitry Andric // before the legalizer.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #include "MipsTargetMachine.h"
150b57cec5SDimitry Andric #include "llvm/CodeGen/GlobalISel/Combiner.h"
160b57cec5SDimitry Andric #include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
170b57cec5SDimitry Andric #include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
180b57cec5SDimitry Andric #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
190b57cec5SDimitry Andric #include "llvm/CodeGen/TargetPassConfig.h"
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric #define DEBUG_TYPE "mips-prelegalizer-combiner"
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric using namespace llvm;
240b57cec5SDimitry Andric 
250b57cec5SDimitry Andric namespace {
260b57cec5SDimitry Andric class MipsPreLegalizerCombinerInfo : public CombinerInfo {
270b57cec5SDimitry Andric public:
280b57cec5SDimitry Andric   MipsPreLegalizerCombinerInfo()
290b57cec5SDimitry Andric       : CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
30*8bcb0991SDimitry Andric                      /*LegalizerInfo*/ nullptr, /*EnableOpt*/ false,
31*8bcb0991SDimitry Andric                      /*EnableOptSize*/ false, /*EnableMinSize*/ false) {}
320b57cec5SDimitry Andric   virtual bool combine(GISelChangeObserver &Observer, MachineInstr &MI,
330b57cec5SDimitry Andric                        MachineIRBuilder &B) const override;
340b57cec5SDimitry Andric };
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric bool MipsPreLegalizerCombinerInfo::combine(GISelChangeObserver &Observer,
370b57cec5SDimitry Andric                                            MachineInstr &MI,
380b57cec5SDimitry Andric                                            MachineIRBuilder &B) const {
390b57cec5SDimitry Andric   CombinerHelper Helper(Observer, B);
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric   switch (MI.getOpcode()) {
420b57cec5SDimitry Andric   default:
430b57cec5SDimitry Andric     return false;
440b57cec5SDimitry Andric   case TargetOpcode::G_LOAD:
450b57cec5SDimitry Andric   case TargetOpcode::G_SEXTLOAD:
460b57cec5SDimitry Andric   case TargetOpcode::G_ZEXTLOAD:
470b57cec5SDimitry Andric     return Helper.tryCombineExtendingLoads(MI);
480b57cec5SDimitry Andric   }
490b57cec5SDimitry Andric   return false;
500b57cec5SDimitry Andric }
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric // Pass boilerplate
530b57cec5SDimitry Andric // ================
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric class MipsPreLegalizerCombiner : public MachineFunctionPass {
560b57cec5SDimitry Andric public:
570b57cec5SDimitry Andric   static char ID;
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric   MipsPreLegalizerCombiner();
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric   StringRef getPassName() const override { return "MipsPreLegalizerCombiner"; }
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   bool runOnMachineFunction(MachineFunction &MF) override;
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric   void getAnalysisUsage(AnalysisUsage &AU) const override;
660b57cec5SDimitry Andric };
670b57cec5SDimitry Andric } // end anonymous namespace
680b57cec5SDimitry Andric 
690b57cec5SDimitry Andric void MipsPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
700b57cec5SDimitry Andric   AU.addRequired<TargetPassConfig>();
710b57cec5SDimitry Andric   AU.setPreservesCFG();
720b57cec5SDimitry Andric   getSelectionDAGFallbackAnalysisUsage(AU);
730b57cec5SDimitry Andric   MachineFunctionPass::getAnalysisUsage(AU);
740b57cec5SDimitry Andric }
750b57cec5SDimitry Andric 
760b57cec5SDimitry Andric MipsPreLegalizerCombiner::MipsPreLegalizerCombiner() : MachineFunctionPass(ID) {
770b57cec5SDimitry Andric   initializeMipsPreLegalizerCombinerPass(*PassRegistry::getPassRegistry());
780b57cec5SDimitry Andric }
790b57cec5SDimitry Andric 
800b57cec5SDimitry Andric bool MipsPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
810b57cec5SDimitry Andric   if (MF.getProperties().hasProperty(
820b57cec5SDimitry Andric           MachineFunctionProperties::Property::FailedISel))
830b57cec5SDimitry Andric     return false;
840b57cec5SDimitry Andric   auto *TPC = &getAnalysis<TargetPassConfig>();
850b57cec5SDimitry Andric   MipsPreLegalizerCombinerInfo PCInfo;
860b57cec5SDimitry Andric   Combiner C(PCInfo, TPC);
870b57cec5SDimitry Andric   return C.combineMachineInstrs(MF, nullptr);
880b57cec5SDimitry Andric }
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric char MipsPreLegalizerCombiner::ID = 0;
910b57cec5SDimitry Andric INITIALIZE_PASS_BEGIN(MipsPreLegalizerCombiner, DEBUG_TYPE,
920b57cec5SDimitry Andric                       "Combine Mips machine instrs before legalization", false,
930b57cec5SDimitry Andric                       false)
940b57cec5SDimitry Andric INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
950b57cec5SDimitry Andric INITIALIZE_PASS_END(MipsPreLegalizerCombiner, DEBUG_TYPE,
960b57cec5SDimitry Andric                     "Combine Mips machine instrs before legalization", false,
970b57cec5SDimitry Andric                     false)
980b57cec5SDimitry Andric 
990b57cec5SDimitry Andric namespace llvm {
1000b57cec5SDimitry Andric FunctionPass *createMipsPreLegalizeCombiner() {
1010b57cec5SDimitry Andric   return new MipsPreLegalizerCombiner();
1020b57cec5SDimitry Andric }
1030b57cec5SDimitry Andric } // end namespace llvm
104