LLVM 24.0.0git
AArch64TargetMachine.cpp
Go to the documentation of this file.
1//===-- AArch64TargetMachine.cpp - Define TargetMachine for AArch64 -------===//
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//
10//===----------------------------------------------------------------------===//
11
13#include "AArch64.h"
14#include "AArch64AsmPrinter.h"
17#include "AArch64MacroFusion.h"
18#include "AArch64Subtarget.h"
36#include "llvm/CodeGen/Passes.h"
39#include "llvm/IR/Attributes.h"
40#include "llvm/IR/Function.h"
42#include "llvm/MC/MCAsmInfo.h"
46#include "llvm/Pass.h"
58#include <memory>
59
60using namespace llvm;
61
64 // Register the target.
117}
118
120 const bool GlobalISelFlag = getCGPassBuilderOption().EnableGlobalISelOption ==
122
124 (static_cast<unsigned>(getOptLevel()) >
125 static_cast<unsigned>(CLOpts.enable_global_isel_at_O) &&
126 !GlobalISelFlag);
127}
128
130 SubtargetMap.clear();
131 LastSubtarget = nullptr;
132}
133
134//===----------------------------------------------------------------------===//
135// AArch64 Lowering public interface.
136//===----------------------------------------------------------------------===//
137static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
138 if (TT.isOSBinFormatMachO())
139 return std::make_unique<AArch64_MachoTargetObjectFile>();
140 if (TT.isOSBinFormatCOFF())
141 return std::make_unique<AArch64_COFFTargetObjectFile>();
142
143 return std::make_unique<AArch64_ELFTargetObjectFile>();
144}
145
147 if (CPU.empty() && TT.isArm64e())
148 return "apple-a12";
149 return CPU;
150}
151
153 std::optional<Reloc::Model> RM) {
154 // AArch64 Darwin and Windows are always PIC.
155 if (TT.isOSDarwin() || TT.isOSWindows())
156 return Reloc::PIC_;
157 // On ELF platforms the default static relocation model has a smart enough
158 // linker to cope with referencing external symbols defined in a shared
159 // library. Hence DynamicNoPIC doesn't need to be promoted to PIC.
160 if (!RM || *RM == Reloc::DynamicNoPIC)
161 return Reloc::Static;
162 return *RM;
163}
164
165static CodeModel::Model
167 std::optional<CodeModel::Model> CM, bool JIT) {
168 if (CM) {
169 if (*CM != CodeModel::Small && *CM != CodeModel::Tiny &&
170 *CM != CodeModel::Large) {
172 "Only small, tiny and large code models are allowed on AArch64");
173 } else if (*CM == CodeModel::Tiny && !TT.isOSBinFormatELF()) {
174 report_fatal_error("tiny code model is only supported on ELF");
175 }
176 return *CM;
177 }
178 // The default MCJIT memory managers make no guarantees about where they can
179 // find an executable page; JITed code needs to be able to refer to globals
180 // no matter how far away they are.
181 // We should set the CodeModel::Small for Windows ARM64 in JIT mode,
182 // since with large code model LLVM generating 4 MOV instructions, and
183 // Windows doesn't support relocating these long branch (4 MOVs).
184 if (JIT && !TT.isOSWindows())
185 return CodeModel::Large;
186 return CodeModel::Small;
187}
188
189/// Create an AArch64 architecture model.
190///
192 StringRef CPU, StringRef FS,
193 const TargetOptions &Options,
194 std::optional<Reloc::Model> RM,
195 std::optional<CodeModel::Model> CM,
196 CodeGenOptLevel OL, bool JIT,
197 bool LittleEndian)
200 getEffectiveAArch64CodeModel(TT, CM, JIT), OL),
201 CLOpts(AArch64Options::Global), TLOF(createTLOF(getTargetTriple())),
202 isLittle(LittleEndian) {
203 initAsmInfo();
204
205 if (TT.isOSBinFormatMachO()) {
206 this->Options.TrapUnreachable = true;
207 this->Options.NoTrapAfterNoreturn = true;
208 }
209
210 if (getMCAsmInfo().getExceptionHandlingType() == ExceptionHandling::WinEH &&
211 getMCAsmInfo().usesWindowsCFI()) {
212 // Unwinding can get confused if the last instruction in an
213 // exception-handling region (function, funclet, try block, etc.)
214 // is a call.
215 //
216 // FIXME: We could elide the trap if the next instruction would be in
217 // the same region anyway.
218 this->Options.TrapUnreachable = true;
219 }
220
221 if (this->Options.TLSSize == 0) // default
222 this->Options.TLSSize = 24;
223 if ((getCodeModel() == CodeModel::Small ||
225 this->Options.TLSSize > 32)
226 // for the small (and kernel) code model, the maximum TLS size is 4GiB
227 this->Options.TLSSize = 32;
228 else if (getCodeModel() == CodeModel::Tiny && this->Options.TLSSize > 24)
229 // for the tiny code model, the maximum TLS size is 1MiB (< 16MiB)
230 this->Options.TLSSize = 24;
231
232 const bool TargetSupportsGISel =
233 TT.getArch() != Triple::aarch64_32 &&
234 TT.getEnvironment() != Triple::GNUILP32 &&
235 !(getCodeModel() == CodeModel::Large && TT.isOSBinFormatMachO());
236
237 const bool GlobalISelFlag = getCGPassBuilderOption().EnableGlobalISelOption ==
239
240 // Enable GlobalISel at or below EnableGlobalISelAt0, unless this is
241 // MachO/CodeModel::Large, which GlobalISel does not support.
242 if (TargetSupportsGISel && CLOpts.enable_global_isel_at_O != -1 &&
243 (static_cast<int>(getOptLevel()) <= CLOpts.enable_global_isel_at_O ||
244 (!GlobalISelFlag && !Options.EnableGlobalISel))) {
245 setGlobalISel(true);
247 }
248
250
251 // AArch64 supports the MachineOutliner.
252 setMachineOutliner(true);
253
254 // AArch64 supports default outlining behaviour.
256
257 // AArch64 supports the debug entry values.
259
260 // AArch64 supports fixing up the DWARF unwind information.
261 // enableCFIFixup() checks per function for DWARF unwinding.
262 setCFIFixup(true);
263}
264
266 return CLOpts.enable_global_isel_at_O;
267}
268
270
271const AArch64Subtarget *
273 // Constructing the subtarget key is not cheap, avoid rebuilding it for
274 // repeated queries with the same function attributes.
275 AttributeSet FnAttrs = F.getAttributes().getFnAttrs();
276 if (LastSubtarget && LastSubtargetAttrs == FnAttrs)
277 return LastSubtarget;
278
279 Attribute CPUAttr = F.getFnAttribute("target-cpu");
280 Attribute TuneAttr = F.getFnAttribute("tune-cpu");
281 Attribute FSAttr = F.getFnAttribute("target-features");
282
283 StringRef CPU = CPUAttr.isValid() ? CPUAttr.getValueAsString() : TargetCPU;
284 StringRef TuneCPU = TuneAttr.isValid() ? TuneAttr.getValueAsString() : CPU;
285 StringRef FS = FSAttr.isValid() ? FSAttr.getValueAsString() : TargetFS;
286 bool HasMinSize = F.hasMinSize();
287
288 bool IsStreaming = CLOpts.force_streaming ||
289 F.hasFnAttribute("aarch64_pstate_sm_enabled") ||
290 F.hasFnAttribute("aarch64_pstate_sm_body");
291 bool IsStreamingCompatible = CLOpts.force_streaming_compatible ||
292 F.hasFnAttribute("aarch64_pstate_sm_compatible");
293
294 unsigned MinSVEVectorSize = 0;
295 unsigned MaxSVEVectorSize = 0;
296 if (F.hasFnAttribute(Attribute::VScaleRange)) {
297 ConstantRange CR = getVScaleRange(&F, 64);
298 MinSVEVectorSize = CR.getUnsignedMin().getZExtValue() * 128;
299 MaxSVEVectorSize = CR.getUnsignedMax().getZExtValue() * 128;
300 } else {
301 MinSVEVectorSize = CLOpts.sve_vector_bits_min;
302 MaxSVEVectorSize = CLOpts.sve_vector_bits_max;
303 }
304
305 assert(MinSVEVectorSize % 128 == 0 &&
306 "SVE requires vector length in multiples of 128!");
307 assert(MaxSVEVectorSize % 128 == 0 &&
308 "SVE requires vector length in multiples of 128!");
309 assert((MaxSVEVectorSize >= MinSVEVectorSize || MaxSVEVectorSize == 0) &&
310 "Minimum SVE vector size should not be larger than its maximum!");
311
312 // Sanitize user input in case of no asserts
313 if (MaxSVEVectorSize != 0) {
314 MinSVEVectorSize = std::min(MinSVEVectorSize, MaxSVEVectorSize);
315 MaxSVEVectorSize = std::max(MinSVEVectorSize, MaxSVEVectorSize);
316 }
317
319 // This lookup is hot during repeated TTI queries, so build the key directly
320 // instead of formatting through raw_svector_ostream.
321 Key += "SVEMin";
322 Key += utostr(MinSVEVectorSize);
323 Key += "SVEMax";
324 Key += utostr(MaxSVEVectorSize);
325 Key += "IsStreaming=";
326 Key += utostr(IsStreaming);
327 Key += "IsStreamingCompatible=";
328 Key += utostr(IsStreamingCompatible);
329 Key += CPU;
330 Key += TuneCPU;
331 Key += FS;
332 Key += "HasMinSize=";
333 Key += utostr(HasMinSize);
334
335 auto &I = SubtargetMap[Key];
336 if (!I) {
337 I = std::make_unique<AArch64Subtarget>(
338 TargetTriple, CPU, TuneCPU, FS, *this, isLittle, MinSVEVectorSize,
339 MaxSVEVectorSize, IsStreaming, IsStreamingCompatible, HasMinSize,
340 CLOpts.srlt_mitigate_sr2r);
341 }
342
343 if (IsStreaming && !I->hasSME())
344 reportFatalUsageError("streaming SVE functions require SME");
345
346 LastSubtargetAttrs = FnAttrs;
347 LastSubtarget = I.get();
348 return LastSubtarget;
349}
350
351// Encourage placing FORM_TRANSPOSED_REG immediately before the instruction that
352// uses/consumes it. This ensures its def has a short live range, which means
353// we're more likely to allocate registers its operands first (which works best
354// for the hints in AArch64RegisterInfo::getRegAllocationHints).
356 const TargetInstrInfo &TII, const TargetSubtargetInfo &TSI,
357 const MachineInstr *FirstMI, const MachineInstr &SecondMI,
358 const SDep *Dep) {
359 if (isNonDataDep(Dep))
360 return false;
361 return !FirstMI ||
362 FirstMI->getOpcode() == AArch64::FORM_TRANSPOSED_REG_TUPLE_X2_PSEUDO ||
363 FirstMI->getOpcode() == AArch64::FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO;
364}
365
368 const AArch64Subtarget &ST = C->MF->getSubtarget<AArch64Subtarget>();
370 DAG->addMutation(createLoadClusterDAGMutation(DAG->TII));
371 DAG->addMutation(createStoreClusterDAGMutation(DAG->TII));
372 if (ST.hasFusion())
373 DAG->addMutation(createAArch64MacroFusionDAGMutation());
374 if (ST.hasSME() && ST.isStreaming())
375 DAG->addMutation(createMacroFusionDAGMutation(
377 return DAG;
378}
379
382 const AArch64Subtarget &ST = C->MF->getSubtarget<AArch64Subtarget>();
384 if (ST.hasFusion()) {
385 // Run the Macro Fusion after RA again since literals are expanded from
386 // pseudos then (v. addPreSched2()).
387 DAG->addMutation(createAArch64MacroFusionDAGMutation());
388 return DAG;
389 }
390
391 return DAG;
392}
393
395 const SmallPtrSetImpl<MachineInstr *> &MIs) const {
396 if (MIs.empty())
397 return 0;
398 auto *MI = *MIs.begin();
399 auto *FuncInfo = MI->getMF()->getInfo<AArch64FunctionInfo>();
400 return FuncInfo->clearLinkerOptimizationHints(MIs);
401}
402
403void AArch64leTargetMachine::anchor() { }
404
406 const Target &T, const Triple &TT, StringRef CPU, StringRef FS,
407 const TargetOptions &Options, std::optional<Reloc::Model> RM,
408 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, bool JIT)
409 : AArch64TargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, JIT, true) {}
410
411void AArch64beTargetMachine::anchor() { }
412
414 const Target &T, const Triple &TT, StringRef CPU, StringRef FS,
415 const TargetOptions &Options, std::optional<Reloc::Model> RM,
416 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, bool JIT)
417 : AArch64TargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, JIT, false) {}
418
419namespace {
420
421/// AArch64 Code Generator Pass Configuration Options.
422class AArch64PassConfig : public TargetPassConfig {
423 const AArch64Options &CLOpts;
424
425public:
426 AArch64PassConfig(AArch64TargetMachine &TM, PassManagerBase &PM)
427 : TargetPassConfig(TM, PM), CLOpts(TM.getCLOpts()) {
429 substitutePass(&PostRASchedulerID, &PostMachineSchedulerID);
430 setEnableSinkAndFold(CLOpts.enable_sink_fold);
431 }
432
433 AArch64TargetMachine &getAArch64TargetMachine() const {
435 }
436
437 void addIRPasses() override;
438 bool addPreISel() override;
439 void addCodeGenPrepare() override;
440 bool addInstSelector() override;
441 bool addIRTranslator() override;
442 void addPreLegalizeMachineIR() override;
443 bool addLegalizeMachineIR() override;
444 void addPreRegBankSelect() override;
445 bool addRegBankSelect() override;
446 bool addGlobalInstructionSelect() override;
447 void addMachineSSAOptimization() override;
448 bool addILPOpts() override;
449 void addPreRegAlloc() override;
450 void addPostRewrite() override;
451 void addPostRegAlloc() override;
452 void addPreSched2() override;
453 void addPreEmitPass() override;
454 void addPostBBSections() override;
455 void addPreEmitPass2() override;
456 bool addRegAssignAndRewriteOptimized() override;
457
458 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
459};
460
461} // end anonymous namespace
462
464#define GET_PASS_REGISTRY "AArch64PassRegistry.def"
466
467 PB.registerLateLoopOptimizationsEPCallback(
468 [=](LoopPassManager &LPM, OptimizationLevel Level) {
469 if (Level != OptimizationLevel::O0)
470 LPM.addPass(LoopIdiomVectorizePass());
471 });
472 if (getTargetTriple().isOSWindows())
473 PB.registerPipelineEarlySimplificationEPCallback(
476 });
477}
478
481 return TargetTransformInfo(std::make_unique<AArch64TTIImpl>(this, F));
482}
483
485 return new AArch64PassConfig(*this, PM);
486}
487
488std::unique_ptr<CSEConfigBase> AArch64PassConfig::getCSEConfig() const {
489 return getStandardCSEConfigForOpt(TM->getOptLevel());
490}
491
492void AArch64PassConfig::addIRPasses() {
493 // Always expand atomic operations, we don't deal with atomicrmw or cmpxchg
494 // ourselves.
496
497 if (getOptLevel() >= CodeGenOptLevel::Default &&
498 CLOpts.enable_predicate_as_counter_loop_rewrites)
500
501 // Cmpxchg instructions are often used with a subsequent comparison to
502 // determine whether it succeeded. We can exploit existing control-flow in
503 // ldrex/strex loops to simplify this, but it needs tidying up.
504 if (TM->getOptLevel() != CodeGenOptLevel::None &&
505 CLOpts.enable_atomic_cfg_tidy)
507 .forwardSwitchCondToPhi(true)
508 .convertSwitchRangeToICmp(true)
509 .convertSwitchToLookupTable(true)
510 .needCanonicalLoops(false)
511 .hoistCommonInsts(true)
512 .sinkCommonInsts(true)));
513
514 // Run LoopDataPrefetch
515 //
516 // Run this before LSR to remove the multiplies involved in computing the
517 // pointer values N iterations ahead.
518 if (TM->getOptLevel() != CodeGenOptLevel::None) {
519 if (CLOpts.enable_loop_data_prefetch)
521 if (CLOpts.enable_falkor_hwpf_fix)
523 }
524
525 if (CLOpts.enable_gep_opt) {
526 // Call SeparateConstOffsetFromGEP pass to extract constants within indices
527 // and lower a GEP with multiple indices to either arithmetic operations or
528 // multiple GEPs with single index.
530 // Call EarlyCSE pass to find and remove subexpressions in the lowered
531 // result.
532 addPass(createEarlyCSEPass());
533 // Do loop invariant code motion in case part of the lowered result is
534 // invariant.
535 addPass(createLICMPass());
536 }
537
539
540 if (getOptLevel() == CodeGenOptLevel::Aggressive && CLOpts.select_opt)
541 addPass(createSelectOptimizePass());
542
544 /*IsOptNone=*/TM->getOptLevel() == CodeGenOptLevel::None));
545
546 // Try to use tbl in place of other shuffling operations if doing so would
547 // reduce the total number of instructions. Shuffle masks for big endian may
548 // be different, so require a little endian target.
549 if (getOptLevel() >= CodeGenOptLevel::Default &&
550 CLOpts.enable_sve_shuffle_opts && TM->getTargetTriple().isLittleEndian())
551 addPass(createSVEShuffleOptsPass());
552
553 // Match complex arithmetic patterns
554 if (TM->getOptLevel() >= CodeGenOptLevel::Default)
556
557 // Match interleaved memory accesses to ldN/stN intrinsics.
558 if (TM->getOptLevel() != CodeGenOptLevel::None) {
561 }
562
563 // Add Control Flow Guard checks.
564 if (TM->getTargetTriple().isOSWindows()) {
565 if (TM->getTargetTriple().isWindowsArm64EC())
567 else
568 addPass(createCFGuardPass());
569 }
570
571 if (TM->Options.JMCInstrument)
572 addPass(createJMCInstrumenterPass());
573}
574
575// Pass Pipeline Configuration
576bool AArch64PassConfig::addPreISel() {
577 // Run promote constant before global merge, so that the promoted constants
578 // get a chance to be merged
579 if (TM->getOptLevel() != CodeGenOptLevel::None && CLOpts.enable_promote_const)
581 // FIXME: On AArch64, this depends on the type.
582 // Basically, the addressable offsets are up to 4095 * Ty.getSizeInBytes().
583 // and the offset has to be a multiple of the related size in bytes.
584 if (valueOr(CLOpts.enable_global_merge,
585 TM->getOptLevel() != CodeGenOptLevel::None)) {
586 bool OnlyOptimizeForSize =
587 (TM->getOptLevel() < CodeGenOptLevel::Aggressive) &&
588 (CLOpts.enable_global_merge == BoolOrDefault::Default);
589
590 // Merging of extern globals is enabled by default on non-Mach-O as we
591 // expect it to be generally either beneficial or harmless. On Mach-O it
592 // is disabled as we emit the .subsections_via_symbols directive which
593 // means that merging extern globals is not safe.
594 bool MergeExternalByDefault = !TM->getTargetTriple().isOSBinFormatMachO();
595 addPass(createGlobalMergePass(TM, 4095, OnlyOptimizeForSize,
596 MergeExternalByDefault));
597 }
598
599 return false;
600}
601
602void AArch64PassConfig::addCodeGenPrepare() {
603 if (getOptLevel() != CodeGenOptLevel::None)
606}
607
608bool AArch64PassConfig::addInstSelector() {
609 addPass(createAArch64ISelDag(getAArch64TargetMachine(), getOptLevel()));
610 return false;
611}
612
613bool AArch64PassConfig::addIRTranslator() {
614 addPass(new IRTranslatorLegacy(getOptLevel()));
615 return false;
616}
617
618void AArch64PassConfig::addPreLegalizeMachineIR() {
619 if (getAArch64TargetMachine().isGlobalISelOptNone()) {
621 addPass(new LocalizerLegacy());
622 } else {
624 addPass(new LocalizerLegacy());
625 if (CLOpts.enable_gisel_ldst_prelegal)
626 addPass(new LoadStoreOptLegacy());
627 }
628}
629
630bool AArch64PassConfig::addLegalizeMachineIR() {
631 addPass(new LegalizerLegacy());
632 return false;
633}
634
635void AArch64PassConfig::addPreRegBankSelect() {
636 const bool IsGlobalISelOptNone =
637 getAArch64TargetMachine().isGlobalISelOptNone();
638 if (!IsGlobalISelOptNone) {
639 addPass(createAArch64PostLegalizerCombinerLegacy(IsGlobalISelOptNone));
640 if (CLOpts.enable_gisel_ldst_postlegal)
641 addPass(new LoadStoreOptLegacy());
642 }
644}
645
646bool AArch64PassConfig::addRegBankSelect() {
647 addPass(new RegBankSelectLegacy());
648 return false;
649}
650
651bool AArch64PassConfig::addGlobalInstructionSelect() {
652 addPass(new InstructionSelectLegacy(getOptLevel()));
653 if (!getAArch64TargetMachine().isGlobalISelOptNone())
655
656 return false;
657}
658
659void AArch64PassConfig::addMachineSSAOptimization() {
660 // For ELF, cleanup any local-dynamic TLS accesses
661 // (i.e. combine as many references to _TLS_MODULE_BASE_ as possible.
662 if (TM->getTargetTriple().isOSBinFormatELF() &&
663 getOptLevel() != CodeGenOptLevel::None)
665
666 if (TM->getOptLevel() != CodeGenOptLevel::None)
667 addPass(createMachineSMEABIPass(TM->getOptLevel()));
668
669 if (TM->getOptLevel() != CodeGenOptLevel::None &&
670 CLOpts.enable_aarch64_sme_peephole_opt)
671 addPass(createSMEPeepholeOptPass());
672
673 // Run default MachineSSAOptimization first.
675
676 if (TM->getOptLevel() != CodeGenOptLevel::None) {
679 }
680}
681
682bool AArch64PassConfig::addILPOpts() {
683 if (CLOpts.enable_condopt)
685 if (CLOpts.enable_ccmp)
687 if (CLOpts.enable_mcr)
688 addPass(&MachineCombinerID);
689 if (CLOpts.enable_cond_br_tune)
690 addPass(createAArch64CondBrTuning());
691 if (CLOpts.enable_early_ifcvt)
692 addPass(&EarlyIfConverterLegacyID);
693 if (CLOpts.enable_stp_suppress)
696 if (TM->getOptLevel() != CodeGenOptLevel::None)
698 return true;
699}
700
701void AArch64PassConfig::addPreRegAlloc() {
702 if (TM->getOptLevel() == CodeGenOptLevel::None)
704
705 // Change dead register definitions to refer to the zero register.
706 if (TM->getOptLevel() != CodeGenOptLevel::None && CLOpts.enable_dead_defs)
708
709 // Use AdvSIMD scalar instructions whenever profitable.
710 if (TM->getOptLevel() != CodeGenOptLevel::None && CLOpts.enable_simd_scalar) {
712 // The AdvSIMD pass may produce copies that can be rewritten to
713 // be register coalescer friendly.
715 }
716 if (TM->getOptLevel() != CodeGenOptLevel::None && CLOpts.enable_pipeliner)
717 addPass(&MachinePipelinerID);
718}
719
720void AArch64PassConfig::addPostRewrite() {
721 if (CLOpts.srlt_mitigate_sr2r)
723}
724
725void AArch64PassConfig::addPostRegAlloc() {
726 // Remove redundant copy instructions.
727 if (TM->getOptLevel() != CodeGenOptLevel::None && CLOpts.enable_copyelim)
729
730 if (TM->getOptLevel() != CodeGenOptLevel::None && usingDefaultRegAlloc())
731 // Improve performance for some FP/SIMD code for A57.
733}
734
735void AArch64PassConfig::addPreSched2() {
736 // Lower homogeneous frame instructions
737 if (CLOpts.homogeneous_prolog_epilog)
739 // Expand some pseudo instructions to allow proper scheduling.
741 // Use load/store pair instructions when possible.
742 if (TM->getOptLevel() != CodeGenOptLevel::None) {
743 if (CLOpts.enable_ldst_opt)
745 }
746 // Emit KCFI checks for indirect calls.
747 addPass(createKCFIPass());
748
749 // The AArch64SpeculationHardeningPass destroys dominator tree and natural
750 // loop info, which is needed for the FalkorHWPFFixPass and also later on.
751 // Therefore, run the AArch64SpeculationHardeningPass before the
752 // FalkorHWPFFixPass to avoid recomputing dominator tree and natural loop
753 // info.
755
756 if (TM->getOptLevel() != CodeGenOptLevel::None) {
757 if (CLOpts.enable_falkor_hwpf_fix)
758 addPass(createFalkorHWPFFixPass());
759 }
760}
761
762void AArch64PassConfig::addPreEmitPass() {
763 // Machine Block Placement might have created new opportunities when run
764 // at O3, where the Tail Duplication Threshold is set to 4 instructions.
765 // Run the load/store optimizer once more.
766 if (TM->getOptLevel() >= CodeGenOptLevel::Aggressive &&
767 CLOpts.enable_ldst_opt)
769
770 if (TM->getOptLevel() >= CodeGenOptLevel::Aggressive &&
771 CLOpts.enable_copy_propagation)
773 if (TM->getOptLevel() != CodeGenOptLevel::None)
775
777
778 if (TM->getTargetTriple().isOSWindows()) {
779 // Identify valid longjmp targets for Windows Control Flow Guard.
780 addPass(createCFGuardLongjmpPass());
781 // Identify valid eh continuation targets for Windows EHCont Guard.
783 }
784
785 if (TM->getOptLevel() != CodeGenOptLevel::None && CLOpts.enable_collect_loh &&
786 TM->getTargetTriple().isOSBinFormatMachO())
788
789 // Apply code layout optimizations. Run late so detection reflects the
790 // final MI stream.
791 if (getOptLevel() != CodeGenOptLevel::None)
793}
794
795void AArch64PassConfig::addPostBBSections() {
798 if (CLOpts.enable_branch_targets)
800 // Relax conditional branch instructions if they're otherwise out of
801 // range of their destination.
802 if (CLOpts.enable_branch_relax)
803 addPass(&BranchRelaxationPassID);
804
805 if (TM->getOptLevel() != CodeGenOptLevel::None &&
806 CLOpts.enable_compress_jump_tables)
808}
809
810void AArch64PassConfig::addPreEmitPass2() {
811 // Insert pseudo probe annotation for callsite profiling
812 addPass(createPseudoProbeInserter());
813
814 // SVE bundles move prefixes with destructive operations. BLR_RVMARKER pseudo
815 // instructions are lowered to bundles as well.
816 addPass(createUnpackMachineBundlesLegacy(nullptr));
817}
818
819bool AArch64PassConfig::addRegAssignAndRewriteOptimized() {
822}
823
830
835
838 const auto *MFI = MF.getInfo<AArch64FunctionInfo>();
839 return new yaml::AArch64FunctionInfo(*MFI);
840}
841
844 SMDiagnostic &Error, SMRange &SourceRange) const {
845 const auto &YamlMFI = static_cast<const yaml::AArch64FunctionInfo &>(MFI);
846 MachineFunction &MF = PFS.MF;
847 MF.getInfo<AArch64FunctionInfo>()->initializeBaseYamlFields(YamlMFI);
848 return false;
849}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool scheduleFormTransposedTupleAdjacentToUsers(const TargetInstrInfo &TII, const TargetSubtargetInfo &TSI, const MachineInstr *FirstMI, const MachineInstr &SecondMI, const SDep *Dep)
static StringRef computeDefaultCPU(const Triple &TT, StringRef CPU)
static CodeModel::Model getEffectiveAArch64CodeModel(const Triple &TT, std::optional< CodeModel::Model > CM, bool JIT)
static std::unique_ptr< TargetLoweringObjectFile > createTLOF(const Triple &TT)
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAArch64Target()
This file a TargetTransformInfoImplBase conforming object specific to the AArch64 target machine.
static Reloc::Model getEffectiveRelocModel()
This file contains the simple types necessary to represent the attributes associated with functions a...
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
Provides analysis for continuously CSEing during GISel passes.
#define LLVM_ABI
Definition Compiler.h:215
#define LLVM_EXTERNAL_VISIBILITY
Definition Compiler.h:132
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file declares the IRTranslator pass.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
This file contains some functions that are useful when dealing with strings.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
Target-Independent Code Generator Pass Configuration Options pass.
This pass exposes codegen information to IR-level passes.
static std::unique_ptr< TargetLoweringObjectFile > createTLOF()
AArch64FunctionInfo - This class is derived from MachineFunctionInfo and contains private AArch64-spe...
size_t clearLinkerOptimizationHints(const SmallPtrSetImpl< MachineInstr * > &MIs)
size_t clearLinkerOptimizationHints(const SmallPtrSetImpl< MachineInstr * > &MIs) const override
Remove all Linker Optimization Hints (LOH) associated with instructions in MIs and.
StringMap< std::unique_ptr< AArch64Subtarget > > SubtargetMap
MachineFunctionInfo * createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, const TargetSubtargetInfo *STI) const override
Create the target's instance of MachineFunctionInfo.
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
const AArch64Subtarget * getSubtargetImpl() const =delete
yaml::MachineFunctionInfo * createDefaultFuncInfoYAML() const override
Allocate and return a default initialized instance of the YAML representation for the MachineFunction...
ScheduleDAGInstrs * createPostMachineScheduler(MachineSchedContext *C) const override
Similar to createMachineScheduler but used when postRA machine scheduling is enabled.
unsigned getEnableGlobalISelAtO() const
Returns the optimisation level that enables GlobalISel.
const AArch64Subtarget * LastSubtarget
std::unique_ptr< TargetLoweringObjectFile > TLOF
yaml::MachineFunctionInfo * convertFuncInfoToYAML(const MachineFunction &MF) const override
Allocate and initialize an instance of the YAML representation of the MachineFunctionInfo.
bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, PerFunctionMIParsingState &PFS, SMDiagnostic &Error, SMRange &SourceRange) const override
Parse out the target's MachineFunctionInfo from the YAML reprsentation.
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
bool isGlobalISelOptNone() const
This function checks whether the opt level is explicitly set to none, or whether GlobalISel was enabl...
void reset() override
Reset internal state.
AArch64TargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT, bool IsLittleEndian)
Create an AArch64 architecture model.
ScheduleDAGInstrs * createMachineScheduler(MachineSchedContext *C) const override
Create an instance of ScheduleDAGInstrs to be run within the standard MachineScheduler pass for this ...
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Return a TargetTransformInfo for a given function.
AArch64beTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
AArch64leTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:410
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:266
CodeGenTargetMachineImpl(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOptLevel OL)
This class represents a range of values.
LLVM_ABI APInt getUnsignedMin() const
Return the smallest unsigned value contained in the ConstantRange.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
This pass is responsible for selecting generic machine instructions to target-specific instructions.
static void setUseExtended(bool Enable)
This pass implements the localization mechanism described at the top of this file.
Definition Localizer.h:40
Pass to replace calls to ifuncs with indirect calls.
Definition LowerIFunc.h:19
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
This class provides access to building LLVM's passes.
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
This pass implements the reg bank selector pass used in the GlobalISel pipeline.
Scheduling dependency.
Definition ScheduleDAG.h:54
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition SourceMgr.h:305
Represents a range in source code.
Definition SMLoc.h:47
A ScheduleDAG for scheduling lists of MachineInstr.
ScheduleDAGMILive is an implementation of ScheduleDAGInstrs that schedules machine instructions while...
ScheduleDAGMI is an implementation of ScheduleDAGInstrs that simply schedules machine instructions ac...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
iterator begin() const
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
TargetInstrInfo - Interface to description of machine instruction set.
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
void setSupportsDebugEntryValues(bool Enable)
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
const Triple & getTargetTriple() const
void setMachineOutliner(bool Enable)
void setCFIFixup(bool Enable)
void setSupportsDefaultOutlining(bool Enable)
void setGlobalISelAbort(GlobalISelAbortMode Mode)
const MCAsmInfo & getMCAsmInfo() const
Return target specific asm information.
std::unique_ptr< const MCSubtargetInfo > STI
void setGlobalISel(bool Enable)
TargetOptions Options
CodeModel::Model getCodeModel() const
Returns the code model.
unsigned TLSSize
Bit size of immediate TLS offsets (0 == use the default).
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for 'unreachable' IR instructions behind noreturn calls,...
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
Target-Independent Code Generator Pass Configuration Options.
virtual void addCodeGenPrepare()
Add pass to prepare the LLVM IR for code generation.
virtual void addIRPasses()
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
virtual void addMachineSSAOptimization()
addMachineSSAOptimization - Add standard passes that optimize machine instructions in SSA form.
virtual bool addRegAssignAndRewriteOptimized()
TargetSubtargetInfo - Generic base class for all target subtargets.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
Registers T::Global with cl::ParseCommandLineOptions.
Interfaces for registering analysis passes, producing common pass manager configurations,...
@ DynamicNoPIC
Definition CodeGen.h:26
This is an optimization pass for GlobalISel generic memory operations.
ScheduleDAGMILive * createSchedLive(MachineSchedContext *C)
Create the standard converging machine scheduler.
void initializeAArch64PredicateAsCounterLoopRewritesPass(PassRegistry &)
FunctionPass * createAArch64PreLegalizerCombiner()
void initializeLDTLSCleanupPass(PassRegistry &)
LLVM_ABI FunctionPass * createCFGSimplificationPass(SimplifyCFGOptions Options=SimplifyCFGOptions(), std::function< bool(const Function &)> Ftor=nullptr)
void initializeMachineSMEABIPass(PassRegistry &)
FunctionPass * createAArch64PostSelectOptimize()
void initializeAArch64PTrueCoalescingLegacyPass(PassRegistry &)
FunctionPass * createAArch64ConditionOptimizerLegacyPass()
void initializeAArch64A53Fix835769LegacyPass(PassRegistry &)
LLVM_ABI ModulePass * createJMCInstrumenterPass()
JMC instrument pass.
void initializeAArch64SpeculationHardeningPass(PassRegistry &)
FunctionPass * createAArch64RedundantCopyEliminationPass()
LLVM_ABI std::unique_ptr< ScheduleDAGMutation > createMacroFusionDAGMutation(ArrayRef< MacroFusionPredTy > Predicates, bool BranchOnly=false)
Create a DAG scheduling mutation to pair instructions back to back for instructions that benefit acco...
LLVM_ABI FunctionPass * createTypePromotionLegacyPass()
Create IR Type Promotion pass.
void initializeAArch64StackTaggingPreRALegacyPass(PassRegistry &)
FunctionPass * createMachineSMEABIPass(CodeGenOptLevel)
LLVM_ABI FunctionPass * createEHContGuardTargetsLegacy()
Creates Windows EH Continuation Guard target identification pass.
LLVM_ABI FunctionPass * createSelectOptimizePass()
This pass converts conditional moves to conditional jumps when profitable.
FunctionPass * createAArch64A53Fix835769LegacyPass()
LLVM_ABI Pass * createGlobalMergePass(const TargetMachine *TM, unsigned MaximalOffset, bool OnlyOptimizeForSize=false, bool MergeExternalByDefault=false, bool MergeConstantByDefault=false, bool MergeConstAggressiveByDefault=false)
GlobalMerge - This pass merges internal (by default) globals into structs to enable reuse of a base p...
void initializeAArch64BranchTargetsLegacyPass(PassRegistry &)
LLVM_ABI std::unique_ptr< ScheduleDAGMutation > createLoadClusterDAGMutation(const TargetInstrInfo *TII, bool ReorderWhileClustering=false)
If ReorderWhileClustering is set to true, no attempt will be made to reduce reordering due to store c...
LLVM_ABI FunctionPass * createPseudoProbeInserter()
This pass inserts pseudo probe annotation for callsite profiling.
FunctionPass * createAArch64PostCoalescerPass()
void initializeAArch64PromoteConstantPass(PassRegistry &)
FunctionPass * createFalkorMarkStridedAccessesPass()
Target & getTheAArch64beTarget()
FunctionPass * createAArch64PointerAuthPass()
FunctionPass * createFalkorHWPFFixPass()
LLVM_ABI char & PostRASchedulerID
PostRAScheduler - This pass performs post register allocation scheduling.
std::string utostr(uint64_t X, bool isNeg=false)
FunctionPass * createAArch64O0PreLegalizerCombiner()
FunctionPass * createAArch64SLSHardeningLegacyPass()
@ O0
Disable as many optimizations as possible.
void initializeAArch64CollectLOHLegacyPass(PassRegistry &)
Pass * createAArch64PredicateAsCounterLoopRewritesPass()
void initializeAArch64PostLegalizerCombinerLegacyPass(PassRegistry &)
FunctionPass * createAArch64PostLegalizerCombinerLegacy(bool IsOptNone)
FunctionPass * createAArch64LoadStoreOptLegacyPass()
createAArch64LoadStoreOptimizationPass - returns an instance of the load / store optimization pass.
FunctionPass * createAArch64CondBrTuning()
LLVM_ABI std::unique_ptr< CSEConfigBase > getStandardCSEConfigForOpt(CodeGenOptLevel Level)
Definition CSEInfo.cpp:85
void initializeAArch64Arm64ECCallLoweringPass(PassRegistry &)
void initializeAArch64SIMDInstrOptLegacyPass(PassRegistry &)
LLVM_ABI char & PostMachineSchedulerID
PostMachineScheduler - This pass schedules machine instructions postRA.
LLVM_ABI char & PeepholeOptimizerLegacyID
PeepholeOptimizer - This pass performs peephole optimizations - like extension and comparison elimina...
LLVM_ABI std::unique_ptr< ScheduleDAGMutation > createStoreClusterDAGMutation(const TargetInstrInfo *TII, bool ReorderWhileClustering=false)
If ReorderWhileClustering is set to true, no attempt will be made to reduce reordering due to store c...
LLVM_ABI Pass * createLICMPass()
Definition LICM.cpp:345
FunctionPass * createAArch64A57FPLoadBalancingLegacyPass()
Target & getTheAArch64leTarget()
FunctionPass * createAArch64DeadRegisterDefinitions()
LLVM_ABI char & EarlyIfConverterLegacyID
EarlyIfConverter - This pass performs if-conversion on SSA form by inserting cmov instructions.
void initializeAArch64RedundantCondBranchLegacyPass(PassRegistry &)
void initializeAArch64PostSelectOptimizeLegacyPass(PassRegistry &)
FunctionPass * createSMEPeepholeOptPass()
FunctionPass * createAArch64PostLegalizerLowering()
ThinOrFullLTOPhase
This enumerates the LLVM full LTO or ThinLTO optimization phases.
Definition Pass.h:77
FunctionPass * createAArch64StackTaggingPreRALegacyPass()
void initializeAArch64CodeLayoutOptPass(PassRegistry &)
FunctionPass * createAArch64PTrueCoalescingLegacyPass()
LLVM_ABI void initializeMachineKCFILegacyPass(PassRegistry &)
PassManager< Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, LPMUpdater & > LoopPassManager
The Loop pass manager.
LLVM_ABI char & MachineCombinerID
This pass performs instruction combining using trace metrics to estimate critical-path and resource d...
void initializeAArch64AsmPrinterPass(PassRegistry &)
FunctionPass * createAArch64MIPeepholeOptLegacyPass()
LLVM_ABI FunctionPass * createUnpackMachineBundlesLegacy(std::function< bool(const MachineFunction &)> Ftor)
static Reloc::Model getEffectiveRelocModel(std::optional< Reloc::Model > RM)
void initializeAArch64AdvSIMDScalarLegacyPass(PassRegistry &)
FunctionPass * createAArch64CompressJumpTablesPass()
Target & getTheAArch64_32Target()
FunctionPass * createAArch64ConditionalCompares()
FunctionPass * createAArch64ExpandPseudoLegacyPass()
Returns an instance of the pseudo instruction expansion pass.
void initializeAArch64PointerAuthLegacyPass(PassRegistry &)
ScheduleDAGMI * createSchedPostRA(MachineSchedContext *C)
Create a generic scheduler with no vreg liveness or DAG mutation passes.
LLVM_ABI char & BranchRelaxationPassID
BranchRelaxation - This pass replaces branches that need to jump further than is supported by a branc...
void initializeFalkorMarkStridedAccessesLegacyPass(PassRegistry &)
void initializeAArch64StackTaggingPass(PassRegistry &)
void initializeAArch64PostLegalizerLoweringLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createKCFIPass()
Lowers KCFI operand bundles for indirect calls.
Definition KCFI.cpp:75
std::unique_ptr< ScheduleDAGMutation > createAArch64MacroFusionDAGMutation()
Note that you have to add: DAG.addMutation(createAArch64MacroFusionDAGMutation()); to AArch64TargetMa...
LLVM_ABI FunctionPass * createComplexDeinterleavingPass(const TargetMachine *TM)
This pass implements generation of target-specific intrinsics to support handling of complex number a...
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
ModulePass * createAArch64Arm64ECCallLoweringPass()
void initializeAArch64ConditionOptimizerLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createLoopDataPrefetchPass()
FunctionPass * createAArch64SIMDInstrOptPass()
Returns an instance of the high cost ASIMD instruction replacement optimization pass.
void initializeSMEPeepholeOptPass(PassRegistry &)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
FunctionPass * createAArch64StorePairSuppressPass()
void initializeAArch64PostCoalescerLegacyPass(PassRegistry &)
FunctionPass * createAArch64CollectLOHPass()
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:227
@ Default
-O2, -Os, -Oz
Definition CodeGen.h:230
LLVM_ABI FunctionPass * createCFGuardLongjmpPass()
Creates CFGuard longjmp target identification pass.
void initializeAArch64SLSHardeningLegacyPass(PassRegistry &)
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Target & getTheARM64_32Target()
@ Global
Append to llvm.global_dtors.
void initializeAArch64StorePairSuppressPass(PassRegistry &)
LLVM_ABI FunctionPass * createSeparateConstOffsetFromGEPPass(bool LowerGEP=false)
LLVM_ABI FunctionPass * createInterleavedAccessPass()
InterleavedAccess Pass - This pass identifies and matches interleaved memory accesses to target speci...
LLVM_ABI void initializeGlobalISel(PassRegistry &)
Initialize all passes linked into the GlobalISel library.
void initializeAArch64PreLegalizerCombinerLegacyPass(PassRegistry &)
FunctionPass * createAArch64ISelDag(AArch64TargetMachine &TM, CodeGenOptLevel OptLevel)
createAArch64ISelDag - This pass converts a legalized DAG into a AArch64-specific DAG,...
void initializeSVEShuffleOptsPass(PassRegistry &)
void initializeAArch64LowerHomogeneousPrologEpilogLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createCFGuardPass()
Insert Control Flow Guard checks on indirect function calls.
Definition CFGuard.cpp:315
void initializeAArch64CondBrTuningPass(PassRegistry &)
LLVM_ABI char & MachinePipelinerID
This pass performs software pipelining on machine instructions.
void initializeAArch64A57FPLoadBalancingLegacyPass(PassRegistry &)
FunctionPass * createAArch64BranchTargetsPass()
Target & getTheARM64Target()
void initializeFalkorHWPFFixPass(PassRegistry &)
void initializeAArch64ExpandPseudoLegacyPass(PassRegistry &)
@ WinEH
Windows Exception Handling.
Definition CodeGen.h:60
ModulePass * createAArch64LowerHomogeneousPrologEpilogPass()
LLVM_ABI bool isNonDataDep(const SDep *Dep)
Returns true if Dep is a non-null non-data dependency.
constexpr bool valueOr(BoolOrDefault X, bool Default)
void initializeAArch64SRLTDefineSuperRegsLegacyPass(PassRegistry &)
FunctionPass * createAArch64SRLTDefineSuperRegsLegacyPass()
FunctionPass * createAArch64StackTaggingPass(bool IsOptNone)
LLVM_ABI FunctionPass * createAtomicExpandLegacyPass()
AtomicExpandPass - At IR level this pass replace atomic instructions with __atomic_* library calls,...
FunctionPass * createAArch64CleanupLocalDynamicTLSPass()
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:391
ModulePass * createAArch64PromoteConstantPass()
void initializeAArch64CompressJumpTablesLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createEarlyCSEPass(bool UseMemorySSA=false)
LLVM_ABI MachineFunctionPass * createMachineCopyPropagationPass(bool UseCopyInstr)
void initializeAArch64RedundantCopyEliminationLegacyPass(PassRegistry &)
Pass * createSVEShuffleOptsPass()
FunctionPass * createAArch64CodeLayoutOptPass()
FunctionPass * createAArch64AdvSIMDScalar()
FunctionPass * createAArch64RedundantCondBranchPass()
void initializeAArch64DAGToDAGISelLegacyPass(PassRegistry &)
FunctionPass * createAArch64SpeculationHardeningPass()
Returns an instance of the pseudo instruction expansion pass.
void initializeAArch64MIPeepholeOptLegacyPass(PassRegistry &)
void initializeAArch64DeadRegisterDefinitionsLegacyPass(PassRegistry &)
void initializeAArch64ConditionalComparesLegacyPass(PassRegistry &)
void initializeAArch64O0PreLegalizerCombinerLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createInterleavedLoadCombinePass()
InterleavedLoadCombines Pass - This pass identifies interleaved loads and combines them into wide loa...
void initializeAArch64LoadStoreOptLegacyPass(PassRegistry &)
LLVM_ABI CGPassBuilderOption getCGPassBuilderOption()
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
cl::boolOrDefault EnableGlobalISelOption
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
static FuncInfoTy * create(BumpPtrAllocator &Allocator, const Function &F, const SubtargetTy *STI)
Factory function: default behavior is to call new using the supplied allocator.
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...
RegisterTargetMachine - Helper template for registering a target machine implementation,...
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.