LLVM 24.0.0git
TargetPassConfig.cpp
Go to the documentation of this file.
1//===- TargetPassConfig.cpp - Target independent code generation passes ---===//
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 defines interfaces to access the target independent code
10// generation passes provided by the LLVM backend.
11//
12//===---------------------------------------------------------------------===//
13
15#include "CodeGenOptions.h"
16#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/StringRef.h"
30#include "llvm/CodeGen/Passes.h"
35#include "llvm/IR/Verifier.h"
37#include "llvm/MC/MCAsmInfo.h"
39#include "llvm/Pass.h"
43#include "llvm/Support/Debug.h"
55#include <cassert>
56#include <optional>
57#include <string>
58
59using namespace llvm;
60
61namespace {
62class TriggerCrashFunctionLegacyPass : public FunctionPass {
63public:
64 static char ID;
65 TriggerCrashFunctionLegacyPass() : FunctionPass(ID) {}
66 bool runOnFunction(Function &F) override {
67 abort();
68 return false;
69 }
70 StringRef getPassName() const override { return "TriggerCrashFunctionPass"; }
71};
72} // namespace
73
74char TriggerCrashFunctionLegacyPass::ID = 0;
75
76// Enable or disable the MachineOutliner.
78 "enable-machine-outliner", cl::desc("Enable the machine outliner"),
82 "Run on all functions guaranteed to be beneficial"),
83 clEnumValN(RunOutliner::OptimisticPGO, "optimistic-pgo",
84 "Outline cold code only. If a code block does not have "
85 "profile data, optimistically assume it is cold."),
86 clEnumValN(RunOutliner::ConservativePGO, "conservative-pgo",
87 "Outline cold code only. If a code block does not have "
88 "profile, data, conservatively assume it is hot."),
89 clEnumValN(RunOutliner::NeverOutline, "never", "Disable all outlining"),
90 // Sentinel value for unspecified option.
92
93/// Option names for limiting the codegen pipeline.
94/// Those are used in error reporting and we didn't want
95/// to duplicate their names all over the place.
96static const char StartAfterOptName[] = "start-after";
97static const char StartBeforeOptName[] = "start-before";
98static const char StopAfterOptName[] = "stop-after";
99static const char StopBeforeOptName[] = "stop-before";
100
101/// Allow standard passes to be disabled by command line options. This supports
102/// simple binary flags that either suppress the pass or do nothing.
103/// i.e. -disable-mypass=false has no effect.
104/// These should be converted to boolOrDefault in order to use applyOverride.
106 bool Override) {
107 if (Override)
108 return IdentifyingPassPtr();
109 return PassID;
110}
111
112/// Allow standard passes to be disabled by the command line, regardless of who
113/// is adding the pass.
114///
115/// StandardID is the pass identified in the standard pass pipeline and provided
116/// to addPass(). It may be a target-specific ID in the case that the target
117/// directly adds its own pass, but in that case we harmlessly fall through.
118///
119/// TargetID is the pass that the target has configured to override StandardID.
120///
121/// StandardID may be a pseudo ID. In that case TargetID is the name of the real
122/// pass to run. This allows multiple options to control a single pass depending
123/// on where in the pipeline that pass is added.
125 IdentifyingPassPtr TargetID) {
126 const CodeGenOptions &Opts = CodeGenOptions::Global;
127 if (StandardID == &PostRASchedulerID)
128 return applyDisable(TargetID, Opts.disable_post_ra);
129
130 if (StandardID == &BranchFolderPassID)
131 return applyDisable(TargetID, Opts.disable_branch_fold);
132
133 if (StandardID == &TailDuplicateLegacyID)
134 return applyDisable(TargetID, Opts.disable_tail_duplicate);
135
136 if (StandardID == &EarlyTailDuplicateLegacyID)
137 return applyDisable(TargetID, Opts.disable_early_taildup);
138
139 if (StandardID == &MachineBlockPlacementID)
140 return applyDisable(TargetID, Opts.disable_block_placement);
141
142 if (StandardID == &StackSlotColoringID)
143 return applyDisable(TargetID, Opts.disable_ssc);
144
145 if (StandardID == &DeadMachineInstructionElimID)
146 return applyDisable(TargetID, Opts.disable_machine_dce);
147
148 if (StandardID == &EarlyIfConverterLegacyID)
149 return applyDisable(TargetID, Opts.disable_early_ifcvt);
150
151 if (StandardID == &EarlyMachineLICMID)
152 return applyDisable(TargetID, Opts.disable_machine_licm);
153
154 if (StandardID == &MachineCSELegacyID)
155 return applyDisable(TargetID, Opts.disable_machine_cse);
156
157 if (StandardID == &MachineLICMID)
158 return applyDisable(TargetID, Opts.disable_postra_machine_licm);
159
160 if (StandardID == &MachineSinkingLegacyID)
161 return applyDisable(TargetID, Opts.disable_machine_sink);
162
163 if (StandardID == &PostRAMachineSinkingID)
164 return applyDisable(TargetID, Opts.disable_postra_machine_sink);
165
166 if (StandardID == &MachineCopyPropagationID)
167 return applyDisable(TargetID, Opts.disable_copyprop);
168
169 return TargetID;
170}
171
172// Find the FSProfile file name. The internal option takes the precedence
173// before getting from TargetMachine.
174static std::string getFSProfileFile(const TargetMachine *TM) {
175 const CodeGenOptions &Opts = CodeGenOptions::Global;
176 if (!Opts.fs_profile_file.empty())
177 return Opts.fs_profile_file.str();
178 const std::optional<PGOOptions> &PGOOpt = TM->getPGOOption();
179 if (PGOOpt == std::nullopt || PGOOpt->Action != PGOOptions::SampleUse)
180 return std::string();
181 return PGOOpt->ProfileFile;
182}
183
184// Find the Profile remapping file name. The internal option takes the
185// precedence before getting from TargetMachine.
186static std::string getFSRemappingFile(const TargetMachine *TM) {
187 const CodeGenOptions &Opts = CodeGenOptions::Global;
188 if (!Opts.fs_remapping_file.empty())
189 return Opts.fs_remapping_file.str();
190 const std::optional<PGOOptions> &PGOOpt = TM->getPGOOption();
191 if (PGOOpt == std::nullopt || PGOOpt->Action != PGOOptions::SampleUse)
192 return std::string();
193 return PGOOpt->ProfileRemappingFile;
194}
195
196//===---------------------------------------------------------------------===//
197/// TargetPassConfig
198//===---------------------------------------------------------------------===//
199
200INITIALIZE_PASS(TargetPassConfig, "targetpassconfig",
201 "Target Pass Configuration", false, false)
202char TargetPassConfig::ID = 0;
203
204namespace {
205
209
212
214 assert(InsertedPassID.isValid() && "Illegal Pass ID!");
215 if (InsertedPassID.isInstance())
216 return InsertedPassID.getInstance();
217 Pass *NP = Pass::createPass(InsertedPassID.getID());
218 assert(NP && "Pass ID not registered");
219 return NP;
220 }
221};
222
223} // end anonymous namespace
224
225namespace llvm {
226
228public:
229 // List of passes explicitly substituted by this target. Normally this is
230 // empty, but it is a convenient way to suppress or replace specific passes
231 // that are part of a standard pass pipeline without overridding the entire
232 // pipeline. This mechanism allows target options to inherit a standard pass's
233 // user interface. For example, a target may disable a standard pass by
234 // default by substituting a pass ID of zero, and the user may still enable
235 // that standard pass with an explicit command line option.
237
238 /// Store the pairs of <AnalysisID, AnalysisID> of which the second pass
239 /// is inserted after each instance of the first one.
241};
242
243} // end namespace llvm
244
245// Out of line virtual method.
249
251 if (PassName.empty())
252 return nullptr;
253
255 const PassInfo *PI = PR.getPassInfo(PassName);
256 if (!PI)
258 Twine("\" pass is not registered."));
259 return PI;
260}
261
263 const PassInfo *PI = getPassInfo(PassName);
264 return PI ? PI->getTypeInfo() : nullptr;
265}
266
267static std::pair<StringRef, unsigned>
269 StringRef Name, InstanceNumStr;
270 std::tie(Name, InstanceNumStr) = PassName.split(',');
271
272 unsigned InstanceNum = 0;
273 if (!InstanceNumStr.empty() && InstanceNumStr.getAsInteger(10, InstanceNum))
274 reportFatalUsageError("invalid pass instance specifier " + PassName);
275
276 return std::make_pair(Name, InstanceNum);
277}
278
279void TargetPassConfig::setStartStopPasses() {
280 const CodeGenOptions &Opts = CodeGenOptions::Global;
281 StringRef StartBeforeName;
282 std::tie(StartBeforeName, StartBeforeInstanceNum) =
283 getPassNameAndInstanceNum(Opts.start_before);
284
285 StringRef StartAfterName;
286 std::tie(StartAfterName, StartAfterInstanceNum) =
287 getPassNameAndInstanceNum(Opts.start_after);
288
289 StringRef StopBeforeName;
290 std::tie(StopBeforeName, StopBeforeInstanceNum) =
291 getPassNameAndInstanceNum(Opts.stop_before);
292
293 StringRef StopAfterName;
294 std::tie(StopAfterName, StopAfterInstanceNum) =
295 getPassNameAndInstanceNum(Opts.stop_after);
296
297 StartBefore = getPassIDFromName(StartBeforeName);
298 StartAfter = getPassIDFromName(StartAfterName);
299 StopBefore = getPassIDFromName(StopBeforeName);
300 StopAfter = getPassIDFromName(StopAfterName);
301 if (StartBefore && StartAfter)
302 reportFatalUsageError(Twine(StartBeforeOptName) + Twine(" and ") +
303 Twine(StartAfterOptName) + Twine(" specified!"));
304 if (StopBefore && StopAfter)
305 reportFatalUsageError(Twine(StopBeforeOptName) + Twine(" and ") +
306 Twine(StopAfterOptName) + Twine(" specified!"));
307 Started = (StartAfter == nullptr) && (StartBefore == nullptr);
308}
309
316
318 const CodeGenOptions &Opts = CodeGenOptions::Global;
320 Opt.EnableGlobalISelAbort = Opts.global_isel_abort;
321 if (Opts.enable_ipra != BoolOrDefault::Default)
322 Opt.EnableIPRA = Opts.enable_ipra == BoolOrDefault::True;
323 Opt.EnableFastISelOption = toBoolOrDefault(Opts.fast_isel);
324 Opt.EnableRegAllocFastTied = toBoolOrDefault(Opts.regalloc_fast_tied);
325 Opt.EnableGlobalISelOption = toBoolOrDefault(Opts.global_isel);
326 Opt.VerifyMachineCode = toBoolOrDefault(Opts.verify_machineinstrs);
328 Opts.disable_atexit_based_global_dtor_lowering;
329 Opt.DisableExpandReductions = Opts.disable_expand_reductions;
330 Opt.PrintAfterISel = Opts.print_after_isel;
331 Opt.FSProfileFile = Opts.fs_profile_file.str();
332 Opt.EnableGCEmptyBlocks = Opts.enable_gc_empty_basic_blocks;
333 Opt.EnableBlockPlacementStats = Opts.enable_block_placement_stats;
334 Opt.EnableGlobalMergeFunc = Opts.enable_global_merge_func;
335 Opt.EnableImplicitNullChecks = Opts.enable_implicit_null_checks;
337 Opt.MISchedPostRA = Opts.misched_postra;
338 Opt.DisableLSR = Opts.disable_lsr;
339 Opt.DisableConstantHoisting = Opts.disable_constant_hoisting;
340 Opt.DisableCGP = Opts.disable_cgp;
341 Opt.DisablePartialLibcallInlining = Opts.disable_partial_libcall_inlining;
342 Opt.DisableSelectOptimize = Opts.disable_select_optimize;
343 Opt.PrintISelInput = Opts.print_isel_input;
344 Opt.PrintRegUsage = Opts.print_regusage;
345 Opt.DebugifyAndStripAll = toBoolOrDefault(Opts.debugify_and_strip_all_safe);
347 toBoolOrDefault(Opts.debugify_check_and_strip_all_safe);
348 Opt.DisableRAFSProfileLoader = Opts.disable_ra_fsprofile_loader;
349 Opt.DisableCFIFixup = Opts.disable_cfi_fixup;
350 return Opt;
351}
352
354 TargetMachine &TM) {
355
356 // Register a callback for disabling passes.
357 PIC.registerShouldRunOptionalPassCallback([](StringRef P, IRUnitRef) {
358 const CodeGenOptions &Opts = CodeGenOptions::Global;
359
360#define DISABLE_PASS(Option, Name) \
361 if (Option && P.contains(#Name)) \
362 return false;
363 DISABLE_PASS(Opts.disable_block_placement, MachineBlockPlacementPass)
364 DISABLE_PASS(Opts.disable_branch_fold, BranchFolderPass)
365 DISABLE_PASS(Opts.disable_copyprop, MachineCopyPropagationPass)
366 DISABLE_PASS(Opts.disable_early_ifcvt, EarlyIfConverterLegacyPass)
367 DISABLE_PASS(Opts.disable_early_taildup, EarlyTailDuplicatePass)
368 DISABLE_PASS(Opts.disable_machine_cse, MachineCSELegacyPass)
369 DISABLE_PASS(Opts.disable_machine_dce, DeadMachineInstructionElimPass)
370 DISABLE_PASS(Opts.disable_machine_licm, EarlyMachineLICMPass)
371 DISABLE_PASS(Opts.disable_machine_sink, MachineSinkingPass)
372 DISABLE_PASS(Opts.disable_postra_machine_licm, MachineLICMPass)
373 DISABLE_PASS(Opts.disable_postra_machine_sink, PostRAMachineSinkingPass)
374 DISABLE_PASS(Opts.disable_post_ra, PostRASchedulerPass)
375 DISABLE_PASS(Opts.disable_ssc, StackSlotColoringPass)
376 DISABLE_PASS(Opts.disable_tail_duplicate, TailDuplicatePass)
377
378 return true;
379 });
380}
381
384 const CodeGenOptions &Opts = CodeGenOptions::Global;
385 auto [StartBefore, StartBeforeInstanceNum] =
386 getPassNameAndInstanceNum(Opts.start_before);
387 auto [StartAfter, StartAfterInstanceNum] =
388 getPassNameAndInstanceNum(Opts.start_after);
389 auto [StopBefore, StopBeforeInstanceNum] =
390 getPassNameAndInstanceNum(Opts.stop_before);
391 auto [StopAfter, StopAfterInstanceNum] =
392 getPassNameAndInstanceNum(Opts.stop_after);
393
394 if (!StartBefore.empty() && !StartAfter.empty())
396 Twine(StartBeforeOptName) + " and " + StartAfterOptName + " specified!",
397 std::make_error_code(std::errc::invalid_argument));
398 if (!StopBefore.empty() && !StopAfter.empty())
400 Twine(StopBeforeOptName) + " and " + StopAfterOptName + " specified!",
401 std::make_error_code(std::errc::invalid_argument));
402
403 StartStopInfo Result;
404 Result.StartPass = StartBefore.empty() ? StartAfter : StartBefore;
405 Result.StopPass = StopBefore.empty() ? StopAfter : StopBefore;
406 Result.StartInstanceNum =
407 StartBefore.empty() ? StartAfterInstanceNum : StartBeforeInstanceNum;
408 Result.StopInstanceNum =
409 StopBefore.empty() ? StopAfterInstanceNum : StopBeforeInstanceNum;
410 Result.StartAfter = !StartAfter.empty();
411 Result.StopAfter = !StopAfter.empty();
412 Result.StartInstanceNum += Result.StartInstanceNum == 0;
413 Result.StopInstanceNum += Result.StopInstanceNum == 0;
414 return Result;
415}
416
417// Out of line constructor provides default values for pass options and
418// registers all common codegen passes.
420 : ImmutablePass(ID), PM(&PM), TM(&TM) {
421 const CodeGenOptions &Opts = CodeGenOptions::Global;
422 Impl = new PassConfigImpl();
423
425 // Register all target independent codegen passes to activate their PassIDs,
426 // including this pass itself.
428
430
431 // Also register alias analysis passes required by codegen passes.
434
435 if (Opts.enable_ipra != BoolOrDefault::Default) {
436 TM.Options.EnableIPRA = Opts.enable_ipra == BoolOrDefault::True;
437 } else {
438 // If not explicitly specified, use target default.
439 TM.Options.EnableIPRA |= TM.useIPRA();
440 }
441
442 if (TM.Options.EnableIPRA)
444
445 if (Opts.regalloc_fast_tied != BoolOrDefault::Default)
446 TM.setEnableTiedFastRegAlloc(Opts.regalloc_fast_tied ==
448
449 if (Opts.global_isel_abort)
450 TM.Options.GlobalISelAbort = *Opts.global_isel_abort;
451
452 if (Opts.function_splitting)
453 TM.Options.FunctionSplitting = *Opts.function_splitting;
454
455 setStartStopPasses();
456}
457
459 return TM->getOptLevel();
460}
461
462/// Insert InsertedPassID pass after TargetPassID.
464 IdentifyingPassPtr InsertedPassID) {
465 assert(((!InsertedPassID.isInstance() &&
466 TargetPassID != InsertedPassID.getID()) ||
467 (InsertedPassID.isInstance() &&
468 TargetPassID != InsertedPassID.getInstance()->getPassID())) &&
469 "Insert a pass after itself!");
470 Impl->InsertedPasses.emplace_back(TargetPassID, InsertedPassID);
471}
472
473/// createPassConfig - Create a pass configuration object to be used by
474/// addPassToEmitX methods for generating a pipeline of CodeGen passes.
475///
476/// Targets may override this to extend TargetPassConfig.
481
483 : ImmutablePass(ID) {
484 reportFatalUsageError("trying to construct TargetPassConfig without a target "
485 "machine. Scheduling a CodeGen pass without a target "
486 "triple set?");
487}
488
490 const CodeGenOptions &Opts = CodeGenOptions::Global;
491 return Opts.stop_before.empty() && Opts.stop_after.empty();
492}
493
495 const CodeGenOptions &Opts = CodeGenOptions::Global;
496 return !Opts.start_before.empty() || !Opts.start_after.empty() ||
498}
499
501 const CodeGenOptions &Opts = CodeGenOptions::Global;
503 return std::string();
504 std::string Res;
505 StringRef PassNames[] = {Opts.start_after, Opts.start_before, Opts.stop_after,
506 Opts.stop_before};
507 static const char *OptNames[] = {StartAfterOptName, StartBeforeOptName,
509 bool IsFirst = true;
510 for (int Idx = 0; Idx < 4; ++Idx)
511 if (!PassNames[Idx].empty()) {
512 if (!IsFirst)
513 Res += " and ";
514 IsFirst = false;
515 Res += OptNames[Idx];
516 }
517 return Res;
518}
519
520// Helper to verify the analysis is really immutable.
521void TargetPassConfig::setOpt(bool &Opt, bool Val) {
522 assert(!Initialized && "PassConfig is immutable");
523 Opt = Val;
524}
525
527 IdentifyingPassPtr TargetID) {
528 Impl->TargetPasses[StandardID] = TargetID;
529}
530
533 I = Impl->TargetPasses.find(ID);
534 if (I == Impl->TargetPasses.end())
535 return ID;
536 return I->second;
537}
538
541 IdentifyingPassPtr FinalPtr = overridePass(ID, TargetID);
542 return !FinalPtr.isValid() || FinalPtr.isInstance() ||
543 FinalPtr.getID() != ID;
544}
545
546/// Add a pass to the PassManager if that pass is supposed to be run. If the
547/// Started/Stopped flags indicate either that the compilation should start at
548/// a later pass or that it should stop after an earlier pass, then do not add
549/// the pass. Finally, compare the current pass against the StartAfter
550/// and StopAfter options and change the Started/Stopped flags accordingly.
552 assert(!Initialized && "PassConfig is immutable");
553
554 // Cache the Pass ID here in case the pass manager finds this pass is
555 // redundant with ones already scheduled / available, and deletes it.
556 // Fundamentally, once we add the pass to the manager, we no longer own it
557 // and shouldn't reference it.
558 AnalysisID PassID = P->getPassID();
559
560 if (StartBefore == PassID && StartBeforeCount++ == StartBeforeInstanceNum)
561 Started = true;
562 if (StopBefore == PassID && StopBeforeCount++ == StopBeforeInstanceNum)
563 Stopped = true;
564 if (Started && !Stopped) {
565 if (AddingMachinePasses) {
566 // Construct banner message before PM->add() as that may delete the pass.
567 std::string Banner =
568 std::string("After ") + std::string(P->getPassName());
570 PM->add(P);
571 addMachinePostPasses(Banner);
572 } else {
573 PM->add(P);
574 }
575
576 // Add the passes after the pass P if there is any.
577 for (const auto &IP : Impl->InsertedPasses)
578 if (IP.TargetPassID == PassID)
579 addPass(IP.getInsertedPass());
580 } else {
581 delete P;
582 }
583
584 if (StopAfter == PassID && StopAfterCount++ == StopAfterInstanceNum)
585 Stopped = true;
586
587 if (StartAfter == PassID && StartAfterCount++ == StartAfterInstanceNum)
588 Started = true;
589 if (Stopped && !Started)
590 reportFatalUsageError("Cannot stop compilation after pass that is not run");
591}
592
593/// Add a CodeGen pass at this point in the pipeline after checking for target
594/// and command line overrides.
595///
596/// addPass cannot return a pointer to the pass instance because is internal the
597/// PassManager and the instance we create here may already be freed.
599 IdentifyingPassPtr TargetID = getPassSubstitution(PassID);
600 IdentifyingPassPtr FinalPtr = overridePass(PassID, TargetID);
601 if (!FinalPtr.isValid())
602 return nullptr;
603
604 Pass *P;
605 if (FinalPtr.isInstance())
606 P = FinalPtr.getInstance();
607 else {
608 P = Pass::createPass(FinalPtr.getID());
609 if (!P)
610 llvm_unreachable("Pass ID not registered");
611 }
612 AnalysisID FinalID = P->getPassID();
613 addPass(P); // Ends the lifetime of P.
614
615 return FinalID;
616}
617
618void TargetPassConfig::printAndVerify(const std::string &Banner) {
619 addPrintPass(Banner);
620 addVerifyPass(Banner);
621}
622
623void TargetPassConfig::addPrintPass(const std::string &Banner) {
624 if (CodeGenOptions::Global.print_after_isel)
625 PM->add(createMachineFunctionPrinterPass(dbgs(), Banner));
626}
627
628void TargetPassConfig::addVerifyPass(const std::string &Banner) {
629 const CodeGenOptions &Opts = CodeGenOptions::Global;
630 bool Verify = valueOr(Opts.verify_machineinstrs, false);
631#ifdef EXPENSIVE_CHECKS
632 if (Opts.verify_machineinstrs == BoolOrDefault::Default)
633 Verify = TM->isMachineVerifierClean();
634#endif
635 if (Verify)
636 PM->add(createMachineVerifierPass(Banner));
637}
638
642
644 PM->add(createStripDebugMachineModuleLegacyPass(/*OnlyDebugified=*/true));
645}
646
650
652 const CodeGenOptions &Opts = CodeGenOptions::Global;
653 if (AllowDebugify && DebugifyIsSafe &&
654 (valueOr(Opts.debugify_and_strip_all_safe, false) ||
655 valueOr(Opts.debugify_check_and_strip_all_safe, false)))
657}
658
659void TargetPassConfig::addMachinePostPasses(const std::string &Banner) {
660 const CodeGenOptions &Opts = CodeGenOptions::Global;
661 if (DebugifyIsSafe) {
662 if (valueOr(Opts.debugify_check_and_strip_all_safe, false)) {
665 } else if (valueOr(Opts.debugify_and_strip_all_safe, false))
667 }
668 addVerifyPass(Banner);
669}
670
671/// Add common target configurable passes that perform LLVM IR to IR transforms
672/// following machine independent optimization.
674 const CodeGenOptions &Opts = CodeGenOptions::Global;
675 // Before running any passes, run the verifier to determine if the input
676 // coming from the front-end and/or optimizer is valid.
677 if (!DisableVerify)
679
681 // Basic AliasAnalysis support.
682 // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that
683 // BasicAliasAnalysis wins if they disagree. This is intended to help
684 // support "obvious" type-punning idioms.
688
689 // Run loop strength reduction before anything else.
690 if (!Opts.disable_lsr) {
695 }
696 }
697
698 // Run GC lowering passes for builtin collectors
699 // TODO: add a pass insertion point here
702
703 // For MachO, lower @llvm.global_dtors into @llvm.global_ctors with
704 // __cxa_atexit() calls to avoid emitting the deprecated __mod_term_func.
705 if (TM->getTargetTriple().isOSBinFormatMachO() &&
706 !Opts.disable_atexit_based_global_dtor_lowering)
708
709 // Make sure that no unreachable blocks are instruction selected.
711
712 // Prepare expensive constants for SelectionDAG.
713 if (getOptLevel() != CodeGenOptLevel::None && !Opts.disable_constant_hoisting)
715
717 !Opts.disable_replace_with_vec_lib)
719
721 !Opts.disable_partial_libcall_inlining)
723
724 // Instrument function entry after all inlining.
726
727 // Add scalarization of target's unsupported masked memory intrinsics pass.
728 // the unsupported intrinsic will be replaced with a chain of basic blocks,
729 // that stores/loads element one-by-one if the appropriate mask bit is set.
731
732 // Expand reduction intrinsics into shuffle sequences if the target wants to.
733 // Allow disabling it for testing purposes.
734 if (!Opts.disable_expand_reductions)
736
737 // Convert conditional moves to conditional jumps when profitable.
738 if (getOptLevel() != CodeGenOptLevel::None && !Opts.disable_select_optimize)
740
741 if (Opts.enable_global_merge_func)
743
744 if (TM->getTargetTriple().isOSWindows())
746}
747
748/// Turn exception handling constructs into something the code generators can
749/// handle.
751 const MCAsmInfo &MCAI = TM->getMCAsmInfo();
752 switch (MCAI.getExceptionHandlingType()) {
754 // SjLj piggy-backs on dwarf for this bit. The cleanups done apply to both
755 // Dwarf EH prepare needs to be run after SjLj prepare. Otherwise,
756 // catch info can get misplaced when a selector ends up more than one block
757 // removed from the parent invoke(s). This could happen when a landing
758 // pad is shared by multiple invokes and is also a target of a normal
759 // edge from elsewhere.
761 [[fallthrough]];
767 break;
769 // We support using both GCC-style and MSVC-style exceptions on Windows, so
770 // add both preparation passes. Each pass will only actually run if it
771 // recognizes the personality function.
774 break;
776 // Wasm EH uses Windows EH instructions, but it does not need to demote PHIs
777 // on catchpads and cleanuppads because it does not outline them into
778 // funclets. Catchswitch blocks are not lowered in SelectionDAG, so we
779 // should remove PHIs there. WinEHPrepare derives this from the Wasm
780 // personality, so no explicit flag is needed here.
782 break;
786 // Emscripten EH is lowered earlier by WebAssemblyLowerEmscriptenEHSjLj, so
787 // by this point it needs no generic EH preparation, like the None case.
789
790 // The lower invoke pass may create unreachable code. Remove it.
792 break;
793 }
794}
795
796/// Add pass to prepare the LLVM IR for code generation. This should be done
797/// before exception handling preparation passes.
800 !CodeGenOptions::Global.disable_cgp)
802}
803
804/// Add common passes that perform LLVM IR to IR transforms in preparation for
805/// instruction selection.
807 addPreISel();
808
809 // Force codegen to run according to the callgraph.
812
814
815 // Add both the safe stack and the stack protection passes: each of them will
816 // only protect functions that have corresponding attributes.
819
820 if (CodeGenOptions::Global.print_isel_input)
822 dbgs(), "\n\n*** Final LLVM Code input to ISel ***\n"));
823
824 // All passes which modify the LLVM IR are now complete; run the verifier
825 // to ensure that the IR is valid.
826 if (!DisableVerify)
828}
829
831 const CodeGenOptions &Opts = CodeGenOptions::Global;
832 // Enable FastISel with -fast-isel, but allow that to be overridden.
833 TM->setO0WantsFastISel(valueOr(Opts.fast_isel, true));
834
835 // Determine an instruction selector.
836 enum class SelectorType { SelectionDAG, FastISel, GlobalISel };
837 SelectorType Selector;
838
839 if (valueOr(Opts.fast_isel, false))
840 Selector = SelectorType::FastISel;
841 else if (valueOr(Opts.global_isel, false) ||
842 (TM->Options.EnableGlobalISel && valueOr(Opts.global_isel, true)))
843 Selector = SelectorType::GlobalISel;
844 else if (TM->getOptLevel() == CodeGenOptLevel::None &&
845 TM->getO0WantsFastISel())
846 Selector = SelectorType::FastISel;
847 else
848 Selector = SelectorType::SelectionDAG;
849
850 // Set consistently TM->Options.EnableFastISel and EnableGlobalISel.
851 if (Selector == SelectorType::FastISel) {
852 TM->setFastISel(true);
853 TM->setGlobalISel(false);
854 } else if (Selector == SelectorType::GlobalISel) {
855 TM->setFastISel(false);
856 TM->setGlobalISel(true);
857 }
858
859 // FIXME: Injecting into the DAGISel pipeline seems to cause issues with
860 // analyses needing to be re-run. This can result in being unable to
861 // schedule passes (particularly with 'Function Alias Analysis
862 // Results'). It's not entirely clear why but AFAICT this seems to be
863 // due to one FunctionPassManager not being able to use analyses from a
864 // previous one. As we're injecting a ModulePass we break the usual
865 // pass manager into two. GlobalISel with the fallback path disabled
866 // and -run-pass seem to be unaffected. The majority of GlobalISel
867 // testing uses -run-pass so this probably isn't too bad.
868 SaveAndRestore SavedDebugifyIsSafe(DebugifyIsSafe);
869 if (Selector != SelectorType::GlobalISel || !isGlobalISelAbortEnabled())
870 DebugifyIsSafe = false;
871
872 // Add instruction selector passes for global isel if enabled.
873 if (Selector == SelectorType::GlobalISel) {
874 SaveAndRestore SavedAddingMachinePasses(AddingMachinePasses, true);
875 if (addIRTranslator())
876 return true;
877
879
881 return true;
882
883 // Before running the register bank selector, ask the target if it
884 // wants to run some passes.
886
887 if (addRegBankSelect())
888 return true;
889
891
893 return true;
894 }
895
896 // Pass to reset the MachineFunction if the ISel failed. Outside of the above
897 // if so that the verifier is not added to it.
898 if (Selector == SelectorType::GlobalISel)
901
902 // Run the SDAG InstSelector, providing a fallback path when we do not want to
903 // abort on not-yet-supported input.
904 if (Selector != SelectorType::GlobalISel || !isGlobalISelAbortEnabled())
905 if (addInstSelector())
906 return true;
907
908 // Expand pseudo-instructions emitted by ISel. Don't run the verifier before
909 // FinalizeISel.
911
912 // Print the instruction selected machine code...
913 printAndVerify("After Instruction Selection");
914
915 return false;
916}
917
919 if (TM->useEmulatedTLS())
921
922 PM->add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis()));
923 // ObjCARCContract operates on ObjC intrinsics and must run before
924 // PreISelIntrinsicLowering.
929 addIRPasses();
930
931 if (CodeGenOptions::Global.codegen_pipeline_trigger_crash)
932 addPass(new TriggerCrashFunctionLegacyPass());
933
937
938 return addCoreISelPasses();
939}
940
941/// -regalloc=... command line option.
942static FunctionPass *useDefaultRegisterAllocator() { return nullptr; }
946 cl::desc("Register allocator to use"));
947
948/// Add the complete set of target-independent postISel code generator passes.
949///
950/// This can be read as the standard order of major LLVM CodeGen stages. Stages
951/// with nontrivial configuration or multiple passes are broken out below in
952/// add%Stage routines.
953///
954/// Any TargetPassConfig::addXX routine may be overriden by the Target. The
955/// addPre/Post methods with empty header implementations allow injecting
956/// target-specific fixups just before or after major stages. Additionally,
957/// targets have the flexibility to change pass order within a stage by
958/// overriding default implementation of add%Stage routines below. Each
959/// technique has maintainability tradeoffs because alternate pass orders are
960/// not well supported. addPre/Post works better if the target pass is easily
961/// tied to a common pass. But if it has subtle dependencies on multiple passes,
962/// the target should override the stage instead.
963///
964/// TODO: We could use a single addPre/Post(ID) hook to allow pass injection
965/// before/after any target-independent pass. But it's currently overkill.
967 const CodeGenOptions &Opts = CodeGenOptions::Global;
968 AddingMachinePasses = true;
969
970 // Add passes that optimize machine instructions in SSA form.
973 } else {
974 // If the target requests it, assign local variables to stack slots relative
975 // to one another and simplify frame index references where possible.
977 }
978
979 if (TM->Options.EnableIPRA)
981
982 // Run pre-ra passes.
984
985 // Debugifying the register allocator passes seems to provoke some
986 // non-determinism that affects CodeGen and there doesn't seem to be a point
987 // where it becomes safe again so stop debugifying here.
988 DebugifyIsSafe = false;
989
990 // Add a FSDiscriminator pass right before RA, so that we could get
991 // more precise SampleFDO profile for RA.
995 const std::string ProfileFile = getFSProfileFile(TM);
996 if (!ProfileFile.empty() && !Opts.disable_ra_fsprofile_loader)
999 nullptr));
1000 }
1001
1002 // Run register allocation and passes that are tightly coupled with it,
1003 // including phi elimination and scheduling.
1004 if (getOptimizeRegAlloc())
1006 else
1008
1009 // Run post-ra passes.
1011
1013
1015
1016 // Insert prolog/epilog code. Eliminate abstract frame index references...
1020 }
1021
1022 // Prolog/Epilog inserter needs a TargetMachine to instantiate. But only
1023 // do so if it hasn't been disabled, substituted, or overridden.
1026
1027 /// Add passes that optimize machine instructions after register allocation.
1030
1031 // Expand pseudo instructions before second scheduling pass.
1033
1034 // Run pre-sched2 passes.
1035 addPreSched2();
1036
1037 if (Opts.enable_implicit_null_checks)
1039
1040 // Second pass scheduler.
1041 // Let Target optionally insert this pass by itself at some other
1042 // point.
1044 !TM->targetSchedulesPostRAScheduling()) {
1045 if (Opts.misched_postra)
1047 else
1049 }
1050
1051 // GC
1052 addGCPasses();
1053
1054 // Basic block placement.
1057
1058 // Insert before XRay Instrumentation.
1060
1063
1065
1066 if (TM->Options.EnableIPRA)
1067 // Collect register usage information and produce a register mask of
1068 // clobbered registers, to be used to optimize call sites.
1070
1071 // FIXME: Some backends are incompatible with running the verifier after
1072 // addPreEmitPass. Maybe only pass "false" here for those targets?
1074
1079
1080 if (TM->Options.EnableMachineOutliner &&
1084 TM->supportsDefaultOutlining())
1086 }
1087
1088 if (Opts.enable_gc_empty_basic_blocks)
1090
1094
1095 const bool SplitFunctions =
1096 TM->Options.FunctionSplitting == FunctionSplittingMode::All;
1097
1098 if (SplitFunctions || Opts.split_static_data ||
1099 TM->Options.EnableStaticDataPartitioning) {
1100 const std::string ProfileFile = getFSProfileFile(TM);
1101 if (!ProfileFile.empty()) {
1104 ProfileFile, getFSRemappingFile(TM),
1106 } else {
1107 // Sample profile is given, but FSDiscriminator is not
1108 // enabled, this may result in performance regression.
1110 << "Using AutoFDO without FSDiscriminator for MFS may regress "
1111 "performance.\n";
1112 }
1113 }
1114 }
1115
1116 // Machine function splitter uses the basic block sections feature.
1117 // When used along with `-basic-block-sections=`, the basic-block-sections
1118 // feature takes precedence. This means functions eligible for
1119 // basic-block-sections optimizations (`=all`, or `=list=` with function
1120 // included in the list profile) will get that optimization instead.
1121 if (SplitFunctions)
1123
1124 if (Opts.split_static_data || TM->Options.EnableStaticDataPartitioning) {
1125 // The static data splitter pass is a machine function pass. and
1126 // static data annotator pass is a module-wide pass. See the file comment
1127 // in StaticDataAnnotator.cpp for the motivation.
1130 }
1131 // We run the BasicBlockSections pass if either we need BB sections or BB
1132 // address map (or both).
1133 if (TM->getBBSectionsType() != llvm::BasicBlockSection::None ||
1134 TM->Options.BBAddrMap) {
1135 if (shouldEmitBBHash() || Opts.basic_block_section_match_infer)
1137 if (TM->getBBSectionsType() == llvm::BasicBlockSection::List) {
1139 TM->getBBSectionsFuncListBuf()));
1140 if (Opts.basic_block_section_match_infer)
1142 else {
1145 }
1146 }
1148 }
1149
1151
1152 if (!Opts.disable_cfi_fixup && TM->Options.EnableCFIFixup)
1154
1156
1157 // Add passes that directly emit MI after all other MI passes.
1159
1160 AddingMachinePasses = false;
1161}
1162
1163/// Add passes that optimize machine instructions in SSA form.
1165 // Pre-ra tail duplication.
1167
1168 // Optimize PHIs before DCE: removing dead PHI cycles may make more
1169 // instructions dead.
1171
1172 // This pass merges large allocas. StackSlotColoring is a different pass
1173 // which merges spill slots.
1175
1176 // If the target requests it, assign local variables to stack slots relative
1177 // to one another and simplify frame index references where possible.
1179
1180 // With optimization, dead code should already be eliminated. However
1181 // there is one known exception: lowered code for arguments that are only
1182 // used by tail calls, where the tail calls reuse the incoming stack
1183 // arguments directly (see t11 in test/CodeGen/X86/sibcall.ll).
1185
1186 // Allow targets to insert passes that improve instruction level parallelism,
1187 // like if-conversion. Such passes will typically need dominator trees and
1188 // loop info, just like LICM and CSE below.
1189 addILPOpts();
1190
1193
1195
1197 // Clean-up the dead code that may have been generated by peephole
1198 // rewriting.
1200}
1201
1202//===---------------------------------------------------------------------===//
1203/// Register Allocation Pass Configuration
1204//===---------------------------------------------------------------------===//
1205
1206/// A dummy default pass factory indicates whether the register allocator is
1207/// overridden on the command line.
1209
1210static RegisterRegAlloc
1212 "pick register allocator based on -O option",
1214
1219
1221 // An explicit -regalloc choice implies its pipeline: only the fast
1222 // allocator uses the unoptimized one.
1227 return Ctor !=
1230}
1231
1232/// Instantiate the default register allocator pass for this target for either
1233/// the optimized or unoptimized allocation path. This will be added to the pass
1234/// manager by addFastRegAlloc in the unoptimized case or addOptimizedRegAlloc
1235/// in the optimized case.
1236///
1237/// A target that uses the standard regalloc pass order for fast or optimized
1238/// allocation may still override this for per-target regalloc
1239/// selection. But -regalloc=... always takes precedence.
1241 if (Optimized)
1243 else
1245}
1246
1247/// Find and instantiate the register allocation pass requested by this target
1248/// at the current optimization level. Different register allocators are
1249/// defined as separate passes because they may require different analysis.
1250///
1251/// This helper ensures that the regalloc= option is always available,
1252/// even for targets that override the default allocator.
1253///
1254/// FIXME: When MachinePassRegistry register pass IDs instead of function ptrs,
1255/// this can be folded into addPass.
1257 // getOptimizeRegAlloc, called before the pipeline branches, has initialized
1258 // the global default.
1260 if (Ctor != useDefaultRegisterAllocator)
1261 return Ctor();
1262
1263 // With no -regalloc= override, ask the target for a regalloc pass.
1264 return createTargetRegisterAllocator(Optimized);
1265}
1266
1271
1276 "Must use fast (default) register allocator for unoptimized regalloc.");
1277
1279
1280 // Allow targets to change the register assignments after
1281 // fast register allocation.
1283 return true;
1284}
1285
1287 // Add the selected register allocation pass.
1289
1290 // Allow targets to change the register assignments before rewriting.
1291 addPreRewrite();
1292
1293 // Finally rewrite virtual registers.
1295
1296 // Regalloc scoring for ML-driven eviction - noop except when learning a new
1297 // eviction policy.
1299 return true;
1300}
1301
1302/// Return true if the default global register allocator is in use and
1303/// has not be overriden on the command line with '-regalloc=...'
1305 return RegAlloc.getNumOccurrences() == 0;
1306}
1307
1308/// Add the minimum set of target-independent passes that are required for
1309/// register allocation. No coalescing or scheduling.
1312 if (!TM->enableTiedFastRegAlloc())
1314
1316}
1317
1318/// Add standard target-independent passes that are tightly coupled with
1319/// optimized register allocation, including coalescing, machine instruction
1320/// scheduling, and register allocation itself.
1323
1325
1327
1328 // LiveVariables currently requires pure SSA form.
1329 //
1330 // FIXME: Once TwoAddressInstruction pass no longer uses kill flags,
1331 // LiveVariables can be removed completely, and LiveIntervals can be directly
1332 // computed. (We still either need to regenerate kill flags after regalloc, or
1333 // preferably fix the scavenger to not depend on them).
1334 // FIXME: UnreachableMachineBlockElim is a dependant pass of LiveVariables.
1335 // When LiveVariables is removed this has to be removed/moved either.
1336 // Explicit addition of UnreachableMachineBlockElim allows stopping before or
1337 // after it with -stop-before/-stop-after.
1340
1341 // Run SSA machine scheduler runs just before PHI elimination.
1345 }
1346
1347 // LiveIntervals is computed unconditionally before TwoAddressInstruction so
1348 // that pass can rely on it instead of LiveVariables. This is a step toward
1349 // removing LiveVariables entirely.
1351
1352 // Edge splitting is smarter with machine loop info.
1355
1358
1359 // The machine scheduler may accidentally create disconnected components
1360 // when moving subregister definitions around, avoid this by splitting them to
1361 // separate vregs before. Splitting can also improve reg. allocation quality.
1363
1364 // PreRA instruction scheduling.
1366
1368 // Perform stack slot coloring and post-ra machine LICM.
1370
1371 // Allow targets to expand pseudo instructions depending on the choice of
1372 // registers before MachineCopyPropagation.
1374
1375 // Copy propagate to forward register uses and try to eliminate COPYs that
1376 // were not coalesced.
1378
1379 // Run post-ra machine LICM to hoist reloads / remats.
1380 //
1381 // FIXME: can this move into MachineLateOptimization?
1383 }
1384}
1385
1386//===---------------------------------------------------------------------===//
1387/// Post RegAlloc Pass Configuration
1388//===---------------------------------------------------------------------===//
1389
1390/// Add passes that optimize machine instructions after register allocation.
1392 // Cleanup of redundant immediate/address loads.
1394
1395 // Branch folding must be run after regalloc and prolog/epilog insertion.
1397
1398 // Tail duplication.
1399 // Note that duplicating tail just increases code size and degrades
1400 // performance for targets that require Structured Control Flow.
1401 // In addition it can also make CFG irreducible. Thus we disable it.
1402 if (!TM->requiresStructuredCFG())
1404
1405 // Copy propagation.
1407}
1408
1409/// Add standard GC passes.
1412 return true;
1413}
1414
1415/// Add standard basic block placement passes.
1417 const CodeGenOptions &Opts = CodeGenOptions::Global;
1421 const std::string ProfileFile = getFSProfileFile(TM);
1422 if (!ProfileFile.empty() && !Opts.disable_layout_fsprofile_loader)
1425 nullptr));
1426 }
1428 // Run a separate pass to collect block placement statistics.
1429 if (Opts.enable_block_placement_stats)
1431 }
1432}
1433
1434//===---------------------------------------------------------------------===//
1435/// GlobalISel Configuration
1436//===---------------------------------------------------------------------===//
1438 return TM->Options.GlobalISelAbort == GlobalISelAbortMode::Enable;
1439}
1440
1444
1445std::unique_ptr<CSEConfigBase> TargetPassConfig::getCSEConfig() const {
1446 return std::make_unique<CSEConfigBase>();
1447}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This is the interface for LLVM's primary stateless and local alias analysis.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This file defines the DenseMap class.
static bool runOnFunction(Function &F, bool PostInlining)
This file contains an interface for creating legacy passes to print out IR in various granularities.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define P(N)
ppc ctr loops PowerPC CTR Loops Verify
PassInstrumentationCallbacks PIC
This file defines the Pass Instrumentation classes that provide instrumentation points into the pass ...
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition PassSupport.h:56
This file provides utility classes that use RAII to save and restore values.
This is the interface for a metadata-based scoped no-alias analysis.
This file defines the SmallVector class.
static const char StopAfterOptName[]
static llvm::once_flag InitializeDefaultRegisterAllocatorFlag
Register Allocation Pass Configuration.
static cl::opt< RegisterRegAlloc::FunctionPassCtor, false, RegisterPassParser< RegisterRegAlloc > > RegAlloc("regalloc", cl::Hidden, cl::init(&useDefaultRegisterAllocator), cl::desc("Register allocator to use"))
static FunctionPass * useDefaultRegisterAllocator()
-regalloc=... command line option.
static cl::opt< RunOutliner > EnableMachineOutliner("enable-machine-outliner", cl::desc("Enable the machine outliner"), cl::Hidden, cl::ValueOptional, cl::init(RunOutliner::TargetDefault), cl::values(clEnumValN(RunOutliner::AlwaysOutline, "always", "Run on all functions guaranteed to be beneficial"), clEnumValN(RunOutliner::OptimisticPGO, "optimistic-pgo", "Outline cold code only. If a code block does not have " "profile data, optimistically assume it is cold."), clEnumValN(RunOutliner::ConservativePGO, "conservative-pgo", "Outline cold code only. If a code block does not have " "profile, data, conservatively assume it is hot."), clEnumValN(RunOutliner::NeverOutline, "never", "Disable all outlining"), clEnumValN(RunOutliner::AlwaysOutline, "", "")))
static std::string getFSRemappingFile(const TargetMachine *TM)
static const char StopBeforeOptName[]
static AnalysisID getPassIDFromName(StringRef PassName)
static IdentifyingPassPtr overridePass(AnalysisID StandardID, IdentifyingPassPtr TargetID)
Allow standard passes to be disabled by the command line, regardless of who is adding the pass.
static std::pair< StringRef, unsigned > getPassNameAndInstanceNum(StringRef PassName)
static void initializeDefaultRegisterAllocatorOnce()
static const char StartBeforeOptName[]
static const PassInfo * getPassInfo(StringRef PassName)
static const char StartAfterOptName[]
Option names for limiting the codegen pipeline.
static std::string getFSProfileFile(const TargetMachine *TM)
static IdentifyingPassPtr applyDisable(IdentifyingPassPtr PassID, bool Override)
Allow standard passes to be disabled by command line options.
#define DISABLE_PASS(Option, Name)
static RegisterRegAlloc defaultRegAlloc("default", "pick register allocator based on -O option", useDefaultRegisterAllocator)
static cl::boolOrDefault toBoolOrDefault(BoolOrDefault B)
Target-Independent Code Generator Pass Configuration Options pass.
This pass exposes codegen information to IR-level passes.
This is the interface for a metadata-based TBAA.
Defines the virtual file system interface vfs::FileSystem.
static const char PassName[]
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Definition DenseMap.h:680
This pass is required by interprocedural register allocation.
Tagged union holding either a T or a Error.
Definition Error.h:485
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:67
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
A type-erased reference to the IR unit a pass or analysis is running on, together with the kind of IR...
Definition IRUnitRef.h:60
Discriminated union of Pass ID types.
AnalysisID getID() const
ImmutablePass(char &pid)
Definition Pass.h:287
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition MCAsmInfo.h:67
ExceptionHandling getExceptionHandlingType() const
Definition MCAsmInfo.h:656
DenseMap< AnalysisID, IdentifyingPassPtr > TargetPasses
SmallVector< InsertedPass, 4 > InsertedPasses
Store the pairs of <AnalysisID, AnalysisID> of which the second pass is inserted after each instance ...
PassInfo class - An instance of this class exists for every pass known by the system,...
Definition PassInfo.h:29
const void * getTypeInfo() const
getTypeInfo - Return the id object for the pass... TODO : Rename
Definition PassInfo.h:62
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
LLVM_ABI const PassInfo * getPassInfo(const void *TI) const
getPassInfo - Look up a pass' corresponding PassInfo, indexed by the pass' type identifier (&MyPass::...
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
static Pass * createPass(AnalysisID ID)
Definition Pass.cpp:222
AnalysisID getPassID() const
getPassID - Return the PassID number that corresponds to this pass.
Definition Pass.h:122
RegisterPassParser class - Handle the addition of new machine passes.
static void setDefault(FunctionPassCtor C)
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition StringRef.h:490
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
Primary interface to the complete machine description for the target machine.
const std::optional< PGOOptions > & getPGOOption() const
Target-Independent Code Generator Pass Configuration Options.
bool usingDefaultRegAlloc() const
Return true if the default global register allocator is in use and has not be overriden on the comman...
bool requiresCodeGenSCCOrder() const
void addCheckDebugPass()
Add a pass to check synthesized debug info for MIR.
virtual void addPreLegalizeMachineIR()
This method may be implemented by targets that want to run passes immediately before legalization.
void addPrintPass(const std::string &Banner)
Add a pass to print the machine function if printing is enabled.
virtual void addPreEmitPass2()
Targets may add passes immediately before machine code is emitted in this callback.
virtual std::unique_ptr< CSEConfigBase > getCSEConfig() const
Returns the CSEConfig object to use for the current optimization level.
bool EnableLoopTermFold
Enable LoopTermFold immediately after LSR.
void printAndVerify(const std::string &Banner)
printAndVerify - Add a pass to dump then verify the machine function, if those steps are enabled.
static bool hasLimitedCodeGenPipeline()
Returns true if one of the -start-after, -start-before, -stop-after or -stop-before options is set.
static Expected< StartStopInfo > getStartStopInfo(PassInstrumentationCallbacks &PIC)
Returns pass name in -stop-before or -stop-after NOTE: New pass manager migration only.
bool EnableSSAMachineScheduler
Enable insertion of SSAMachineScheduler pass, this triggers early computation of live intervals.
virtual void addCodeGenPrepare()
Add pass to prepare the LLVM IR for code generation.
void insertPass(AnalysisID TargetPassID, IdentifyingPassPtr InsertedPassID)
Insert InsertedPassID pass after TargetPassID pass.
void addMachinePostPasses(const std::string &Banner)
Add standard passes after a pass that has just been added.
virtual void addPreSched2()
This method may be implemented by targets that want to run passes after prolog-epilog insertion and b...
virtual bool addILPOpts()
Add passes that optimize instruction level parallelism for out-of-order targets.
virtual void addPostRegAlloc()
This method may be implemented by targets that want to run passes after register allocation pass pipe...
void addDebugifyPass()
Add a pass to add synthesized debug info to the MIR.
virtual bool addInstSelector()
addInstSelector - This method should install an instruction selector pass, which converts from LLVM c...
CodeGenOptLevel getOptLevel() const
virtual bool addPreISel()
Methods with trivial inline returns are convenient points in the common codegen pass pipeline where t...
void setOpt(bool &Opt, bool Val)
virtual void addBlockPlacement()
Add standard basic block placement passes.
virtual FunctionPass * createRegAllocPass(bool Optimized)
addMachinePasses helper to create the target-selected or overriden regalloc pass.
virtual void addPostBBSections()
This pass may be implemented by targets that want to run passes immediately after basic block section...
virtual void addOptimizedRegAlloc()
addOptimizedRegAlloc - Add passes related to register allocation.
virtual bool addRegAssignAndRewriteFast()
Add core register allocator passes which do the actual register assignment and rewriting.
virtual void addPreEmitPass()
This pass may be implemented by targets that want to run passes immediately before machine code is em...
bool isGlobalISelAbortEnabled() const
Check whether or not GlobalISel should abort on error.
bool getOptimizeRegAlloc() const
Return true if the optimized regalloc pipeline is enabled.
bool isCustomizedRegAlloc()
Return true if register allocator is specified by -regalloc=override.
virtual void addPreRegBankSelect()
This method may be implemented by targets that want to run passes immediately before the register ban...
virtual bool reportDiagnosticWhenGlobalISelFallback() const
Check whether or not a diagnostic should be emitted when GlobalISel uses the fallback path.
virtual bool addPreRewrite()
addPreRewrite - Add passes to the optimized register allocation pipeline after register allocation is...
virtual bool addRegBankSelect()
This method should install a register bank selector pass, which assigns register banks to virtual reg...
void setRequiresCodeGenSCCOrder(bool Enable=true)
virtual void addMachineLateOptimization()
Add passes that optimize machine instructions after register allocation.
virtual void addMachinePasses()
Add the complete, standard set of LLVM CodeGen passes.
virtual void addIRPasses()
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
virtual void addPreGlobalInstructionSelect()
This method may be implemented by targets that want to run passes immediately before the (global) ins...
virtual void addFastRegAlloc()
addFastRegAlloc - Add the minimum set of target-independent passes that are required for fast registe...
virtual bool addLegalizeMachineIR()
This method should install a legalize pass, which converts the instruction sequence into one that can...
virtual void addMachineSSAOptimization()
addMachineSSAOptimization - Add standard passes that optimize machine instructions in SSA form.
void substitutePass(AnalysisID StandardID, IdentifyingPassPtr TargetID)
Allow the target to override a specific pass without overriding the pass pipeline.
virtual bool addRegAssignAndRewriteOptimized()
virtual bool addGlobalInstructionSelect()
This method should install a (global) instruction selector pass, which converts possibly generic inst...
virtual void addPreRegAlloc()
This method may be implemented by targets that want to run passes immediately before register allocat...
static std::string getLimitedCodeGenPipelineReason()
If hasLimitedCodeGenPipeline is true, this method returns a string with the name of the options that ...
AnalysisID addPass(AnalysisID PassID)
Utilities for targets to add passes to the pass manager.
void addPassesToHandleExceptions()
Add passes to lower exception handling for the code generator.
void addStripDebugPass()
Add a pass to remove debug info from the MIR.
bool isPassSubstitutedOrOverridden(AnalysisID ID) const
Return true if the pass has been substituted by the target or overridden on the command line.
bool addCoreISelPasses()
Add the actual instruction selection passes.
virtual void addISelPrepare()
Add common passes that perform LLVM IR to IR transforms in preparation for instruction selection.
static bool willCompleteCodeGenPipeline()
Returns true if none of the -stop-before and -stop-after options is set.
void addMachinePrePasses(bool AllowDebugify=true)
Add standard passes before a pass that's about to be added.
virtual bool addGCPasses()
addGCPasses - Add late codegen passes that analyze code for garbage collection.
virtual bool addIRTranslator()
This method should install an IR translator pass, which converts from LLVM code to machine instructio...
void addVerifyPass(const std::string &Banner)
Add a pass to perform basic verification of the machine function if verification is enabled.
virtual FunctionPass * createTargetRegisterAllocator(bool Optimized)
createTargetRegisterAllocator - Create the register allocator pass for this target at the current opt...
virtual bool addPostFastRegAllocRewrite()
addPostFastRegAllocRewrite - Add passes to the optimized register allocation pipeline after fast regi...
IdentifyingPassPtr getPassSubstitution(AnalysisID StandardID) const
Return the pass substituted for StandardID by the target.
bool addISelPasses()
High level function that adds all passes necessary to go from llvm IR representation to the MI repres...
virtual void addPostRewrite()
Add passes to be run immediately after virtual registers are rewritten to physical registers.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static LLVM_ABI raw_ostream & warning()
Convenience method for printing "warning: " to stderr.
Definition WithColor.cpp:86
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI ModulePass * createLowerGlobalDtorsLegacyPass()
LLVM_ABI FunctionPass * createFastRegisterAllocator()
FastRegisterAllocation Pass - This pass register allocates as fast as possible.
LLVM_ABI char & EarlyMachineLICMID
This pass performs loop invariant code motion on machine instructions.
LLVM_ABI FunctionPass * createWinEHPass()
createWinEHPass - Prepares personality functions used by MSVC on Windows, in addition to the Itanium ...
LLVM_ABI char & GCMachineCodeAnalysisID
GCMachineCodeAnalysis - Target-independent pass to mark safe points in machine code.
LLVM_ABI bool shouldEmitBBHash()
Returns whether -emit-bb-hash is set.
LLVM_ABI char & FEntryInserterID
This pass inserts FEntry calls.
LLVM_ABI char & GCLoweringID
GCLowering Pass - Used by gc.root to perform its default lowering operations.
LLVM_ABI void initializeBasicAAWrapperPassPass(PassRegistry &)
LLVM_ABI void registerCodeGenCallback(PassInstrumentationCallbacks &PIC, TargetMachine &)
LLVM_ABI char & InitUndefID
LLVM_ABI char & RegisterCoalescerID
RegisterCoalescer - This pass merges live ranges to eliminate copies.
LLVM_ABI FunctionPass * createGreedyRegisterAllocator()
Greedy register allocation pass - This pass implements a global register allocator for optimized buil...
LLVM_ABI FunctionPass * createConstantHoistingPass()
LLVM_ABI FunctionPass * createSafeStackPass()
This pass splits the stack into a safe stack and an unsafe stack to protect against stack-based overf...
LLVM_ABI ModulePass * createStaticDataAnnotatorLegacyPass()
createStaticDataAnnotatorPASS - This is a module pass that reads from StaticDataProfileInfoWrapperPas...
LLVM_ABI cl::opt< bool > EnableFSDiscriminator
LLVM_ABI FunctionPass * createSelectOptimizePass()
This pass converts conditional moves to conditional jumps when profitable.
LLVM_ABI char & FixupStatepointCallerSavedID
The pass fixups statepoint machine instruction to replace usage of caller saved registers with stack ...
LLVM_ABI MachineFunctionPass * createBasicBlockSectionsPass()
createBasicBlockSections Pass - This pass assigns sections to machine basic blocks and is enabled wit...
LLVM_ABI FunctionPass * createPostInlineEntryExitInstrumenterPass()
LLVM_ABI MachineFunctionPass * createPrologEpilogInserterPass()
LLVM_ABI char & TailDuplicateLegacyID
TailDuplicate - Duplicate blocks with unconditional branches into tails of their predecessors.
LLVM_ABI char & ExpandPostRAPseudosID
ExpandPostRAPseudos - This pass expands pseudo instructions after register allocation.
LLVM_ABI ModulePass * createStripDebugMachineModuleLegacyPass(bool OnlyDebugified)
Creates MIR Strip Debug pass.
LLVM_ABI char & PatchableFunctionID
This pass implements the "patchable-function" attribute.
LLVM_ABI MachineFunctionPass * createResetMachineFunctionLegacyPass(bool EmitFallbackDiag, bool AbortOnFailedISel)
This pass resets a MachineFunction when it has the FailedISel property as if it was just created.
LLVM_ABI FunctionPass * createScalarizeMaskedMemIntrinLegacyPass()
LLVM_ABI char & PostRASchedulerID
PostRAScheduler - This pass performs post register allocation scheduling.
LLVM_ABI char & RemoveLoadsIntoFakeUsesID
RemoveLoadsIntoFakeUses pass.
LLVM_ABI MachineFunctionPass * createStackFrameLayoutAnalysisPass()
StackFramePrinter pass - This pass prints out the machine function's stack frame to the given stream ...
LLVM_ABI ModulePass * createGlobalMergeFuncPass()
This pass performs merging similar functions globally.
LLVM_ABI char & MachineSanitizerBinaryMetadataID
LLVM_ABI FunctionPass * createStackProtectorPass()
createStackProtectorPass - This pass adds stack protectors to functions.
LLVM_ABI Pass * createLoopTermFoldPass()
LLVM_ABI char & MachineSchedulerID
MachineScheduler - This pass schedules machine instructions.
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 char & LiveDebugValuesID
LiveDebugValues pass.
LLVM_ABI char & PrologEpilogCodeInserterID
PrologEpilogCodeInserter - This pass inserts prolog and epilog code, and eliminates abstract frame re...
LLVM_ABI FunctionPass * createExpandIRInstsPass(CodeGenOptLevel)
LLVM_ABI char & EarlyIfConverterLegacyID
EarlyIfConverter - This pass performs if-conversion on SSA form by inserting cmov instructions.
LLVM_ABI MachineFunctionPass * createMachineFunctionSplitterPass()
createMachineFunctionSplitterPass - This pass splits machine functions using profile information.
LLVM_ABI FunctionPass * createMachineVerifierPass(const std::string &Banner)
createMachineVerifierPass - This pass verifies cenerated machine code instructions for correctness.
LLVM_ABI ImmutablePass * createBasicBlockSectionsProfileReaderWrapperPass(const MemoryBuffer *Buf)
LLVM_ABI char & MachineLoopInfoID
MachineLoopInfo - This pass is a loop analysis pass.
LLVM_ABI char & ShadowStackGCLoweringID
ShadowStackGCLowering - Implements the custom lowering mechanism used by the shadow stack GC.
LLVM_ABI char & ImplicitNullChecksID
ImplicitNullChecks - This pass folds null pointer checks into nearby memory operations.
LLVM_ABI FunctionPass * createMIRAddFSDiscriminatorsPass(sampleprof::FSDiscriminatorPass P)
Add Flow Sensitive Discriminators.
LLVM_ABI ModulePass * createPreISelIntrinsicLoweringPass()
This pass lowers the @llvm.load.relative and @llvm.objc.
LLVM_ABI char & ShrinkWrapID
ShrinkWrap pass. Look for the best place to insert save and restore.
LLVM_ABI char & MachineLateInstrsCleanupID
MachineLateInstrsCleanup - This pass removes redundant identical instructions after register allocati...
LLVM_ABI char & UnreachableMachineBlockElimID
UnreachableMachineBlockElimination - This pass removes unreachable machine basic blocks.
LLVM_ABI FunctionPass * createLowerInvokePass()
LLVM_ABI FunctionPass * createRegUsageInfoCollector()
This pass is executed POST-RA to collect which physical registers are preserved by given machine func...
LLVM_ABI ImmutablePass * createScopedNoAliasAAWrapperPass()
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI char & XRayInstrumentationID
This pass inserts the XRay instrumentation sleds if they are supported by the target platform.
LLVM_ABI char & OptimizePHIsLegacyID
OptimizePHIs - This pass optimizes machine instruction PHIs to take advantage of opportunities create...
LLVM_ABI char & StackMapLivenessID
StackMapLiveness - This pass analyses the register live-out set of stackmap/patchpoint intrinsics and...
LLVM_ABI char & FuncletLayoutID
This pass lays out funclets contiguously.
LLVM_ABI FunctionPass * createCodeGenPrepareLegacyPass()
createCodeGenPrepareLegacyPass - Transform the code to expose more pattern matching during instructio...
LLVM_ABI MachineFunctionPass * createMachineFunctionPrinterPass(raw_ostream &OS, const std::string &Banner="")
MachineFunctionPrinter pass - This pass prints out the machine function to the given stream as a debu...
LLVM_ABI char & RemoveRedundantDebugValuesID
RemoveRedundantDebugValues pass.
LLVM_ABI FunctionPass * createBasicAAWrapperPass()
LLVM_ABI char & DetectDeadLanesID
This pass adds dead/undef flags after analyzing subregister lanes.
LLVM_ABI char & PostRAMachineSinkingID
This pass perform post-ra machine sink for COPY instructions.
LLVM_ABI FunctionPass * createDwarfEHPass(CodeGenOptLevel OptLevel)
createDwarfEHPass - This pass mulches exception handling code into a form adapted to code generation.
LLVM_ABI FunctionPass * createRegAllocScoringPass()
When learning an eviction policy, extract score(reward) information, otherwise this does nothing.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:227
LLVM_ABI char & StackSlotColoringID
StackSlotColoring - This pass performs stack slot coloring.
LLVM_ABI ModulePass * createMachineOutlinerPass(RunOutliner RunOutlinerMode)
This pass performs outlining on machine instructions directly before printing assembly.
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
Definition Error.h:340
LLVM_ABI ModulePass * createLowerEmuTLSPass()
LowerEmuTLS - This pass generates __emutls_[vt].xyz variables for all TLS variables for the emulated ...
LLVM_ABI char & ProcessImplicitDefsID
ProcessImpicitDefs pass - This pass removes IMPLICIT_DEFs.
LLVM_ABI ImmutablePass * createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA)
Create an analysis pass wrapper around a TTI object.
LLVM_ABI MachineFunctionPass * createInsertCodePrefetchPass()
createInsertCodePrefetchPass - This pass enables inserting code prefetch hints based on the basic blo...
LLVM_ABI FunctionPass * createMIRProfileLoaderPass(std::string File, std::string RemappingFile, sampleprof::FSDiscriminatorPass P, IntrusiveRefCntPtr< vfs::FileSystem > FS)
Read Flow Sensitive Profile.
LLVM_ABI FunctionPass * createVerifierPass(bool FatalErrors=true)
LLVM_ABI char & SSAMachineSchedulerID
SSAMachineScheduler - This pass schedules machine instructions in SSA.
LLVM_ABI char & MachineCSELegacyID
MachineCSE - This pass performs global CSE on machine instructions.
LLVM_ABI ImmutablePass * createTypeBasedAAWrapperPass()
LLVM_ABI Pass * createLoopStrengthReducePass()
LLVM_ABI MachineFunctionPass * createMachineBlockHashInfoPass()
createMachineBlockHashInfoPass - This pass computes basic block hashes.
LLVM_ABI char & LiveVariablesID
LiveVariables pass - This pass sets dead flags on register definitions.
LLVM_ABI char & EarlyTailDuplicateLegacyID
Duplicate blocks with unconditional branches into tails of their predecessors.
LLVM_ABI void initializeAAResultsWrapperPassPass(PassRegistry &)
LLVM_ABI FunctionPass * createExpandReductionsPass()
This pass expands the reduction intrinsics into sequences of shuffles.
LLVM_ABI MachineFunctionPass * createStaticDataSplitterLegacyPass()
createStaticDataSplitterPass - This is a machine-function pass that categorizes static data hotness u...
void call_once(once_flag &flag, Function &&F, Args &&... ArgList)
Execute the function specified as a parameter once.
Definition Threading.h:86
LLVM_ABI FunctionPass * createSjLjEHPreparePass(const TargetMachine *TM)
createSjLjEHPreparePass - This pass adapts exception handling code to use the GCC-style builtin setjm...
LLVM_ABI MachineFunctionPass * createBasicBlockPathCloningPass()
@ SjLj
setjmp/longjmp based exceptions
Definition CodeGen.h:58
@ ZOS
z/OS MVS Exception Handling.
Definition CodeGen.h:64
@ Emscripten
Emscripten JavaScript-based exception handling.
Definition CodeGen.h:62
@ None
No exception support.
Definition CodeGen.h:56
@ Default
Not specified; resolve to the target's default model.
Definition CodeGen.h:55
@ AIX
AIX Exception Handling.
Definition CodeGen.h:63
@ DwarfCFI
DWARF-like instruction based exceptions.
Definition CodeGen.h:57
@ WinEH
Windows Exception Handling.
Definition CodeGen.h:60
@ Wasm
WebAssembly Exception Handling.
Definition CodeGen.h:61
LLVM_ABI char & StackColoringLegacyID
StackSlotColoring - This pass performs stack coloring and merging.
LLVM_ABI char & VirtRegRewriterID
VirtRegRewriter pass.
LLVM_ABI FunctionPass * createReplaceWithVeclibLegacyPass()
LLVM_ABI FunctionPass * createInlineAsmPreparePass()
LLVM_ABI char & FinalizeISelID
This pass expands pseudo-instructions, reserves registers and adjusts machine frame information.
constexpr bool valueOr(BoolOrDefault X, bool Default)
LLVM_ABI char & MachineSinkingLegacyID
MachineSinking - This pass performs sinking on machine instructions.
LLVM_ABI FunctionPass * createRegUsageInfoPropPass()
Return a MachineFunction pass that identifies call sites and propagates register usage information of...
LLVM_ABI FunctionPass * createPartiallyInlineLibCallsPass()
LLVM_ABI void initializeLibcallLoweringInfoWrapperPass(PassRegistry &)
LLVM_ABI char & MachineBlockPlacementID
MachineBlockPlacement - This pass places basic blocks based on branch probabilities.
LLVM_ABI char & TwoAddressInstructionPassID
TwoAddressInstruction - This pass reduces two-address instructions to use two operands.
LLVM_ABI MachineFunctionPass * createBasicBlockMatchingAndInferencePass()
createBasicBlockMatchingAndInferencePass - This pass enables matching and inference when using propel...
LLVM_ABI ModulePass * createCheckDebugMachineModuleLegacyPass()
Creates MIR Check Debug pass.
LLVM_ABI Pass * createCanonicalizeFreezeInLoopsPass()
LLVM_ABI char & LocalStackSlotAllocationID
LocalStackSlotAllocation - This pass assigns local frame indices to stack slots relative to one anoth...
LLVM_ABI char & BranchFolderPassID
BranchFolding - This pass performs machine code CFG based optimizations to delete branches to branche...
LLVM_ABI char & PHIEliminationID
PHIElimination - This pass eliminates machine instruction PHI nodes by inserting copy instructions.
LLVM_ABI Pass * createObjCARCContractPass()
LLVM_ABI ModulePass * createDebugifyMachineModulePass()
Creates MIR Debugify pass.
LLVM_ABI FunctionPass * createPrintFunctionPass(raw_ostream &OS, const std::string &Banner="")
Create and return a pass that prints functions to the specified raw_ostream as they are processed.
LLVM_ABI ModulePass * createWindowsSecureHotPatchingPass()
Creates Windows Secure Hot Patch pass.
LLVM_ABI FunctionPass * createCFIFixupLegacy()
Creates CFI Fixup pass.
LLVM_ABI char & RenameIndependentSubregsID
This pass detects subregister lanes in a virtual register that are used independently of other lanes ...
LLVM_ABI char & MachineLICMID
This pass performs loop invariant code motion on machine instructions.
LLVM_ABI char & MachineBlockPlacementStatsID
MachineBlockPlacementStats - This pass collects statistics about the basic block placement using bran...
LLVM_ABI MachineFunctionPass * createGCEmptyBasicBlocksLegacyPass()
createGCEmptyBasicblocksPass - Empty basic blocks (basic blocks without real code) appear as the resu...
LLVM_ABI char & LiveIntervalsID
LiveIntervals - This analysis keeps track of the live ranges of virtual and physical registers.
LLVM_ABI char & MachineCopyPropagationID
MachineCopyPropagation - This pass performs copy propagation on machine instructions.
LLVM_ABI char & DeadMachineInstructionElimID
DeadMachineInstructionElim - This pass removes dead machine instructions.
const void * AnalysisID
Definition Pass.h:51
LLVM_ABI void initializeCodeGen(PassRegistry &)
Initialize all passes linked into the CodeGen library.
Definition CodeGen.cpp:20
LLVM_ABI FunctionPass * createUnreachableBlockEliminationPass()
createUnreachableBlockEliminationPass - The LLVM code generator does not work well with unreachable b...
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
InsertedPass(AnalysisID TargetPassID, IdentifyingPassPtr InsertedPassID)
cl::boolOrDefault VerifyMachineCode
std::optional< bool > EnableIPRA
cl::boolOrDefault EnableGlobalISelOption
cl::boolOrDefault EnableFastISelOption
cl::boolOrDefault EnableRegAllocFastTied
cl::boolOrDefault DebugifyCheckAndStripAll
std::optional< GlobalISelAbortMode > EnableGlobalISelAbort
cl::boolOrDefault DebugifyAndStripAll
A utility class that uses RAII to save and restore the value of a variable.
The llvm::once_flag structure.
Definition Threading.h:67