1 //=== lib/CodeGen/GlobalISel/MipsPreLegalizerCombiner.cpp --------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This pass does combining of machine instructions at the generic MI level,
11 // before the legalizer.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "MipsTargetMachine.h"
16 #include "llvm/CodeGen/GlobalISel/Combiner.h"
17 #include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
18 #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
19 #include "llvm/CodeGen/TargetPassConfig.h"
20
21 #define DEBUG_TYPE "mips-prelegalizer-combiner"
22
23 using namespace llvm;
24
25 namespace {
26 class MipsPreLegalizerCombinerInfo : public CombinerInfo {
27 public:
MipsPreLegalizerCombinerInfo()28 MipsPreLegalizerCombinerInfo()
29 : CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
30 /*LegalizerInfo*/ nullptr) {}
31 virtual bool combine(GISelChangeObserver &Observer, MachineInstr &MI,
32 MachineIRBuilder &B) const override;
33 };
34
combine(GISelChangeObserver & Observer,MachineInstr & MI,MachineIRBuilder & B) const35 bool MipsPreLegalizerCombinerInfo::combine(GISelChangeObserver &Observer,
36 MachineInstr &MI,
37 MachineIRBuilder &B) const {
38 return false;
39 }
40
41 // Pass boilerplate
42 // ================
43
44 class MipsPreLegalizerCombiner : public MachineFunctionPass {
45 public:
46 static char ID;
47
48 MipsPreLegalizerCombiner();
49
getPassName() const50 StringRef getPassName() const override { return "MipsPreLegalizerCombiner"; }
51
52 bool runOnMachineFunction(MachineFunction &MF) override;
53
54 void getAnalysisUsage(AnalysisUsage &AU) const override;
55 };
56 } // end anonymous namespace
57
getAnalysisUsage(AnalysisUsage & AU) const58 void MipsPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
59 AU.addRequired<TargetPassConfig>();
60 AU.setPreservesCFG();
61 getSelectionDAGFallbackAnalysisUsage(AU);
62 MachineFunctionPass::getAnalysisUsage(AU);
63 }
64
MipsPreLegalizerCombiner()65 MipsPreLegalizerCombiner::MipsPreLegalizerCombiner() : MachineFunctionPass(ID) {
66 initializeMipsPreLegalizerCombinerPass(*PassRegistry::getPassRegistry());
67 }
68
runOnMachineFunction(MachineFunction & MF)69 bool MipsPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
70 if (MF.getProperties().hasProperty(
71 MachineFunctionProperties::Property::FailedISel))
72 return false;
73 auto *TPC = &getAnalysis<TargetPassConfig>();
74 MipsPreLegalizerCombinerInfo PCInfo;
75 Combiner C(PCInfo, TPC);
76 return C.combineMachineInstrs(MF, nullptr);
77 }
78
79 char MipsPreLegalizerCombiner::ID = 0;
80 INITIALIZE_PASS_BEGIN(MipsPreLegalizerCombiner, DEBUG_TYPE,
81 "Combine Mips machine instrs before legalization", false,
82 false)
83 INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
84 INITIALIZE_PASS_END(MipsPreLegalizerCombiner, DEBUG_TYPE,
85 "Combine Mips machine instrs before legalization", false,
86 false)
87
88 namespace llvm {
createMipsPreLegalizeCombiner()89 FunctionPass *createMipsPreLegalizeCombiner() {
90 return new MipsPreLegalizerCombiner();
91 }
92 } // end namespace llvm
93