Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/llvm/lib/Target/RISCV/GISel/RISCVPreLegalizerCombiner.cpp
Line
Count
Source (jump to first uncovered line)
1
//=== RISCVPreLegalizerCombiner.cpp ---------------------------------------===//
2
//
3
// 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
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This pass does combining of machine instructions at the generic MI level,
10
// before the legalizer.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#include "RISCVSubtarget.h"
15
#include "llvm/CodeGen/GlobalISel/CSEInfo.h"
16
#include "llvm/CodeGen/GlobalISel/Combiner.h"
17
#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
18
#include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
19
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
20
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
21
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
22
#include "llvm/CodeGen/MachineDominators.h"
23
#include "llvm/CodeGen/MachineFunction.h"
24
#include "llvm/CodeGen/MachineFunctionPass.h"
25
#include "llvm/CodeGen/MachineRegisterInfo.h"
26
#include "llvm/CodeGen/TargetPassConfig.h"
27
28
#define GET_GICOMBINER_DEPS
29
#include "RISCVGenPreLegalizeGICombiner.inc"
30
#undef GET_GICOMBINER_DEPS
31
32
#define DEBUG_TYPE "riscv-prelegalizer-combiner"
33
34
using namespace llvm;
35
36
namespace {
37
38
#define GET_GICOMBINER_TYPES
39
#include "RISCVGenPreLegalizeGICombiner.inc"
40
#undef GET_GICOMBINER_TYPES
41
42
class RISCVPreLegalizerCombinerImpl : public Combiner {
43
protected:
44
  // TODO: Make CombinerHelper methods const.
45
  mutable CombinerHelper Helper;
46
  const RISCVPreLegalizerCombinerImplRuleConfig &RuleConfig;
47
  const RISCVSubtarget &STI;
48
49
public:
50
  RISCVPreLegalizerCombinerImpl(
51
      MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC,
52
      GISelKnownBits &KB, GISelCSEInfo *CSEInfo,
53
      const RISCVPreLegalizerCombinerImplRuleConfig &RuleConfig,
54
      const RISCVSubtarget &STI, MachineDominatorTree *MDT,
55
      const LegalizerInfo *LI);
56
57
0
  static const char *getName() { return "RISCV00PreLegalizerCombiner"; }
58
59
  bool tryCombineAll(MachineInstr &I) const override;
60
61
private:
62
#define GET_GICOMBINER_CLASS_MEMBERS
63
#include "RISCVGenPreLegalizeGICombiner.inc"
64
#undef GET_GICOMBINER_CLASS_MEMBERS
65
};
66
67
#define GET_GICOMBINER_IMPL
68
#include "RISCVGenPreLegalizeGICombiner.inc"
69
#undef GET_GICOMBINER_IMPL
70
71
RISCVPreLegalizerCombinerImpl::RISCVPreLegalizerCombinerImpl(
72
    MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC,
73
    GISelKnownBits &KB, GISelCSEInfo *CSEInfo,
74
    const RISCVPreLegalizerCombinerImplRuleConfig &RuleConfig,
75
    const RISCVSubtarget &STI, MachineDominatorTree *MDT,
76
    const LegalizerInfo *LI)
77
    : Combiner(MF, CInfo, TPC, &KB, CSEInfo),
78
      Helper(Observer, B, /*IsPreLegalize*/ true, &KB, MDT, LI),
79
      RuleConfig(RuleConfig), STI(STI),
80
#define GET_GICOMBINER_CONSTRUCTOR_INITS
81
#include "RISCVGenPreLegalizeGICombiner.inc"
82
#undef GET_GICOMBINER_CONSTRUCTOR_INITS
83
0
{
84
0
}
85
86
// Pass boilerplate
87
// ================
88
89
class RISCVPreLegalizerCombiner : public MachineFunctionPass {
90
public:
91
  static char ID;
92
93
  RISCVPreLegalizerCombiner();
94
95
0
  StringRef getPassName() const override { return "RISCVPreLegalizerCombiner"; }
96
97
  bool runOnMachineFunction(MachineFunction &MF) override;
98
99
  void getAnalysisUsage(AnalysisUsage &AU) const override;
100
101
private:
102
  RISCVPreLegalizerCombinerImplRuleConfig RuleConfig;
103
};
104
} // end anonymous namespace
105
106
0
void RISCVPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
107
0
  AU.addRequired<TargetPassConfig>();
108
0
  AU.setPreservesCFG();
109
0
  getSelectionDAGFallbackAnalysisUsage(AU);
110
0
  AU.addRequired<GISelKnownBitsAnalysis>();
111
0
  AU.addPreserved<GISelKnownBitsAnalysis>();
112
0
  AU.addRequired<MachineDominatorTree>();
113
0
  AU.addPreserved<MachineDominatorTree>();
114
0
  AU.addRequired<GISelCSEAnalysisWrapperPass>();
115
0
  AU.addPreserved<GISelCSEAnalysisWrapperPass>();
116
0
  MachineFunctionPass::getAnalysisUsage(AU);
117
0
}
118
119
RISCVPreLegalizerCombiner::RISCVPreLegalizerCombiner()
120
0
    : MachineFunctionPass(ID) {
121
0
  initializeRISCVPreLegalizerCombinerPass(*PassRegistry::getPassRegistry());
122
123
0
  if (!RuleConfig.parseCommandLineOption())
124
0
    report_fatal_error("Invalid rule identifier");
125
0
}
126
127
0
bool RISCVPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
128
0
  if (MF.getProperties().hasProperty(
129
0
          MachineFunctionProperties::Property::FailedISel))
130
0
    return false;
131
0
  auto &TPC = getAnalysis<TargetPassConfig>();
132
133
  // Enable CSE.
134
0
  GISelCSEAnalysisWrapper &Wrapper =
135
0
      getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper();
136
0
  auto *CSEInfo = &Wrapper.get(TPC.getCSEConfig());
137
138
0
  const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>();
139
0
  const auto *LI = ST.getLegalizerInfo();
140
141
0
  const Function &F = MF.getFunction();
142
0
  bool EnableOpt =
143
0
      MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
144
0
  GISelKnownBits *KB = &getAnalysis<GISelKnownBitsAnalysis>().get(MF);
145
0
  MachineDominatorTree *MDT = &getAnalysis<MachineDominatorTree>();
146
0
  CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
147
0
                     /*LegalizerInfo*/ nullptr, EnableOpt, F.hasOptSize(),
148
0
                     F.hasMinSize());
149
0
  RISCVPreLegalizerCombinerImpl Impl(MF, CInfo, &TPC, *KB, CSEInfo, RuleConfig,
150
0
                                     ST, MDT, LI);
151
0
  return Impl.combineMachineInstrs();
152
0
}
153
154
char RISCVPreLegalizerCombiner::ID = 0;
155
62
INITIALIZE_PASS_BEGIN(RISCVPreLegalizerCombiner, DEBUG_TYPE,
156
62
                      "Combine RISC-V machine instrs before legalization", false,
157
62
                      false)
158
62
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
159
62
INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis)
160
62
INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)
161
62
INITIALIZE_PASS_END(RISCVPreLegalizerCombiner, DEBUG_TYPE,
162
                    "Combine RISC-V machine instrs before legalization", false,
163
                    false)
164
165
namespace llvm {
166
0
FunctionPass *createRISCVPreLegalizerCombiner() {
167
0
  return new RISCVPreLegalizerCombiner();
168
0
}
169
} // end namespace llvm