1//===-- RISCV.h - Top-level interface for RISC-V ----------------*- C++ -*-===//
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 file contains the entry points for global functions defined in the LLVM
10// RISC-V back-end.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_RISCV_RISCV_H
15#define LLVM_LIB_TARGET_RISCV_RISCV_H
16
17#include "MCTargetDesc/RISCVBaseInfo.h"
18#include "llvm/CodeGen/SelectionDAGISel.h"
19#include "llvm/Target/TargetMachine.h"
20
21namespace llvm {
22class FunctionPass;
23class InstructionSelector;
24class ModulePass;
25class PassRegistry;
26class RISCVRegisterBankInfo;
27class RISCVSubtarget;
28class RISCVTargetMachine;
29
30class RISCVCodeGenPreparePass
31 : public OptionalPassInfoMixin<RISCVCodeGenPreparePass> {
32private:
33 const RISCVTargetMachine *TM;
34
35public:
36 RISCVCodeGenPreparePass(const RISCVTargetMachine *TM) : TM(TM) {}
37 PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
38};
39FunctionPass *createRISCVCodeGenPrepareLegacyPass();
40void initializeRISCVCodeGenPrepareLegacyPass(PassRegistry &);
41
42FunctionPass *createRISCVDeadRegisterDefinitionsPass();
43void initializeRISCVDeadRegisterDefinitionsPass(PassRegistry &);
44
45FunctionPass *createRISCVIndirectBranchTrackingPass();
46void initializeRISCVIndirectBranchTrackingPass(PassRegistry &);
47
48FunctionPass *createRISCVLandingPadSetupPass();
49void initializeRISCVLandingPadSetupPass(PassRegistry &);
50
51FunctionPass *createRISCVISelDagLegacyPass(RISCVTargetMachine &TM,
52 CodeGenOptLevel OptLevel);
53
54class RISCVISelDAGToDAGPass : public SelectionDAGISelPass {
55public:
56 RISCVISelDAGToDAGPass(RISCVTargetMachine &TM, CodeGenOptLevel OptLevel);
57};
58
59FunctionPass *createRISCVLateBranchOptPass();
60void initializeRISCVLateBranchOptPass(PassRegistry &);
61
62FunctionPass *createRISCVMakeCompressibleOptPass();
63void initializeRISCVMakeCompressibleOptPass(PassRegistry &);
64
65class RISCVGatherScatterLoweringPass
66 : public OptionalPassInfoMixin<RISCVGatherScatterLoweringPass> {
67private:
68 const RISCVTargetMachine *TM;
69
70public:
71 RISCVGatherScatterLoweringPass(const RISCVTargetMachine *TM) : TM(TM) {}
72 PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
73};
74
75FunctionPass *createRISCVGatherScatterLoweringLegacyPass();
76void initializeRISCVGatherScatterLoweringLegacyPass(PassRegistry &);
77
78class RISCVVectorPeepholePass
79 : public OptionalPassInfoMixin<RISCVVectorPeepholePass> {
80public:
81 PreservedAnalyses run(MachineFunction &MF,
82 MachineFunctionAnalysisManager &MFAM);
83 MachineFunctionProperties getRequiredProperties() const {
84 return MachineFunctionProperties().setIsSSA();
85 }
86};
87
88FunctionPass *createRISCVVectorPeepholeLegacyPass();
89void initializeRISCVVectorPeepholeLegacyPass(PassRegistry &);
90
91class RISCVOptWInstrsPass : public OptionalPassInfoMixin<RISCVOptWInstrsPass> {
92public:
93 PreservedAnalyses run(MachineFunction &MF,
94 MachineFunctionAnalysisManager &MFAM);
95};
96
97FunctionPass *createRISCVOptWInstrsLegacyPass();
98void initializeRISCVOptWInstrsLegacyPass(PassRegistry &);
99
100class RISCVFoldMemOffsetPass
101 : public OptionalPassInfoMixin<RISCVFoldMemOffsetPass> {
102public:
103 PreservedAnalyses run(MachineFunction &MF,
104 MachineFunctionAnalysisManager &MFAM);
105};
106
107FunctionPass *createRISCVFoldMemOffsetLegacyPass();
108void initializeRISCVFoldMemOffsetLegacyPass(PassRegistry &);
109
110FunctionPass *createRISCVMergeBaseOffsetOptPass();
111void initializeRISCVMergeBaseOffsetOptPass(PassRegistry &);
112
113class RISCVExpandPseudoPreRAPass
114 : public RequiredPassInfoMixin<RISCVExpandPseudoPreRAPass> {
115public:
116 PreservedAnalyses run(MachineFunction &MF,
117 MachineFunctionAnalysisManager &MFAM);
118 MachineFunctionProperties getRequiredProperties() const {
119 return MachineFunctionProperties().setIsSSA();
120 }
121};
122
123FunctionPass *createRISCVExpandPseudoPreRALegacyPass();
124void initializeRISCVExpandPseudoPreRALegacyPass(PassRegistry &);
125
126class RISCVExpandPseudoPostRAPass
127 : public RequiredPassInfoMixin<RISCVExpandPseudoPostRAPass> {
128public:
129 PreservedAnalyses run(MachineFunction &MF,
130 MachineFunctionAnalysisManager &MFAM);
131};
132
133FunctionPass *createRISCVExpandPseudoPostRALegacyPass();
134void initializeRISCVExpandPseudoPostRALegacyPass(PassRegistry &);
135
136class RISCVExpandPseudoPreEmitPass
137 : public RequiredPassInfoMixin<RISCVExpandPseudoPreEmitPass> {
138public:
139 PreservedAnalyses run(MachineFunction &MF,
140 MachineFunctionAnalysisManager &MFAM);
141};
142
143FunctionPass *createRISCVExpandPseudoPreEmitLegacyPass();
144void initializeRISCVExpandPseudoPreEmitLegacyPass(PassRegistry &);
145
146class RISCVExpandPseudoAtomicsPass
147 : public RequiredPassInfoMixin<RISCVExpandPseudoAtomicsPass> {
148public:
149 PreservedAnalyses run(MachineFunction &MF,
150 MachineFunctionAnalysisManager &MFAM);
151};
152
153FunctionPass *createRISCVExpandPseudoAtomicsLegacyPass();
154void initializeRISCVExpandPseudoAtomicsLegacyPass(PassRegistry &);
155
156FunctionPass *createRISCVInsertVSETVLIPass();
157void initializeRISCVInsertVSETVLIPass(PassRegistry &);
158extern char &RISCVInsertVSETVLIID;
159
160FunctionPass *createRISCVInsertReadWriteCSRPass();
161void initializeRISCVInsertReadWriteCSRPass(PassRegistry &);
162
163FunctionPass *createRISCVInsertWriteVXRMPass();
164void initializeRISCVInsertWriteVXRMPass(PassRegistry &);
165
166FunctionPass *createRISCVRedundantCopyEliminationPass();
167void initializeRISCVRedundantCopyEliminationPass(PassRegistry &);
168
169FunctionPass *createRISCVMoveMergePass();
170void initializeRISCVMoveMergePass(PassRegistry &);
171
172FunctionPass *createRISCVPushPopOptimizationPass();
173void initializeRISCVPushPopOptPass(PassRegistry &);
174FunctionPass *createRISCVLoadStoreOptPass();
175void initializeRISCVLoadStoreOptPass(PassRegistry &);
176
177FunctionPass *createRISCVPreAllocZilsdOptPass();
178void initializeRISCVPreAllocZilsdOptPass(PassRegistry &);
179
180class RISCVZacasABIFixPass
181 : public RequiredPassInfoMixin<RISCVZacasABIFixPass> {
182private:
183 const RISCVTargetMachine *TM;
184
185public:
186 RISCVZacasABIFixPass(const RISCVTargetMachine *TM) : TM(TM) {}
187 PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
188};
189FunctionPass *createRISCVZacasABIFixLegacyPass();
190void initializeRISCVZacasABIFixLegacyPass(PassRegistry &);
191
192InstructionSelector *
193createRISCVInstructionSelector(const RISCVTargetMachine &,
194 const RISCVSubtarget &,
195 const RISCVRegisterBankInfo &);
196void initializeRISCVDAGToDAGISelLegacyPass(PassRegistry &);
197
198FunctionPass *createRISCVPostLegalizerCombiner();
199void initializeRISCVPostLegalizerCombinerPass(PassRegistry &);
200
201FunctionPass *createRISCVO0PreLegalizerCombiner();
202void initializeRISCVO0PreLegalizerCombinerPass(PassRegistry &);
203
204FunctionPass *createRISCVPreLegalizerCombiner();
205void initializeRISCVPreLegalizerCombinerPass(PassRegistry &);
206
207ModulePass *createRISCVPromoteConstantPass();
208void initializeRISCVPromoteConstantPass(PassRegistry &);
209
210class RISCVVLOptimizerPass
211 : public OptionalPassInfoMixin<RISCVVLOptimizerPass> {
212public:
213 PreservedAnalyses run(MachineFunction &MF,
214 MachineFunctionAnalysisManager &MFAM);
215};
216
217FunctionPass *createRISCVVLOptimizerLegacyPass();
218void initializeRISCVVLOptimizerLegacyPass(PassRegistry &);
219
220FunctionPass *createRISCVVMV0EliminationPass();
221void initializeRISCVVMV0EliminationPass(PassRegistry &);
222
223FunctionPass *createRISCVQCRelaxMarkingPass();
224void initializeRISCVQCRelaxMarkingPass(PassRegistry &);
225
226void initializeRISCVAsmPrinterPass(PassRegistry &);
227} // namespace llvm
228
229#endif
230