| 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/ADT/StringMap.h" |
| 20 | #include "llvm/Analysis/LoopAnalysisManager.h" |
| 21 | #include "llvm/CodeGen/MachineFunction.h" |
| 22 | #include "llvm/CodeGen/MachineFunctionAnalysisManager.h" |
| 23 | #include "llvm/CodeGen/SelectionDAGISel.h" |
| 24 | #include "llvm/Pass.h" |
| 25 | #include "llvm/PassRegistry.h" |
| 26 | #include "llvm/Support/DataTypes.h" |
| 27 | #include "llvm/Target/TargetMachine.h" |
| 28 | #include "llvm/Transforms/Scalar/LoopPassManager.h" |
| 29 | #include <map> |
| 30 | #include <memory> |
| 31 | |
| 32 | struct AArch64O0PreLegalizerCombinerImplRuleConfig; |
| 33 | struct AArch64PreLegalizerCombinerImplRuleConfig; |
| 34 | struct AArch64PostLegalizerCombinerImplRuleConfig; |
| 35 | struct AArch64PostLegalizerLoweringImplRuleConfig; |
| 36 | |
| 37 | namespace llvm { |
| 38 | |
| 39 | class AArch64RegisterBankInfo; |
| 40 | class AArch64Subtarget; |
| 41 | class AArch64TargetMachine; |
| 42 | enum class CodeGenOptLevel; |
| 43 | class FunctionPass; |
| 44 | class InstructionSelector; |
| 45 | class ModulePass; |
| 46 | |
| 47 | FunctionPass *createAArch64DeadRegisterDefinitions(); |
| 48 | FunctionPass *createAArch64RedundantCopyEliminationPass(); |
| 49 | FunctionPass *createAArch64RedundantCondBranchPass(); |
| 50 | FunctionPass *createAArch64CondBrTuning(); |
| 51 | FunctionPass *createAArch64CompressJumpTablesPass(); |
| 52 | FunctionPass *createAArch64ConditionalCompares(); |
| 53 | FunctionPass *createAArch64AdvSIMDScalar(); |
| 54 | FunctionPass *createAArch64ISelDag(AArch64TargetMachine &TM, |
| 55 | CodeGenOptLevel OptLevel); |
| 56 | FunctionPass *createAArch64StorePairSuppressPass(); |
| 57 | FunctionPass *createAArch64ExpandPseudoLegacyPass(); |
| 58 | FunctionPass *createAArch64SLSHardeningLegacyPass(); |
| 59 | FunctionPass *createAArch64SpeculationHardeningPass(); |
| 60 | FunctionPass *createAArch64LoadStoreOptLegacyPass(); |
| 61 | ModulePass *createAArch64LowerHomogeneousPrologEpilogPass(); |
| 62 | FunctionPass *createAArch64SIMDInstrOptPass(); |
| 63 | ModulePass *createAArch64PromoteConstantPass(); |
| 64 | FunctionPass *createAArch64ConditionOptimizerLegacyPass(); |
| 65 | FunctionPass *createAArch64A57FPLoadBalancingLegacyPass(); |
| 66 | FunctionPass *createAArch64A53Fix835769LegacyPass(); |
| 67 | FunctionPass *createFalkorHWPFFixPass(); |
| 68 | FunctionPass *createFalkorMarkStridedAccessesPass(); |
| 69 | FunctionPass *createAArch64PointerAuthPass(); |
| 70 | FunctionPass *createAArch64BranchTargetsPass(); |
| 71 | FunctionPass *createAArch64CodeLayoutOptPass(); |
| 72 | FunctionPass *createAArch64MIPeepholeOptLegacyPass(); |
| 73 | FunctionPass *createAArch64PostCoalescerPass(); |
| 74 | |
| 75 | FunctionPass *createAArch64CleanupLocalDynamicTLSPass(); |
| 76 | |
| 77 | FunctionPass *createAArch64CollectLOHPass(); |
| 78 | FunctionPass *createSMEPeepholeOptPass(); |
| 79 | FunctionPass *createMachineSMEABIPass(CodeGenOptLevel); |
| 80 | FunctionPass *createAArch64SRLTDefineSuperRegsLegacyPass(); |
| 81 | ModulePass *createSVEIntrinsicOptsPass(); |
| 82 | Pass *createSVEShuffleOptsPass(); |
| 83 | InstructionSelector * |
| 84 | createAArch64InstructionSelector(const AArch64TargetMachine &, |
| 85 | const AArch64Subtarget &, |
| 86 | const AArch64RegisterBankInfo &); |
| 87 | class AArch64O0PreLegalizerCombinerPass |
| 88 | : public OptionalPassInfoMixin<AArch64O0PreLegalizerCombinerPass> { |
| 89 | std::unique_ptr<AArch64O0PreLegalizerCombinerImplRuleConfig> RuleConfig; |
| 90 | |
| 91 | public: |
| 92 | AArch64O0PreLegalizerCombinerPass(); |
| 93 | AArch64O0PreLegalizerCombinerPass(AArch64O0PreLegalizerCombinerPass &&); |
| 94 | ~AArch64O0PreLegalizerCombinerPass(); |
| 95 | |
| 96 | PreservedAnalyses run(MachineFunction &MF, |
| 97 | MachineFunctionAnalysisManager &MFAM); |
| 98 | }; |
| 99 | |
| 100 | class AArch64PreLegalizerCombinerPass |
| 101 | : public OptionalPassInfoMixin<AArch64PreLegalizerCombinerPass> { |
| 102 | std::unique_ptr<AArch64PreLegalizerCombinerImplRuleConfig> RuleConfig; |
| 103 | |
| 104 | public: |
| 105 | AArch64PreLegalizerCombinerPass(); |
| 106 | AArch64PreLegalizerCombinerPass(AArch64PreLegalizerCombinerPass &&); |
| 107 | ~AArch64PreLegalizerCombinerPass(); |
| 108 | |
| 109 | PreservedAnalyses run(MachineFunction &MF, |
| 110 | MachineFunctionAnalysisManager &MFAM); |
| 111 | }; |
| 112 | |
| 113 | class AArch64PostLegalizerCombinerPass |
| 114 | : public PassInfoMixin<AArch64PostLegalizerCombinerPass> { |
| 115 | std::unique_ptr<AArch64PostLegalizerCombinerImplRuleConfig> RuleConfig; |
| 116 | const AArch64TargetMachine *TM; |
| 117 | |
| 118 | public: |
| 119 | AArch64PostLegalizerCombinerPass(const AArch64TargetMachine *TM); |
| 120 | AArch64PostLegalizerCombinerPass(AArch64PostLegalizerCombinerPass &&); |
| 121 | ~AArch64PostLegalizerCombinerPass(); |
| 122 | |
| 123 | PreservedAnalyses run(MachineFunction &MF, |
| 124 | MachineFunctionAnalysisManager &MFAM); |
| 125 | MachineFunctionProperties getRequiredProperties() const { |
| 126 | return MachineFunctionProperties().set( |
| 127 | MachineFunctionProperties::Property::Legalized); |
| 128 | } |
| 129 | }; |
| 130 | |
| 131 | class AArch64PostSelectOptimizePass |
| 132 | : public OptionalPassInfoMixin<AArch64PostSelectOptimizePass> { |
| 133 | public: |
| 134 | PreservedAnalyses run(MachineFunction &MF, |
| 135 | MachineFunctionAnalysisManager &MFAM); |
| 136 | }; |
| 137 | |
| 138 | class AArch64PostLegalizerLoweringPass |
| 139 | : public OptionalPassInfoMixin<AArch64PostLegalizerLoweringPass> { |
| 140 | std::unique_ptr<AArch64PostLegalizerLoweringImplRuleConfig> RuleConfig; |
| 141 | |
| 142 | public: |
| 143 | AArch64PostLegalizerLoweringPass(); |
| 144 | AArch64PostLegalizerLoweringPass(AArch64PostLegalizerLoweringPass &&); |
| 145 | ~AArch64PostLegalizerLoweringPass(); |
| 146 | |
| 147 | PreservedAnalyses run(MachineFunction &MF, |
| 148 | MachineFunctionAnalysisManager &MFAM); |
| 149 | |
| 150 | MachineFunctionProperties getRequiredProperties() const { |
| 151 | return MachineFunctionProperties().set( |
| 152 | MachineFunctionProperties::Property::Legalized); |
| 153 | } |
| 154 | }; |
| 155 | |
| 156 | FunctionPass *createAArch64O0PreLegalizerCombiner(); |
| 157 | FunctionPass *createAArch64PreLegalizerCombiner(); |
| 158 | FunctionPass *createAArch64PostLegalizerCombinerLegacy(bool IsOptNone); |
| 159 | FunctionPass *createAArch64PostLegalizerLowering(); |
| 160 | FunctionPass *createAArch64PostSelectOptimize(); |
| 161 | FunctionPass *createAArch64StackTaggingPass(bool IsOptNone); |
| 162 | FunctionPass *createAArch64StackTaggingPreRALegacyPass(); |
| 163 | ModulePass *createAArch64Arm64ECCallLoweringPass(); |
| 164 | |
| 165 | void initializeAArch64A53Fix835769LegacyPass(PassRegistry &); |
| 166 | void initializeAArch64A57FPLoadBalancingLegacyPass(PassRegistry &); |
| 167 | void initializeAArch64AdvSIMDScalarLegacyPass(PassRegistry &); |
| 168 | void initializeAArch64AsmPrinterPass(PassRegistry &); |
| 169 | void initializeAArch64PointerAuthLegacyPass(PassRegistry &); |
| 170 | void initializeAArch64BranchTargetsLegacyPass(PassRegistry &); |
| 171 | void initializeAArch64CFIFixupPass(PassRegistry&); |
| 172 | void initializeAArch64CollectLOHLegacyPass(PassRegistry &); |
| 173 | void initializeAArch64CompressJumpTablesLegacyPass(PassRegistry &); |
| 174 | void initializeAArch64CondBrTuningPass(PassRegistry &); |
| 175 | void initializeAArch64ConditionOptimizerLegacyPass(PassRegistry &); |
| 176 | void initializeAArch64ConditionalComparesLegacyPass(PassRegistry &); |
| 177 | void initializeAArch64DAGToDAGISelLegacyPass(PassRegistry &); |
| 178 | void initializeAArch64DeadRegisterDefinitionsLegacyPass(PassRegistry &); |
| 179 | void initializeAArch64ExpandPseudoLegacyPass(PassRegistry &); |
| 180 | void initializeAArch64LoadStoreOptLegacyPass(PassRegistry &); |
| 181 | void initializeAArch64LowerHomogeneousPrologEpilogLegacyPass(PassRegistry &); |
| 182 | void initializeAArch64CodeLayoutOptPass(PassRegistry &); |
| 183 | void initializeAArch64MIPeepholeOptLegacyPass(PassRegistry &); |
| 184 | void initializeAArch64O0PreLegalizerCombinerLegacyPass(PassRegistry &); |
| 185 | void initializeAArch64PostCoalescerLegacyPass(PassRegistry &); |
| 186 | void initializeAArch64PostLegalizerCombinerLegacyPass(PassRegistry &); |
| 187 | void initializeAArch64PostSelectOptimizeLegacyPass(PassRegistry &); |
| 188 | void initializeAArch64PostLegalizerLoweringLegacyPass(PassRegistry &); |
| 189 | void initializeAArch64PreLegalizerCombinerLegacyPass(PassRegistry &); |
| 190 | void initializeAArch64PromoteConstantPass(PassRegistry&); |
| 191 | void initializeAArch64RedundantCopyEliminationLegacyPass(PassRegistry &); |
| 192 | void initializeAArch64RedundantCondBranchLegacyPass(PassRegistry &); |
| 193 | void initializeAArch64SIMDInstrOptLegacyPass(PassRegistry &); |
| 194 | void initializeAArch64SLSHardeningLegacyPass(PassRegistry &); |
| 195 | void initializeAArch64SpeculationHardeningPass(PassRegistry &); |
| 196 | void initializeAArch64StackTaggingPass(PassRegistry &); |
| 197 | void initializeAArch64StackTaggingPreRALegacyPass(PassRegistry &); |
| 198 | void initializeAArch64StorePairSuppressPass(PassRegistry&); |
| 199 | void initializeFalkorHWPFFixPass(PassRegistry&); |
| 200 | void initializeFalkorMarkStridedAccessesLegacyPass(PassRegistry&); |
| 201 | void initializeLDTLSCleanupPass(PassRegistry &); |
| 202 | void initializeSMEPeepholeOptPass(PassRegistry &); |
| 203 | void initializeMachineSMEABIPass(PassRegistry &); |
| 204 | void initializeAArch64SRLTDefineSuperRegsLegacyPass(PassRegistry &); |
| 205 | void initializeSVEIntrinsicOptsPass(PassRegistry &); |
| 206 | void initializeSVEShuffleOptsPass(PassRegistry &); |
| 207 | void initializeAArch64Arm64ECCallLoweringPass(PassRegistry &); |
| 208 | |
| 209 | class SVEShuffleOptsPass : public PassInfoMixin<SVEShuffleOptsPass> { |
| 210 | const AArch64TargetMachine &TM; |
| 211 | |
| 212 | public: |
| 213 | explicit SVEShuffleOptsPass(const AArch64TargetMachine &TM) : TM(TM) {} |
| 214 | LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, |
| 215 | LoopStandardAnalysisResults &AR, |
| 216 | LPMUpdater &U); |
| 217 | }; |
| 218 | |
| 219 | class AArch64StackTaggingPreRAPass |
| 220 | : public OptionalPassInfoMixin<AArch64StackTaggingPreRAPass> { |
| 221 | public: |
| 222 | PreservedAnalyses run(MachineFunction &MF, |
| 223 | MachineFunctionAnalysisManager &MFAM); |
| 224 | }; |
| 225 | |
| 226 | class AArch64A57FPLoadBalancingPass |
| 227 | : public OptionalPassInfoMixin<AArch64A57FPLoadBalancingPass> { |
| 228 | public: |
| 229 | PreservedAnalyses run(MachineFunction &MF, |
| 230 | MachineFunctionAnalysisManager &MFAM); |
| 231 | }; |
| 232 | |
| 233 | class AArch64LoadStoreOptPass |
| 234 | : public OptionalPassInfoMixin<AArch64LoadStoreOptPass> { |
| 235 | public: |
| 236 | PreservedAnalyses run(MachineFunction &MF, |
| 237 | MachineFunctionAnalysisManager &MFAM); |
| 238 | }; |
| 239 | |
| 240 | class AArch64A53Fix835769Pass |
| 241 | : public OptionalPassInfoMixin<AArch64A53Fix835769Pass> { |
| 242 | public: |
| 243 | PreservedAnalyses run(MachineFunction &MF, |
| 244 | MachineFunctionAnalysisManager &MFAM); |
| 245 | }; |
| 246 | |
| 247 | class AArch64BranchTargetsPass |
| 248 | : public OptionalPassInfoMixin<AArch64BranchTargetsPass> { |
| 249 | public: |
| 250 | PreservedAnalyses run(MachineFunction &MF, |
| 251 | MachineFunctionAnalysisManager &MFAM); |
| 252 | }; |
| 253 | |
| 254 | class AArch64RedundantCondBranchPass |
| 255 | : public OptionalPassInfoMixin<AArch64RedundantCondBranchPass> { |
| 256 | public: |
| 257 | PreservedAnalyses run(MachineFunction &MF, |
| 258 | MachineFunctionAnalysisManager &MFAM); |
| 259 | }; |
| 260 | |
| 261 | class AArch64AdvSIMDScalarPass |
| 262 | : public OptionalPassInfoMixin<AArch64AdvSIMDScalarPass> { |
| 263 | public: |
| 264 | PreservedAnalyses run(MachineFunction &MF, |
| 265 | MachineFunctionAnalysisManager &MFAM); |
| 266 | }; |
| 267 | |
| 268 | class AArch64CollectLOHPass |
| 269 | : public OptionalPassInfoMixin<AArch64CollectLOHPass> { |
| 270 | public: |
| 271 | PreservedAnalyses run(MachineFunction &MF, |
| 272 | MachineFunctionAnalysisManager &MFAM); |
| 273 | }; |
| 274 | |
| 275 | class AArch64CompressJumpTablesPass |
| 276 | : public OptionalPassInfoMixin<AArch64CompressJumpTablesPass> { |
| 277 | public: |
| 278 | PreservedAnalyses run(MachineFunction &MF, |
| 279 | MachineFunctionAnalysisManager &MFAM); |
| 280 | }; |
| 281 | |
| 282 | // SelectionDAGISelPass is already a NewPM interface. |
| 283 | class AArch64DAGToDAGISelPass : public SelectionDAGISelPass { |
| 284 | public: |
| 285 | AArch64DAGToDAGISelPass(AArch64TargetMachine &TM); |
| 286 | }; |
| 287 | |
| 288 | class AArch64DeadRegisterDefinitionsPass |
| 289 | : public OptionalPassInfoMixin<AArch64DeadRegisterDefinitionsPass> { |
| 290 | public: |
| 291 | PreservedAnalyses run(MachineFunction &MF, |
| 292 | MachineFunctionAnalysisManager &MFAM); |
| 293 | }; |
| 294 | |
| 295 | class AArch64ExpandPseudoPass |
| 296 | : public OptionalPassInfoMixin<AArch64ExpandPseudoPass> { |
| 297 | public: |
| 298 | PreservedAnalyses run(MachineFunction &MF, |
| 299 | MachineFunctionAnalysisManager &MFAM); |
| 300 | }; |
| 301 | |
| 302 | class AArch64MIPeepholeOptPass |
| 303 | : public OptionalPassInfoMixin<AArch64MIPeepholeOptPass> { |
| 304 | public: |
| 305 | PreservedAnalyses run(MachineFunction &MF, |
| 306 | MachineFunctionAnalysisManager &MFAM); |
| 307 | }; |
| 308 | |
| 309 | class AArch64ConditionOptimizerPass |
| 310 | : public OptionalPassInfoMixin<AArch64ConditionOptimizerPass> { |
| 311 | public: |
| 312 | PreservedAnalyses run(MachineFunction &MF, |
| 313 | MachineFunctionAnalysisManager &MFAM); |
| 314 | }; |
| 315 | |
| 316 | class AArch64SIMDInstrOptPass |
| 317 | : public OptionalPassInfoMixin<AArch64SIMDInstrOptPass> { |
| 318 | std::map<std::pair<unsigned, std::string>, bool> SIMDInstrTable; |
| 319 | StringMap<bool> InterlEarlyExit; |
| 320 | |
| 321 | public: |
| 322 | PreservedAnalyses run(MachineFunction &MF, |
| 323 | MachineFunctionAnalysisManager &MFAM); |
| 324 | }; |
| 325 | |
| 326 | class AArch64PointerAuthPass |
| 327 | : public OptionalPassInfoMixin<AArch64PointerAuthPass> { |
| 328 | public: |
| 329 | PreservedAnalyses run(MachineFunction &MF, |
| 330 | MachineFunctionAnalysisManager &MFAM); |
| 331 | }; |
| 332 | |
| 333 | class AArch64SLSHardeningPass : public PassInfoMixin<AArch64SLSHardeningPass> { |
| 334 | public: |
| 335 | PreservedAnalyses run(MachineFunction &MF, |
| 336 | MachineFunctionAnalysisManager &MFAM); |
| 337 | }; |
| 338 | |
| 339 | class AArch64PostCoalescerPass |
| 340 | : public OptionalPassInfoMixin<AArch64PostCoalescerPass> { |
| 341 | public: |
| 342 | PreservedAnalyses run(MachineFunction &MF, |
| 343 | MachineFunctionAnalysisManager &MFAM); |
| 344 | }; |
| 345 | |
| 346 | class AArch64RedundantCopyEliminationPass |
| 347 | : public OptionalPassInfoMixin<AArch64RedundantCopyEliminationPass> { |
| 348 | public: |
| 349 | PreservedAnalyses run(MachineFunction &MF, |
| 350 | MachineFunctionAnalysisManager &MFAM); |
| 351 | }; |
| 352 | |
| 353 | class AArch64ConditionalComparesPass |
| 354 | : public OptionalPassInfoMixin<AArch64ConditionalComparesPass> { |
| 355 | public: |
| 356 | PreservedAnalyses run(MachineFunction &MF, |
| 357 | MachineFunctionAnalysisManager &MFAM); |
| 358 | }; |
| 359 | |
| 360 | class AArch64SRLTDefineSuperRegsPass |
| 361 | : public OptionalPassInfoMixin<AArch64SRLTDefineSuperRegsPass> { |
| 362 | public: |
| 363 | PreservedAnalyses run(MachineFunction &MF, |
| 364 | MachineFunctionAnalysisManager &MFAM); |
| 365 | }; |
| 366 | |
| 367 | class AArch64LowerHomogeneousPrologEpilogPass |
| 368 | : public PassInfoMixin<AArch64LowerHomogeneousPrologEpilogPass> { |
| 369 | public: |
| 370 | PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); |
| 371 | }; |
| 372 | |
| 373 | } // end namespace llvm |
| 374 | |
| 375 | #endif |
| 376 | |