blob: c355a0e86d212a2c21675bcc85f37002f43ad12d [file] [log] [blame]
Petar Avramovic7d370a32019-01-14 10:27:05 +00001//=== 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
23using namespace llvm;
24
25namespace {
26class MipsPreLegalizerCombinerInfo : public CombinerInfo {
27public:
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
35bool MipsPreLegalizerCombinerInfo::combine(GISelChangeObserver &Observer,
36 MachineInstr &MI,
37 MachineIRBuilder &B) const {
38 return false;
39}
40
41// Pass boilerplate
42// ================
43
44class MipsPreLegalizerCombiner : public MachineFunctionPass {
45public:
46 static char ID;
47
48 MipsPreLegalizerCombiner();
49
50 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
58void MipsPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
59 AU.addRequired<TargetPassConfig>();
60 AU.setPreservesCFG();
61 getSelectionDAGFallbackAnalysisUsage(AU);
62 MachineFunctionPass::getAnalysisUsage(AU);
63}
64
65MipsPreLegalizerCombiner::MipsPreLegalizerCombiner() : MachineFunctionPass(ID) {
66 initializeMipsPreLegalizerCombinerPass(*PassRegistry::getPassRegistry());
67}
68
69bool 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);
77}
78
79char MipsPreLegalizerCombiner::ID = 0;
80INITIALIZE_PASS_BEGIN(MipsPreLegalizerCombiner, DEBUG_TYPE,
81 "Combine Mips machine instrs before legalization", false,
82 false)
83INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
84INITIALIZE_PASS_END(MipsPreLegalizerCombiner, DEBUG_TYPE,
85 "Combine Mips machine instrs before legalization", false,
86 false)
87
88namespace llvm {
89FunctionPass *createMipsPreLegalizeCombiner() {
90 return new MipsPreLegalizerCombiner();
91}
92} // end namespace llvm