1//==-- AArch64.h - Top-level interface for AArch64 --------------*- 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// AArch64 back-end.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64_H
15#define LLVM_LIB_TARGET_AARCH64_AARCH64_H
16
17#include "MCTargetDesc/AArch64MCTargetDesc.h"
18#include "Utils/AArch64BaseInfo.h"
19#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
20#include "llvm/Pass.h"
21#include "llvm/PassRegistry.h"
22#include "llvm/Support/DataTypes.h"
23#include "llvm/Target/TargetMachine.h"
24#include <memory>
25
26struct AArch64O0PreLegalizerCombinerImplRuleConfig;
27
28namespace llvm {
29
30class AArch64RegisterBankInfo;
31class AArch64Subtarget;
32class AArch64TargetMachine;
33enum class CodeGenOptLevel;
34class FunctionPass;
35class InstructionSelector;
36class ModulePass;
37
38FunctionPass *createAArch64DeadRegisterDefinitions();
39FunctionPass *createAArch64RedundantCopyEliminationPass();
40FunctionPass *createAArch64RedundantCondBranchPass();
41FunctionPass *createAArch64CondBrTuning();
42FunctionPass *createAArch64CompressJumpTablesPass();
43FunctionPass *createAArch64ConditionalCompares();
44FunctionPass *createAArch64AdvSIMDScalar();
45FunctionPass *createAArch64ISelDag(AArch64TargetMachine &TM,
46 CodeGenOptLevel OptLevel);
47FunctionPass *createAArch64StorePairSuppressPass();
48FunctionPass *createAArch64ExpandPseudoLegacyPass();
49FunctionPass *createAArch64SLSHardeningPass();
50FunctionPass *createAArch64SpeculationHardeningPass();
51FunctionPass *createAArch64LoadStoreOptLegacyPass();
52ModulePass *createAArch64LowerHomogeneousPrologEpilogPass();
53FunctionPass *createAArch64SIMDInstrOptPass();
54ModulePass *createAArch64PromoteConstantPass();
55FunctionPass *createAArch64ConditionOptimizerLegacyPass();
56FunctionPass *createAArch64A57FPLoadBalancing();
57FunctionPass *createAArch64A53Fix835769LegacyPass();
58FunctionPass *createFalkorHWPFFixPass();
59FunctionPass *createFalkorMarkStridedAccessesPass();
60FunctionPass *createAArch64PointerAuthPass();
61FunctionPass *createAArch64BranchTargetsPass();
62FunctionPass *createAArch64MIPeepholeOptLegacyPass();
63FunctionPass *createAArch64PostCoalescerPass();
64
65FunctionPass *createAArch64CleanupLocalDynamicTLSPass();
66
67FunctionPass *createAArch64CollectLOHPass();
68FunctionPass *createSMEABIPass();
69FunctionPass *createSMEPeepholeOptPass();
70FunctionPass *createMachineSMEABIPass(CodeGenOptLevel);
71FunctionPass *createAArch64SRLTDefineSuperRegsPass();
72ModulePass *createSVEIntrinsicOptsPass();
73InstructionSelector *
74createAArch64InstructionSelector(const AArch64TargetMachine &,
75 const AArch64Subtarget &,
76 const AArch64RegisterBankInfo &);
77class AArch64O0PreLegalizerCombinerPass
78 : public PassInfoMixin<AArch64O0PreLegalizerCombinerPass> {
79 std::unique_ptr<AArch64O0PreLegalizerCombinerImplRuleConfig> RuleConfig;
80
81public:
82 AArch64O0PreLegalizerCombinerPass();
83 AArch64O0PreLegalizerCombinerPass(AArch64O0PreLegalizerCombinerPass &&);
84 ~AArch64O0PreLegalizerCombinerPass();
85
86 PreservedAnalyses run(MachineFunction &MF,
87 MachineFunctionAnalysisManager &MFAM);
88};
89
90FunctionPass *createAArch64O0PreLegalizerCombiner();
91FunctionPass *createAArch64PreLegalizerCombiner();
92FunctionPass *createAArch64PostLegalizerCombiner(bool IsOptNone);
93FunctionPass *createAArch64PostLegalizerLowering();
94FunctionPass *createAArch64PostSelectOptimize();
95FunctionPass *createAArch64StackTaggingPass(bool IsOptNone);
96FunctionPass *createAArch64StackTaggingPreRAPass();
97ModulePass *createAArch64Arm64ECCallLoweringPass();
98
99void initializeAArch64A53Fix835769LegacyPass(PassRegistry &);
100void initializeAArch64A57FPLoadBalancingPass(PassRegistry&);
101void initializeAArch64AdvSIMDScalarLegacyPass(PassRegistry &);
102void initializeAArch64AsmPrinterPass(PassRegistry &);
103void initializeAArch64PointerAuthLegacyPass(PassRegistry &);
104void initializeAArch64BranchTargetsLegacyPass(PassRegistry &);
105void initializeAArch64CFIFixupPass(PassRegistry&);
106void initializeAArch64CollectLOHLegacyPass(PassRegistry &);
107void initializeAArch64CompressJumpTablesLegacyPass(PassRegistry &);
108void initializeAArch64CondBrTuningPass(PassRegistry &);
109void initializeAArch64ConditionOptimizerLegacyPass(PassRegistry &);
110void initializeAArch64ConditionalComparesPass(PassRegistry &);
111void initializeAArch64DAGToDAGISelLegacyPass(PassRegistry &);
112void initializeAArch64DeadRegisterDefinitionsLegacyPass(PassRegistry &);
113void initializeAArch64ExpandPseudoLegacyPass(PassRegistry &);
114void initializeAArch64LoadStoreOptLegacyPass(PassRegistry &);
115void initializeAArch64LowerHomogeneousPrologEpilogPass(PassRegistry &);
116void initializeAArch64MIPeepholeOptLegacyPass(PassRegistry &);
117void initializeAArch64O0PreLegalizerCombinerLegacyPass(PassRegistry &);
118void initializeAArch64PostCoalescerLegacyPass(PassRegistry &);
119void initializeAArch64PostLegalizerCombinerPass(PassRegistry &);
120void initializeAArch64PostLegalizerLoweringPass(PassRegistry &);
121void initializeAArch64PostSelectOptimizePass(PassRegistry &);
122void initializeAArch64PreLegalizerCombinerPass(PassRegistry &);
123void initializeAArch64PromoteConstantPass(PassRegistry&);
124void initializeAArch64RedundantCopyEliminationPass(PassRegistry&);
125void initializeAArch64RedundantCondBranchPass(PassRegistry &);
126void initializeAArch64SIMDInstrOptPass(PassRegistry &);
127void initializeAArch64SLSHardeningPass(PassRegistry &);
128void initializeAArch64SpeculationHardeningPass(PassRegistry &);
129void initializeAArch64StackTaggingPass(PassRegistry &);
130void initializeAArch64StackTaggingPreRAPass(PassRegistry &);
131void initializeAArch64StorePairSuppressPass(PassRegistry&);
132void initializeFalkorHWPFFixPass(PassRegistry&);
133void initializeFalkorMarkStridedAccessesLegacyPass(PassRegistry&);
134void initializeLDTLSCleanupPass(PassRegistry&);
135void initializeSMEABIPass(PassRegistry &);
136void initializeSMEPeepholeOptPass(PassRegistry &);
137void initializeMachineSMEABIPass(PassRegistry &);
138void initializeAArch64SRLTDefineSuperRegsPass(PassRegistry &);
139void initializeSVEIntrinsicOptsPass(PassRegistry &);
140void initializeAArch64Arm64ECCallLoweringPass(PassRegistry &);
141
142class AArch64LoadStoreOptPass : public PassInfoMixin<AArch64LoadStoreOptPass> {
143public:
144 PreservedAnalyses run(MachineFunction &MF,
145 MachineFunctionAnalysisManager &MFAM);
146};
147
148class AArch64A53Fix835769Pass : public PassInfoMixin<AArch64A53Fix835769Pass> {
149public:
150 PreservedAnalyses run(MachineFunction &MF,
151 MachineFunctionAnalysisManager &MFAM);
152};
153
154class AArch64BranchTargetsPass
155 : public PassInfoMixin<AArch64BranchTargetsPass> {
156public:
157 PreservedAnalyses run(MachineFunction &MF,
158 MachineFunctionAnalysisManager &MFAM);
159};
160
161class AArch64AdvSIMDScalarPass
162 : public PassInfoMixin<AArch64AdvSIMDScalarPass> {
163public:
164 PreservedAnalyses run(MachineFunction &MF,
165 MachineFunctionAnalysisManager &MFAM);
166};
167
168class AArch64CollectLOHPass : public PassInfoMixin<AArch64CollectLOHPass> {
169public:
170 PreservedAnalyses run(MachineFunction &MF,
171 MachineFunctionAnalysisManager &MFAM);
172};
173
174class AArch64CompressJumpTablesPass
175 : public PassInfoMixin<AArch64CompressJumpTablesPass> {
176public:
177 PreservedAnalyses run(MachineFunction &MF,
178 MachineFunctionAnalysisManager &MFAM);
179};
180
181class AArch64DeadRegisterDefinitionsPass
182 : public PassInfoMixin<AArch64DeadRegisterDefinitionsPass> {
183public:
184 PreservedAnalyses run(MachineFunction &MF,
185 MachineFunctionAnalysisManager &MFAM);
186};
187
188class AArch64ExpandPseudoPass : public PassInfoMixin<AArch64ExpandPseudoPass> {
189public:
190 PreservedAnalyses run(MachineFunction &MF,
191 MachineFunctionAnalysisManager &MFAM);
192};
193
194class AArch64MIPeepholeOptPass
195 : public PassInfoMixin<AArch64MIPeepholeOptPass> {
196public:
197 PreservedAnalyses run(MachineFunction &MF,
198 MachineFunctionAnalysisManager &MFAM);
199};
200
201class AArch64ConditionOptimizerPass
202 : public PassInfoMixin<AArch64ConditionOptimizerPass> {
203public:
204 PreservedAnalyses run(MachineFunction &MF,
205 MachineFunctionAnalysisManager &MFAM);
206};
207
208class AArch64PointerAuthPass : public PassInfoMixin<AArch64PointerAuthPass> {
209public:
210 PreservedAnalyses run(MachineFunction &MF,
211 MachineFunctionAnalysisManager &MFAM);
212};
213
214class AArch64PostCoalescerPass
215 : public PassInfoMixin<AArch64PostCoalescerPass> {
216public:
217 PreservedAnalyses run(MachineFunction &MF,
218 MachineFunctionAnalysisManager &MFAM);
219};
220
221} // end namespace llvm
222
223#endif
224