blob: 85076590d407daefbc7caad5ce71e4339d92bb57 [file] [log] [blame]
Petar Avramovic7d370a32019-01-14 10:27:05 +00001//=== lib/CodeGen/GlobalISel/MipsPreLegalizerCombiner.cpp --------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Petar Avramovic7d370a32019-01-14 10:27:05 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This pass does combining of machine instructions at the generic MI level,
10// before the legalizer.
11//
12//===----------------------------------------------------------------------===//
13
14#include "MipsTargetMachine.h"
15#include "llvm/CodeGen/GlobalISel/Combiner.h"
Petar Avramovicb5a939d2019-01-24 10:09:52 +000016#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
Petar Avramovic7d370a32019-01-14 10:27:05 +000017#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 {
Petar Avramovicb5a939d2019-01-24 10:09:52 +000038 CombinerHelper Helper(Observer, B);
39
40 switch (MI.getOpcode()) {
41 default:
42 return false;
43 case TargetOpcode::G_LOAD:
44 case TargetOpcode::G_SEXTLOAD:
45 case TargetOpcode::G_ZEXTLOAD:
46 return Helper.tryCombineExtendingLoads(MI);
47 }
Petar Avramovic7d370a32019-01-14 10:27:05 +000048 return false;
49}
50
51// Pass boilerplate
52// ================
53
54class MipsPreLegalizerCombiner : public MachineFunctionPass {
55public:
56 static char ID;
57
58 MipsPreLegalizerCombiner();
59
60 StringRef getPassName() const override { return "MipsPreLegalizerCombiner"; }
61
62 bool runOnMachineFunction(MachineFunction &MF) override;
63
64 void getAnalysisUsage(AnalysisUsage &AU) const override;
65};
66} // end anonymous namespace
67
68void MipsPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
69 AU.addRequired<TargetPassConfig>();
70 AU.setPreservesCFG();
71 getSelectionDAGFallbackAnalysisUsage(AU);
72 MachineFunctionPass::getAnalysisUsage(AU);
73}
74
75MipsPreLegalizerCombiner::MipsPreLegalizerCombiner() : MachineFunctionPass(ID) {
76 initializeMipsPreLegalizerCombinerPass(*PassRegistry::getPassRegistry());
77}
78
79bool MipsPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
80 if (MF.getProperties().hasProperty(
81 MachineFunctionProperties::Property::FailedISel))
82 return false;
83 auto *TPC = &getAnalysis<TargetPassConfig>();
84 MipsPreLegalizerCombinerInfo PCInfo;
85 Combiner C(PCInfo, TPC);
Aditya Nandakumar500e3ea2019-01-16 00:40:37 +000086 return C.combineMachineInstrs(MF, nullptr);
Petar Avramovic7d370a32019-01-14 10:27:05 +000087}
88
89char MipsPreLegalizerCombiner::ID = 0;
90INITIALIZE_PASS_BEGIN(MipsPreLegalizerCombiner, DEBUG_TYPE,
91 "Combine Mips machine instrs before legalization", false,
92 false)
93INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
94INITIALIZE_PASS_END(MipsPreLegalizerCombiner, DEBUG_TYPE,
95 "Combine Mips machine instrs before legalization", false,
96 false)
97
98namespace llvm {
99FunctionPass *createMipsPreLegalizeCombiner() {
100 return new MipsPreLegalizerCombiner();
101}
102} // end namespace llvm