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 "llvm/ADT/DenseMap.h"
17#include "llvm/ADT/StringRef.h"
28#include "llvm/CodeGen/Passes.h"
33#include "llvm/IR/Verifier.h"
35#include "llvm/MC/MCAsmInfo.h"
37#include "llvm/Pass.h"
41#include "llvm/Support/Debug.h"
53#include <cassert>
54#include <optional>
55#include <string>
56
57using namespace llvm;
58
59static cl::opt<bool>
60 EnableIPRA("enable-ipra", cl::init(false), cl::Hidden,
61 cl::desc("Enable interprocedural register allocation "
62 "to reduce load/store at procedure calls."));
64 cl::desc("Disable Post Regalloc Scheduler"));
65static cl::opt<bool> DisableBranchFold("disable-branch-fold", cl::Hidden,
66 cl::desc("Disable branch folding"));
67static cl::opt<bool> DisableTailDuplicate("disable-tail-duplicate", cl::Hidden,
68 cl::desc("Disable tail duplication"));
69static cl::opt<bool> DisableEarlyTailDup("disable-early-taildup", cl::Hidden,
70 cl::desc("Disable pre-register allocation tail duplication"));
71static cl::opt<bool> DisableBlockPlacement("disable-block-placement",
72 cl::Hidden, cl::desc("Disable probability-driven block placement"));
73static cl::opt<bool> EnableBlockPlacementStats("enable-block-placement-stats",
74 cl::Hidden, cl::desc("Collect probability-driven block placement stats"));
75static cl::opt<bool> DisableSSC("disable-ssc", cl::Hidden,
76 cl::desc("Disable Stack Slot Coloring"));
77static cl::opt<bool> DisableMachineDCE("disable-machine-dce", cl::Hidden,
78 cl::desc("Disable Machine Dead Code Elimination"));
80 cl::desc("Disable Early If-conversion"));
81static cl::opt<bool> DisableMachineLICM("disable-machine-licm", cl::Hidden,
82 cl::desc("Disable Machine LICM"));
83static cl::opt<bool> DisableMachineCSE("disable-machine-cse", cl::Hidden,
84 cl::desc("Disable Machine Common Subexpression Elimination"));
85static cl::opt<bool> DisablePostRAMachineLICM("disable-postra-machine-licm",
87 cl::desc("Disable Machine LICM"));
88static cl::opt<bool> DisableMachineSink("disable-machine-sink", cl::Hidden,
89 cl::desc("Disable Machine Sinking"));
90static cl::opt<bool> DisablePostRAMachineSink("disable-postra-machine-sink",
92 cl::desc("Disable PostRA Machine Sinking"));
93static cl::opt<bool> DisableLSR("disable-lsr", cl::Hidden,
94 cl::desc("Disable Loop Strength Reduction Pass"));
95static cl::opt<bool> DisableConstantHoisting("disable-constant-hoisting",
96 cl::Hidden, cl::desc("Disable ConstantHoisting"));
97static cl::opt<bool> DisableCGP("disable-cgp", cl::Hidden,
98 cl::desc("Disable Codegen Prepare"));
99
100static cl::opt<bool>
101 TriggerCrash("codegen-pipeline-trigger-crash", cl::init(false), cl::Hidden,
102 cl::desc("Trigger crash in codegen pipeline"));
103
104namespace {
105class TriggerCrashFunctionLegacyPass : public FunctionPass {
106public:
107 static char ID;
108 TriggerCrashFunctionLegacyPass() : FunctionPass(ID) {}
109 bool runOnFunction(Function &F) override {
110 abort();
111 return false;
112 }
113 StringRef getPassName() const override { return "TriggerCrashFunctionPass"; }
114};
115} // namespace
116
117char TriggerCrashFunctionLegacyPass::ID = 0;
118
119static cl::opt<bool> DisableCopyProp("disable-copyprop", cl::Hidden,
120 cl::desc("Disable Copy Propagation pass"));
121static cl::opt<bool> DisablePartialLibcallInlining("disable-partial-libcall-inlining",
122 cl::Hidden, cl::desc("Disable Partial Libcall Inlining"));
124 "disable-atexit-based-global-dtor-lowering", cl::Hidden,
125 cl::desc("For MachO, disable atexit()-based global destructor lowering"));
127 "enable-implicit-null-checks",
128 cl::desc("Fold null checks into faulting memory operations"),
129 cl::init(false), cl::Hidden);
130static cl::opt<bool>
131 PrintISelInput("print-isel-input", cl::Hidden,
132 cl::desc("Print LLVM IR input to isel pass"));
134 PrintRegUsage("print-regusage", cl::Hidden,
135 cl::desc("Print register usage details collected for IPRA"));
137 VerifyMachineCode("verify-machineinstrs", cl::Hidden,
138 cl::desc("Verify generated machine code"));
140 DebugifyAndStripAll("debugify-and-strip-all-safe", cl::Hidden,
141 cl::desc("Debugify MIR before and Strip debug after "
142 "each pass except those known to be unsafe "
143 "when debug info is present"));
145 "debugify-check-and-strip-all-safe", cl::Hidden,
146 cl::desc(
147 "Debugify MIR before, by checking and stripping the debug info after, "
148 "each pass except those known to be unsafe when debug info is "
149 "present"));
150// Enable or disable the MachineOutliner.
152 "enable-machine-outliner", cl::desc("Enable the machine outliner"),
156 "Run on all functions guaranteed to be beneficial"),
157 clEnumValN(RunOutliner::OptimisticPGO, "optimistic-pgo",
158 "Outline cold code only. If a code block does not have "
159 "profile data, optimistically assume it is cold."),
160 clEnumValN(RunOutliner::ConservativePGO, "conservative-pgo",
161 "Outline cold code only. If a code block does not have "
162 "profile, data, conservatively assume it is hot."),
163 clEnumValN(RunOutliner::NeverOutline, "never", "Disable all outlining"),
164 // Sentinel value for unspecified option.
167 "enable-global-merge-func", cl::Hidden,
168 cl::desc("Enable global merge functions that are based on hash function"));
169// Disable the pass to fix unwind information. Whether the pass is included in
170// the pipeline is controlled via the target options, this option serves as
171// manual override.
172static cl::opt<bool> DisableCFIFixup("disable-cfi-fixup", cl::Hidden,
173 cl::desc("Disable the CFI fixup pass"));
174// Enable or disable FastISel. Both options are needed, because
175// FastISel is enabled by default with -fast, and we wish to be
176// able to enable or disable fast-isel independently from -O0.
179 cl::desc("Enable the \"fast\" instruction selector"));
180
182 "global-isel", cl::Hidden,
183 cl::desc("Enable the \"global\" instruction selector"));
184
185// FIXME: remove this after switching to NPM or GlobalISel, whichever gets there
186// first...
187static cl::opt<bool>
188 PrintAfterISel("print-after-isel", cl::init(false), cl::Hidden,
189 cl::desc("Print machine instrs after ISel"));
190
192 "global-isel-abort", cl::Hidden,
193 cl::desc("Enable abort calls when \"global\" instruction selection "
194 "fails to lower/select an instruction"),
196 clEnumValN(GlobalISelAbortMode::Disable, "0", "Disable the abort"),
197 clEnumValN(GlobalISelAbortMode::Enable, "1", "Enable the abort"),
199 "Disable the abort but emit a diagnostic on failure")));
200
201// Disable MIRProfileLoader before RegAlloc. This is for for debugging and
202// tuning purpose.
204 "disable-ra-fsprofile-loader", cl::init(false), cl::Hidden,
205 cl::desc("Disable MIRProfileLoader before RegAlloc"));
206// Disable MIRProfileLoader before BloackPlacement. This is for for debugging
207// and tuning purpose.
209 "disable-layout-fsprofile-loader", cl::init(false), cl::Hidden,
210 cl::desc("Disable MIRProfileLoader before BlockPlacement"));
211// Specify FSProfile file name.
213 FSProfileFile("fs-profile-file", cl::init(""), cl::value_desc("filename"),
214 cl::desc("Flow Sensitive profile file name."), cl::Hidden);
215// Specify Remapping file for FSProfile.
217 "fs-remapping-file", cl::init(""), cl::value_desc("filename"),
218 cl::desc("Flow Sensitive profile remapping file name."), cl::Hidden);
219
220// Temporary option to allow experimenting with MachineScheduler as a post-RA
221// scheduler. Targets can "properly" enable this with
222// substitutePass(&PostRASchedulerID, &PostMachineSchedulerID).
223// Targets can return true in targetSchedulesPostRAScheduling() and
224// insert a PostRA scheduling pass wherever it wants.
226 "misched-postra", cl::Hidden,
227 cl::desc(
228 "Run MachineScheduler post regalloc (independent of preRA sched)"));
229
230// Experimental option to run live interval analysis early.
231static cl::opt<bool> EarlyLiveIntervals("early-live-intervals", cl::Hidden,
232 cl::desc("Run live interval analysis earlier in the pipeline"));
233
235 "disable-replace-with-vec-lib", cl::Hidden,
236 cl::desc("Disable replace with vector math call pass"));
237
238/// Option names for limiting the codegen pipeline.
239/// Those are used in error reporting and we didn't want
240/// to duplicate their names all over the place.
241static const char StartAfterOptName[] = "start-after";
242static const char StartBeforeOptName[] = "start-before";
243static const char StopAfterOptName[] = "stop-after";
244static const char StopBeforeOptName[] = "stop-before";
245
248 cl::desc("Resume compilation after a specific pass"),
249 cl::value_desc("pass-name"), cl::init(""), cl::Hidden);
250
253 cl::desc("Resume compilation before a specific pass"),
254 cl::value_desc("pass-name"), cl::init(""), cl::Hidden);
255
258 cl::desc("Stop compilation after a specific pass"),
259 cl::value_desc("pass-name"), cl::init(""), cl::Hidden);
260
263 cl::desc("Stop compilation before a specific pass"),
264 cl::value_desc("pass-name"), cl::init(""), cl::Hidden);
265
266/// Enable the machine function splitter pass.
268 "enable-split-machine-functions", cl::Hidden,
269 cl::desc("Split out cold blocks from machine functions based on profile "
270 "information."));
271
272/// Disable the expand reductions pass for testing.
274 "disable-expand-reductions", cl::init(false), cl::Hidden,
275 cl::desc("Disable the expand reduction intrinsics pass from running"));
276
277/// Disable the select optimization pass.
279 "disable-select-optimize", cl::init(true), cl::Hidden,
280 cl::desc("Disable the select-optimization pass from running"));
281
282/// Enable garbage-collecting empty basic blocks.
284 "enable-gc-empty-basic-blocks", cl::init(false), cl::Hidden,
285 cl::desc("Enable garbage-collecting empty basic blocks"));
286
287static cl::opt<bool>
288 SplitStaticData("split-static-data", cl::Hidden, cl::init(false),
289 cl::desc("Split static data sections into hot and cold "
290 "sections using profile information"));
291
292/// Enable matching and inference when using propeller.
294 "basic-block-section-match-infer",
295 cl::desc(
296 "Enable matching and inference when generating basic block sections"),
297 cl::init(false), cl::Optional);
298
300 "emit-bb-hash",
301 cl::desc(
302 "Emit the hash of basic block in the SHT_LLVM_BB_ADDR_MAP section."),
303 cl::init(false), cl::Optional);
304
305/// Allow standard passes to be disabled by command line options. This supports
306/// simple binary flags that either suppress the pass or do nothing.
307/// i.e. -disable-mypass=false has no effect.
308/// These should be converted to boolOrDefault in order to use applyOverride.
310 bool Override) {
311 if (Override)
312 return IdentifyingPassPtr();
313 return PassID;
314}
315
316/// Allow standard passes to be disabled by the command line, regardless of who
317/// is adding the pass.
318///
319/// StandardID is the pass identified in the standard pass pipeline and provided
320/// to addPass(). It may be a target-specific ID in the case that the target
321/// directly adds its own pass, but in that case we harmlessly fall through.
322///
323/// TargetID is the pass that the target has configured to override StandardID.
324///
325/// StandardID may be a pseudo ID. In that case TargetID is the name of the real
326/// pass to run. This allows multiple options to control a single pass depending
327/// on where in the pipeline that pass is added.
329 IdentifyingPassPtr TargetID) {
330 if (StandardID == &PostRASchedulerID)
331 return applyDisable(TargetID, DisablePostRASched);
332
333 if (StandardID == &BranchFolderPassID)
334 return applyDisable(TargetID, DisableBranchFold);
335
336 if (StandardID == &TailDuplicateLegacyID)
337 return applyDisable(TargetID, DisableTailDuplicate);
338
339 if (StandardID == &EarlyTailDuplicateLegacyID)
340 return applyDisable(TargetID, DisableEarlyTailDup);
341
342 if (StandardID == &MachineBlockPlacementID)
343 return applyDisable(TargetID, DisableBlockPlacement);
344
345 if (StandardID == &StackSlotColoringID)
346 return applyDisable(TargetID, DisableSSC);
347
348 if (StandardID == &DeadMachineInstructionElimID)
349 return applyDisable(TargetID, DisableMachineDCE);
350
351 if (StandardID == &EarlyIfConverterLegacyID)
352 return applyDisable(TargetID, DisableEarlyIfConversion);
353
354 if (StandardID == &EarlyMachineLICMID)
355 return applyDisable(TargetID, DisableMachineLICM);
356
357 if (StandardID == &MachineCSELegacyID)
358 return applyDisable(TargetID, DisableMachineCSE);
359
360 if (StandardID == &MachineLICMID)
361 return applyDisable(TargetID, DisablePostRAMachineLICM);
362
363 if (StandardID == &MachineSinkingLegacyID)
364 return applyDisable(TargetID, DisableMachineSink);
365
366 if (StandardID == &PostRAMachineSinkingID)
367 return applyDisable(TargetID, DisablePostRAMachineSink);
368
369 if (StandardID == &MachineCopyPropagationID)
370 return applyDisable(TargetID, DisableCopyProp);
371
372 return TargetID;
373}
374
375// Find the FSProfile file name. The internal option takes the precedence
376// before getting from TargetMachine.
377static std::string getFSProfileFile(const TargetMachine *TM) {
378 if (!FSProfileFile.empty())
379 return FSProfileFile.getValue();
380 const std::optional<PGOOptions> &PGOOpt = TM->getPGOOption();
381 if (PGOOpt == std::nullopt || PGOOpt->Action != PGOOptions::SampleUse)
382 return std::string();
383 return PGOOpt->ProfileFile;
384}
385
386// Find the Profile remapping file name. The internal option takes the
387// precedence before getting from TargetMachine.
388static std::string getFSRemappingFile(const TargetMachine *TM) {
389 if (!FSRemappingFile.empty())
390 return FSRemappingFile.getValue();
391 const std::optional<PGOOptions> &PGOOpt = TM->getPGOOption();
392 if (PGOOpt == std::nullopt || PGOOpt->Action != PGOOptions::SampleUse)
393 return std::string();
394 return PGOOpt->ProfileRemappingFile;
395}
396
397//===---------------------------------------------------------------------===//
398/// TargetPassConfig
399//===---------------------------------------------------------------------===//
400
401INITIALIZE_PASS(TargetPassConfig, "targetpassconfig",
402 "Target Pass Configuration", false, false)
403char TargetPassConfig::ID = 0;
404
405namespace {
406
410
413
415 assert(InsertedPassID.isValid() && "Illegal Pass ID!");
416 if (InsertedPassID.isInstance())
417 return InsertedPassID.getInstance();
418 Pass *NP = Pass::createPass(InsertedPassID.getID());
419 assert(NP && "Pass ID not registered");
420 return NP;
421 }
422};
423
424} // end anonymous namespace
425
426namespace llvm {
427
429public:
430 // List of passes explicitly substituted by this target. Normally this is
431 // empty, but it is a convenient way to suppress or replace specific passes
432 // that are part of a standard pass pipeline without overridding the entire
433 // pipeline. This mechanism allows target options to inherit a standard pass's
434 // user interface. For example, a target may disable a standard pass by
435 // default by substituting a pass ID of zero, and the user may still enable
436 // that standard pass with an explicit command line option.
438
439 /// Store the pairs of <AnalysisID, AnalysisID> of which the second pass
440 /// is inserted after each instance of the first one.
442};
443
444} // end namespace llvm
445
446// Out of line virtual method.
450
452 if (PassName.empty())
453 return nullptr;
454
456 const PassInfo *PI = PR.getPassInfo(PassName);
457 if (!PI)
459 Twine("\" pass is not registered."));
460 return PI;
461}
462
464 const PassInfo *PI = getPassInfo(PassName);
465 return PI ? PI->getTypeInfo() : nullptr;
466}
467
468static std::pair<StringRef, unsigned>
470 StringRef Name, InstanceNumStr;
471 std::tie(Name, InstanceNumStr) = PassName.split(',');
472
473 unsigned InstanceNum = 0;
474 if (!InstanceNumStr.empty() && InstanceNumStr.getAsInteger(10, InstanceNum))
475 reportFatalUsageError("invalid pass instance specifier " + PassName);
476
477 return std::make_pair(Name, InstanceNum);
478}
479
480void TargetPassConfig::setStartStopPasses() {
481 StringRef StartBeforeName;
482 std::tie(StartBeforeName, StartBeforeInstanceNum) =
484
485 StringRef StartAfterName;
486 std::tie(StartAfterName, StartAfterInstanceNum) =
488
489 StringRef StopBeforeName;
490 std::tie(StopBeforeName, StopBeforeInstanceNum)
492
493 StringRef StopAfterName;
494 std::tie(StopAfterName, StopAfterInstanceNum)
496
497 StartBefore = getPassIDFromName(StartBeforeName);
498 StartAfter = getPassIDFromName(StartAfterName);
499 StopBefore = getPassIDFromName(StopBeforeName);
500 StopAfter = getPassIDFromName(StopAfterName);
501 if (StartBefore && StartAfter)
502 reportFatalUsageError(Twine(StartBeforeOptName) + Twine(" and ") +
503 Twine(StartAfterOptName) + Twine(" specified!"));
504 if (StopBefore && StopAfter)
505 reportFatalUsageError(Twine(StopBeforeOptName) + Twine(" and ") +
506 Twine(StopAfterOptName) + Twine(" specified!"));
507 Started = (StartAfter == nullptr) && (StartBefore == nullptr);
508}
509
551
579
582 auto [StartBefore, StartBeforeInstanceNum] =
584 auto [StartAfter, StartAfterInstanceNum] =
586 auto [StopBefore, StopBeforeInstanceNum] =
588 auto [StopAfter, StopAfterInstanceNum] =
590
591 if (!StartBefore.empty() && !StartAfter.empty())
593 Twine(StartBeforeOptName) + " and " + StartAfterOptName + " specified!",
594 std::make_error_code(std::errc::invalid_argument));
595 if (!StopBefore.empty() && !StopAfter.empty())
597 Twine(StopBeforeOptName) + " and " + StopAfterOptName + " specified!",
598 std::make_error_code(std::errc::invalid_argument));
599
600 StartStopInfo Result;
601 Result.StartPass = StartBefore.empty() ? StartAfter : StartBefore;
602 Result.StopPass = StopBefore.empty() ? StopAfter : StopBefore;
603 Result.StartInstanceNum =
604 StartBefore.empty() ? StartAfterInstanceNum : StartBeforeInstanceNum;
605 Result.StopInstanceNum =
606 StopBefore.empty() ? StopAfterInstanceNum : StopBeforeInstanceNum;
607 Result.StartAfter = !StartAfter.empty();
608 Result.StopAfter = !StopAfter.empty();
609 Result.StartInstanceNum += Result.StartInstanceNum == 0;
610 Result.StopInstanceNum += Result.StopInstanceNum == 0;
611 return Result;
612}
613
614// Out of line constructor provides default values for pass options and
615// registers all common codegen passes.
617 : ImmutablePass(ID), PM(&PM), TM(&TM) {
618 Impl = new PassConfigImpl();
619
621 // Register all target independent codegen passes to activate their PassIDs,
622 // including this pass itself.
624
626
627 // Also register alias analysis passes required by codegen passes.
630
631 if (EnableIPRA.getNumOccurrences()) {
632 TM.Options.EnableIPRA = EnableIPRA;
633 } else {
634 // If not explicitly specified, use target default.
635 TM.Options.EnableIPRA |= TM.useIPRA();
636 }
637
638 if (TM.Options.EnableIPRA)
640
641 if (EnableGlobalISelAbort.getNumOccurrences())
642 TM.Options.GlobalISelAbort = EnableGlobalISelAbort;
643
644 setStartStopPasses();
645}
646
648 return TM->getOptLevel();
649}
650
651/// Insert InsertedPassID pass after TargetPassID.
653 IdentifyingPassPtr InsertedPassID) {
654 assert(((!InsertedPassID.isInstance() &&
655 TargetPassID != InsertedPassID.getID()) ||
656 (InsertedPassID.isInstance() &&
657 TargetPassID != InsertedPassID.getInstance()->getPassID())) &&
658 "Insert a pass after itself!");
659 Impl->InsertedPasses.emplace_back(TargetPassID, InsertedPassID);
660}
661
662/// createPassConfig - Create a pass configuration object to be used by
663/// addPassToEmitX methods for generating a pipeline of CodeGen passes.
664///
665/// Targets may override this to extend TargetPassConfig.
670
672 : ImmutablePass(ID) {
673 reportFatalUsageError("trying to construct TargetPassConfig without a target "
674 "machine. Scheduling a CodeGen pass without a target "
675 "triple set?");
676}
677
681
686
689 return std::string();
690 std::string Res;
691 static cl::opt<std::string> *PassNames[] = {&StartAfterOpt, &StartBeforeOpt,
693 static const char *OptNames[] = {StartAfterOptName, StartBeforeOptName,
695 bool IsFirst = true;
696 for (int Idx = 0; Idx < 4; ++Idx)
697 if (!PassNames[Idx]->empty()) {
698 if (!IsFirst)
699 Res += " and ";
700 IsFirst = false;
701 Res += OptNames[Idx];
702 }
703 return Res;
704}
705
706// Helper to verify the analysis is really immutable.
707void TargetPassConfig::setOpt(bool &Opt, bool Val) {
708 assert(!Initialized && "PassConfig is immutable");
709 Opt = Val;
710}
711
713 IdentifyingPassPtr TargetID) {
714 Impl->TargetPasses[StandardID] = TargetID;
715}
716
719 I = Impl->TargetPasses.find(ID);
720 if (I == Impl->TargetPasses.end())
721 return ID;
722 return I->second;
723}
724
727 IdentifyingPassPtr FinalPtr = overridePass(ID, TargetID);
728 return !FinalPtr.isValid() || FinalPtr.isInstance() ||
729 FinalPtr.getID() != ID;
730}
731
732/// Add a pass to the PassManager if that pass is supposed to be run. If the
733/// Started/Stopped flags indicate either that the compilation should start at
734/// a later pass or that it should stop after an earlier pass, then do not add
735/// the pass. Finally, compare the current pass against the StartAfter
736/// and StopAfter options and change the Started/Stopped flags accordingly.
738 assert(!Initialized && "PassConfig is immutable");
739
740 // Cache the Pass ID here in case the pass manager finds this pass is
741 // redundant with ones already scheduled / available, and deletes it.
742 // Fundamentally, once we add the pass to the manager, we no longer own it
743 // and shouldn't reference it.
744 AnalysisID PassID = P->getPassID();
745
746 if (StartBefore == PassID && StartBeforeCount++ == StartBeforeInstanceNum)
747 Started = true;
748 if (StopBefore == PassID && StopBeforeCount++ == StopBeforeInstanceNum)
749 Stopped = true;
750 if (Started && !Stopped) {
751 if (AddingMachinePasses) {
752 // Construct banner message before PM->add() as that may delete the pass.
753 std::string Banner =
754 std::string("After ") + std::string(P->getPassName());
756 PM->add(P);
757 addMachinePostPasses(Banner);
758 } else {
759 PM->add(P);
760 }
761
762 // Add the passes after the pass P if there is any.
763 for (const auto &IP : Impl->InsertedPasses)
764 if (IP.TargetPassID == PassID)
765 addPass(IP.getInsertedPass());
766 } else {
767 delete P;
768 }
769
770 if (StopAfter == PassID && StopAfterCount++ == StopAfterInstanceNum)
771 Stopped = true;
772
773 if (StartAfter == PassID && StartAfterCount++ == StartAfterInstanceNum)
774 Started = true;
775 if (Stopped && !Started)
776 reportFatalUsageError("Cannot stop compilation after pass that is not run");
777}
778
779/// Add a CodeGen pass at this point in the pipeline after checking for target
780/// and command line overrides.
781///
782/// addPass cannot return a pointer to the pass instance because is internal the
783/// PassManager and the instance we create here may already be freed.
785 IdentifyingPassPtr TargetID = getPassSubstitution(PassID);
786 IdentifyingPassPtr FinalPtr = overridePass(PassID, TargetID);
787 if (!FinalPtr.isValid())
788 return nullptr;
789
790 Pass *P;
791 if (FinalPtr.isInstance())
792 P = FinalPtr.getInstance();
793 else {
794 P = Pass::createPass(FinalPtr.getID());
795 if (!P)
796 llvm_unreachable("Pass ID not registered");
797 }
798 AnalysisID FinalID = P->getPassID();
799 addPass(P); // Ends the lifetime of P.
800
801 return FinalID;
802}
803
804void TargetPassConfig::printAndVerify(const std::string &Banner) {
805 addPrintPass(Banner);
806 addVerifyPass(Banner);
807}
808
809void TargetPassConfig::addPrintPass(const std::string &Banner) {
810 if (PrintAfterISel)
811 PM->add(createMachineFunctionPrinterPass(dbgs(), Banner));
812}
813
814void TargetPassConfig::addVerifyPass(const std::string &Banner) {
816#ifdef EXPENSIVE_CHECKS
818 Verify = TM->isMachineVerifierClean();
819#endif
820 if (Verify)
821 PM->add(createMachineVerifierPass(Banner));
822}
823
827
829 PM->add(createStripDebugMachineModuleLegacyPass(/*OnlyDebugified=*/true));
830}
831
835
837 if (AllowDebugify && DebugifyIsSafe &&
841}
842
843void TargetPassConfig::addMachinePostPasses(const std::string &Banner) {
844 if (DebugifyIsSafe) {
850 }
851 addVerifyPass(Banner);
852}
853
854/// Add common target configurable passes that perform LLVM IR to IR transforms
855/// following machine independent optimization.
857 // Before running any passes, run the verifier to determine if the input
858 // coming from the front-end and/or optimizer is valid.
859 if (!DisableVerify)
861
863 // Basic AliasAnalysis support.
864 // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that
865 // BasicAliasAnalysis wins if they disagree. This is intended to help
866 // support "obvious" type-punning idioms.
870
871 // Run loop strength reduction before anything else.
872 if (!DisableLSR) {
877 }
878 }
879
880 // Run GC lowering passes for builtin collectors
881 // TODO: add a pass insertion point here
884
885 // For MachO, lower @llvm.global_dtors into @llvm.global_ctors with
886 // __cxa_atexit() calls to avoid emitting the deprecated __mod_term_func.
887 if (TM->getTargetTriple().isOSBinFormatMachO() &&
890
891 // Make sure that no unreachable blocks are instruction selected.
893
894 // Prepare expensive constants for SelectionDAG.
897
900
903
904 // Instrument function entry after all inlining.
906
907 // Add scalarization of target's unsupported masked memory intrinsics pass.
908 // the unsupported intrinsic will be replaced with a chain of basic blocks,
909 // that stores/loads element one-by-one if the appropriate mask bit is set.
911
912 // Expand reduction intrinsics into shuffle sequences if the target wants to.
913 // Allow disabling it for testing purposes.
916
917 // Convert conditional moves to conditional jumps when profitable.
920
923
924 if (TM->getTargetTriple().isOSWindows())
926}
927
928/// Turn exception handling constructs into something the code generators can
929/// handle.
931 const MCAsmInfo &MCAI = TM->getMCAsmInfo();
932 switch (MCAI.getExceptionHandlingType()) {
934 // SjLj piggy-backs on dwarf for this bit. The cleanups done apply to both
935 // Dwarf EH prepare needs to be run after SjLj prepare. Otherwise,
936 // catch info can get misplaced when a selector ends up more than one block
937 // removed from the parent invoke(s). This could happen when a landing
938 // pad is shared by multiple invokes and is also a target of a normal
939 // edge from elsewhere.
941 [[fallthrough]];
947 break;
949 // We support using both GCC-style and MSVC-style exceptions on Windows, so
950 // add both preparation passes. Each pass will only actually run if it
951 // recognizes the personality function.
954 break;
956 // Wasm EH uses Windows EH instructions, but it does not need to demote PHIs
957 // on catchpads and cleanuppads because it does not outline them into
958 // funclets. Catchswitch blocks are not lowered in SelectionDAG, so we
959 // should remove PHIs there.
960 addPass(createWinEHPass(/*DemoteCatchSwitchPHIOnly=*/true));
962 break;
965
966 // The lower invoke pass may create unreachable code. Remove it.
968 break;
969 }
970}
971
972/// Add pass to prepare the LLVM IR for code generation. This should be done
973/// before exception handling preparation passes.
978
979/// Add common passes that perform LLVM IR to IR transforms in preparation for
980/// instruction selection.
982 addPreISel();
983
984 // Force codegen to run according to the callgraph.
987
989
990 // Add both the safe stack and the stack protection passes: each of them will
991 // only protect functions that have corresponding attributes.
994
995 if (PrintISelInput)
997 dbgs(), "\n\n*** Final LLVM Code input to ISel ***\n"));
998
999 // All passes which modify the LLVM IR are now complete; run the verifier
1000 // to ensure that the IR is valid.
1001 if (!DisableVerify)
1003}
1004
1006 // Enable FastISel with -fast-isel, but allow that to be overridden.
1008
1009 // Determine an instruction selector.
1010 enum class SelectorType { SelectionDAG, FastISel, GlobalISel };
1011 SelectorType Selector;
1012
1014 Selector = SelectorType::FastISel;
1016 (TM->Options.EnableGlobalISel &&
1018 Selector = SelectorType::GlobalISel;
1019 else if (TM->getOptLevel() == CodeGenOptLevel::None &&
1020 TM->getO0WantsFastISel())
1021 Selector = SelectorType::FastISel;
1022 else
1023 Selector = SelectorType::SelectionDAG;
1024
1025 // Set consistently TM->Options.EnableFastISel and EnableGlobalISel.
1026 if (Selector == SelectorType::FastISel) {
1027 TM->setFastISel(true);
1028 TM->setGlobalISel(false);
1029 } else if (Selector == SelectorType::GlobalISel) {
1030 TM->setFastISel(false);
1031 TM->setGlobalISel(true);
1032 }
1033
1034 // FIXME: Injecting into the DAGISel pipeline seems to cause issues with
1035 // analyses needing to be re-run. This can result in being unable to
1036 // schedule passes (particularly with 'Function Alias Analysis
1037 // Results'). It's not entirely clear why but AFAICT this seems to be
1038 // due to one FunctionPassManager not being able to use analyses from a
1039 // previous one. As we're injecting a ModulePass we break the usual
1040 // pass manager into two. GlobalISel with the fallback path disabled
1041 // and -run-pass seem to be unaffected. The majority of GlobalISel
1042 // testing uses -run-pass so this probably isn't too bad.
1043 SaveAndRestore SavedDebugifyIsSafe(DebugifyIsSafe);
1044 if (Selector != SelectorType::GlobalISel || !isGlobalISelAbortEnabled())
1045 DebugifyIsSafe = false;
1046
1047 // Add instruction selector passes for global isel if enabled.
1048 if (Selector == SelectorType::GlobalISel) {
1049 SaveAndRestore SavedAddingMachinePasses(AddingMachinePasses, true);
1050 if (addIRTranslator())
1051 return true;
1052
1054
1056 return true;
1057
1058 // Before running the register bank selector, ask the target if it
1059 // wants to run some passes.
1061
1062 if (addRegBankSelect())
1063 return true;
1064
1066
1068 return true;
1069 }
1070
1071 // Pass to reset the MachineFunction if the ISel failed. Outside of the above
1072 // if so that the verifier is not added to it.
1073 if (Selector == SelectorType::GlobalISel)
1076
1077 // Run the SDAG InstSelector, providing a fallback path when we do not want to
1078 // abort on not-yet-supported input.
1079 if (Selector != SelectorType::GlobalISel || !isGlobalISelAbortEnabled())
1080 if (addInstSelector())
1081 return true;
1082
1083 // Expand pseudo-instructions emitted by ISel. Don't run the verifier before
1084 // FinalizeISel.
1086
1087 // Print the instruction selected machine code...
1088 printAndVerify("After Instruction Selection");
1089
1090 return false;
1091}
1092
1094 if (TM->useEmulatedTLS())
1096
1097 PM->add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis()));
1098 // ObjCARCContract operates on ObjC intrinsics and must run before
1099 // PreISelIntrinsicLowering.
1104 addIRPasses();
1105
1106 if (TriggerCrash)
1107 addPass(new TriggerCrashFunctionLegacyPass());
1108
1112
1113 return addCoreISelPasses();
1114}
1115
1116/// -regalloc=... command line option.
1117static FunctionPass *useDefaultRegisterAllocator() { return nullptr; }
1121 cl::desc("Register allocator to use"));
1122
1123/// Add the complete set of target-independent postISel code generator passes.
1124///
1125/// This can be read as the standard order of major LLVM CodeGen stages. Stages
1126/// with nontrivial configuration or multiple passes are broken out below in
1127/// add%Stage routines.
1128///
1129/// Any TargetPassConfig::addXX routine may be overriden by the Target. The
1130/// addPre/Post methods with empty header implementations allow injecting
1131/// target-specific fixups just before or after major stages. Additionally,
1132/// targets have the flexibility to change pass order within a stage by
1133/// overriding default implementation of add%Stage routines below. Each
1134/// technique has maintainability tradeoffs because alternate pass orders are
1135/// not well supported. addPre/Post works better if the target pass is easily
1136/// tied to a common pass. But if it has subtle dependencies on multiple passes,
1137/// the target should override the stage instead.
1138///
1139/// TODO: We could use a single addPre/Post(ID) hook to allow pass injection
1140/// before/after any target-independent pass. But it's currently overkill.
1142 AddingMachinePasses = true;
1143
1144 // Add passes that optimize machine instructions in SSA form.
1147 } else {
1148 // If the target requests it, assign local variables to stack slots relative
1149 // to one another and simplify frame index references where possible.
1151 }
1152
1153 if (TM->Options.EnableIPRA)
1155
1156 // Run pre-ra passes.
1158
1159 // Debugifying the register allocator passes seems to provoke some
1160 // non-determinism that affects CodeGen and there doesn't seem to be a point
1161 // where it becomes safe again so stop debugifying here.
1162 DebugifyIsSafe = false;
1163
1164 // Add a FSDiscriminator pass right before RA, so that we could get
1165 // more precise SampleFDO profile for RA.
1169 const std::string ProfileFile = getFSProfileFile(TM);
1170 if (!ProfileFile.empty() && !DisableRAFSProfileLoader)
1173 nullptr));
1174 }
1175
1176 // Run register allocation and passes that are tightly coupled with it,
1177 // including phi elimination and scheduling.
1178 if (getOptimizeRegAlloc())
1180 else
1182
1183 // Run post-ra passes.
1185
1187
1189
1190 // Insert prolog/epilog code. Eliminate abstract frame index references...
1194 }
1195
1196 // Prolog/Epilog inserter needs a TargetMachine to instantiate. But only
1197 // do so if it hasn't been disabled, substituted, or overridden.
1200
1201 /// Add passes that optimize machine instructions after register allocation.
1204
1205 // Expand pseudo instructions before second scheduling pass.
1207
1208 // Run pre-sched2 passes.
1209 addPreSched2();
1210
1213
1214 // Second pass scheduler.
1215 // Let Target optionally insert this pass by itself at some other
1216 // point.
1218 !TM->targetSchedulesPostRAScheduling()) {
1219 if (MISchedPostRA)
1221 else
1223 }
1224
1225 // GC
1226 addGCPasses();
1227
1228 // Basic block placement.
1231
1232 // Insert before XRay Instrumentation.
1234
1237
1239
1240 if (TM->Options.EnableIPRA)
1241 // Collect register usage information and produce a register mask of
1242 // clobbered registers, to be used to optimize call sites.
1244
1245 // FIXME: Some backends are incompatible with running the verifier after
1246 // addPreEmitPass. Maybe only pass "false" here for those targets?
1248
1253
1254 if (TM->Options.EnableMachineOutliner &&
1258 TM->Options.SupportsDefaultOutlining)
1260 }
1261
1264
1268
1269 if (TM->Options.EnableMachineFunctionSplitter ||
1271 TM->Options.EnableStaticDataPartitioning) {
1272 const std::string ProfileFile = getFSProfileFile(TM);
1273 if (!ProfileFile.empty()) {
1276 ProfileFile, getFSRemappingFile(TM),
1278 } else {
1279 // Sample profile is given, but FSDiscriminator is not
1280 // enabled, this may result in performance regression.
1282 << "Using AutoFDO without FSDiscriminator for MFS may regress "
1283 "performance.\n";
1284 }
1285 }
1286 }
1287
1288 // Machine function splitter uses the basic block sections feature.
1289 // When used along with `-basic-block-sections=`, the basic-block-sections
1290 // feature takes precedence. This means functions eligible for
1291 // basic-block-sections optimizations (`=all`, or `=list=` with function
1292 // included in the list profile) will get that optimization instead.
1293 if (TM->Options.EnableMachineFunctionSplitter ||
1296
1297 if (SplitStaticData || TM->Options.EnableStaticDataPartitioning) {
1298 // The static data splitter pass is a machine function pass. and
1299 // static data annotator pass is a module-wide pass. See the file comment
1300 // in StaticDataAnnotator.cpp for the motivation.
1303 }
1304 // We run the BasicBlockSections pass if either we need BB sections or BB
1305 // address map (or both).
1306 if (TM->getBBSectionsType() != llvm::BasicBlockSection::None ||
1307 TM->Options.BBAddrMap) {
1310 if (TM->getBBSectionsType() == llvm::BasicBlockSection::List) {
1312 TM->getBBSectionsFuncListBuf()));
1315 else {
1318 }
1319 }
1321 }
1322
1324
1325 if (!DisableCFIFixup && TM->Options.EnableCFIFixup)
1327
1329
1330 // Add passes that directly emit MI after all other MI passes.
1332
1333 AddingMachinePasses = false;
1334}
1335
1336/// Add passes that optimize machine instructions in SSA form.
1338 // Pre-ra tail duplication.
1340
1341 // Optimize PHIs before DCE: removing dead PHI cycles may make more
1342 // instructions dead.
1344
1345 // This pass merges large allocas. StackSlotColoring is a different pass
1346 // which merges spill slots.
1348
1349 // If the target requests it, assign local variables to stack slots relative
1350 // to one another and simplify frame index references where possible.
1352
1353 // With optimization, dead code should already be eliminated. However
1354 // there is one known exception: lowered code for arguments that are only
1355 // used by tail calls, where the tail calls reuse the incoming stack
1356 // arguments directly (see t11 in test/CodeGen/X86/sibcall.ll).
1358
1359 // Allow targets to insert passes that improve instruction level parallelism,
1360 // like if-conversion. Such passes will typically need dominator trees and
1361 // loop info, just like LICM and CSE below.
1362 addILPOpts();
1363
1366
1368
1370 // Clean-up the dead code that may have been generated by peephole
1371 // rewriting.
1373}
1374
1375//===---------------------------------------------------------------------===//
1376/// Register Allocation Pass Configuration
1377//===---------------------------------------------------------------------===//
1378
1379/// A dummy default pass factory indicates whether the register allocator is
1380/// overridden on the command line.
1382
1383static RegisterRegAlloc
1385 "pick register allocator based on -O option",
1387
1392
1394 // An explicit -regalloc choice implies its pipeline: only the fast
1395 // allocator uses the unoptimized one.
1400 return Ctor !=
1403}
1404
1405/// Instantiate the default register allocator pass for this target for either
1406/// the optimized or unoptimized allocation path. This will be added to the pass
1407/// manager by addFastRegAlloc in the unoptimized case or addOptimizedRegAlloc
1408/// in the optimized case.
1409///
1410/// A target that uses the standard regalloc pass order for fast or optimized
1411/// allocation may still override this for per-target regalloc
1412/// selection. But -regalloc=... always takes precedence.
1414 if (Optimized)
1416 else
1418}
1419
1420/// Find and instantiate the register allocation pass requested by this target
1421/// at the current optimization level. Different register allocators are
1422/// defined as separate passes because they may require different analysis.
1423///
1424/// This helper ensures that the regalloc= option is always available,
1425/// even for targets that override the default allocator.
1426///
1427/// FIXME: When MachinePassRegistry register pass IDs instead of function ptrs,
1428/// this can be folded into addPass.
1430 // getOptimizeRegAlloc, called before the pipeline branches, has initialized
1431 // the global default.
1433 if (Ctor != useDefaultRegisterAllocator)
1434 return Ctor();
1435
1436 // With no -regalloc= override, ask the target for a regalloc pass.
1437 return createTargetRegisterAllocator(Optimized);
1438}
1439
1444
1449 "Must use fast (default) register allocator for unoptimized regalloc.");
1450
1452
1453 // Allow targets to change the register assignments after
1454 // fast register allocation.
1456 return true;
1457}
1458
1460 // Add the selected register allocation pass.
1462
1463 // Allow targets to change the register assignments before rewriting.
1464 addPreRewrite();
1465
1466 // Finally rewrite virtual registers.
1468
1469 // Regalloc scoring for ML-driven eviction - noop except when learning a new
1470 // eviction policy.
1472 return true;
1473}
1474
1475/// Return true if the default global register allocator is in use and
1476/// has not be overriden on the command line with '-regalloc=...'
1478 return RegAlloc.getNumOccurrences() == 0;
1479}
1480
1481/// Add the minimum set of target-independent passes that are required for
1482/// register allocation. No coalescing or scheduling.
1489
1490/// Add standard target-independent passes that are tightly coupled with
1491/// optimized register allocation, including coalescing, machine instruction
1492/// scheduling, and register allocation itself.
1495
1497
1499
1500 // LiveVariables currently requires pure SSA form.
1501 //
1502 // FIXME: Once TwoAddressInstruction pass no longer uses kill flags,
1503 // LiveVariables can be removed completely, and LiveIntervals can be directly
1504 // computed. (We still either need to regenerate kill flags after regalloc, or
1505 // preferably fix the scavenger to not depend on them).
1506 // FIXME: UnreachableMachineBlockElim is a dependant pass of LiveVariables.
1507 // When LiveVariables is removed this has to be removed/moved either.
1508 // Explicit addition of UnreachableMachineBlockElim allows stopping before or
1509 // after it with -stop-before/-stop-after.
1512
1513 // Edge splitting is smarter with machine loop info.
1516
1517 // Eventually, we want to run LiveIntervals before PHI elimination.
1520
1523
1524 // The machine scheduler may accidentally create disconnected components
1525 // when moving subregister definitions around, avoid this by splitting them to
1526 // separate vregs before. Splitting can also improve reg. allocation quality.
1528
1529 // PreRA instruction scheduling.
1531
1533 // Perform stack slot coloring and post-ra machine LICM.
1535
1536 // Allow targets to expand pseudo instructions depending on the choice of
1537 // registers before MachineCopyPropagation.
1539
1540 // Copy propagate to forward register uses and try to eliminate COPYs that
1541 // were not coalesced.
1543
1544 // Run post-ra machine LICM to hoist reloads / remats.
1545 //
1546 // FIXME: can this move into MachineLateOptimization?
1548 }
1549}
1550
1551//===---------------------------------------------------------------------===//
1552/// Post RegAlloc Pass Configuration
1553//===---------------------------------------------------------------------===//
1554
1555/// Add passes that optimize machine instructions after register allocation.
1557 // Cleanup of redundant immediate/address loads.
1559
1560 // Branch folding must be run after regalloc and prolog/epilog insertion.
1562
1563 // Tail duplication.
1564 // Note that duplicating tail just increases code size and degrades
1565 // performance for targets that require Structured Control Flow.
1566 // In addition it can also make CFG irreducible. Thus we disable it.
1567 if (!TM->requiresStructuredCFG())
1569
1570 // Copy propagation.
1572}
1573
1574/// Add standard GC passes.
1577 return true;
1578}
1579
1580/// Add standard basic block placement passes.
1585 const std::string ProfileFile = getFSProfileFile(TM);
1586 if (!ProfileFile.empty() && !DisableLayoutFSProfileLoader)
1589 nullptr));
1590 }
1592 // Run a separate pass to collect block placement statistics.
1595 }
1596}
1597
1598//===---------------------------------------------------------------------===//
1599/// GlobalISel Configuration
1600//===---------------------------------------------------------------------===//
1602 return TM->Options.GlobalISelAbort == GlobalISelAbortMode::Enable;
1603}
1604
1608
1609std::unique_ptr<CSEConfigBase> TargetPassConfig::getCSEConfig() const {
1610 return std::make_unique<CSEConfigBase>();
1611}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
cl::opt< bool > EmitBBHash
This is the interface for LLVM's primary stateless and local alias analysis.
#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
cl::opt< bool > PrintRegUsage
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 cl::opt< bool > DisableExpandReductions("disable-expand-reductions", cl::init(false), cl::Hidden, cl::desc("Disable the expand reduction intrinsics pass from running"))
Disable the expand reductions pass for testing.
static cl::opt< bool > EnableImplicitNullChecks("enable-implicit-null-checks", cl::desc("Fold null checks into faulting memory operations"), cl::init(false), cl::Hidden)
static cl::opt< bool > DisableMachineSink("disable-machine-sink", cl::Hidden, cl::desc("Disable Machine Sinking"))
static cl::opt< cl::boolOrDefault > DebugifyAndStripAll("debugify-and-strip-all-safe", cl::Hidden, cl::desc("Debugify MIR before and Strip debug after " "each pass except those known to be unsafe " "when debug info is present"))
static llvm::once_flag InitializeDefaultRegisterAllocatorFlag
Register Allocation Pass Configuration.
static cl::opt< bool > DisableAtExitBasedGlobalDtorLowering("disable-atexit-based-global-dtor-lowering", cl::Hidden, cl::desc("For MachO, disable atexit()-based global destructor lowering"))
static cl::opt< RegisterRegAlloc::FunctionPassCtor, false, RegisterPassParser< RegisterRegAlloc > > RegAlloc("regalloc", cl::Hidden, cl::init(&useDefaultRegisterAllocator), cl::desc("Register allocator to use"))
static cl::opt< bool > PrintISelInput("print-isel-input", cl::Hidden, cl::desc("Print LLVM IR input to isel pass"))
static FunctionPass * useDefaultRegisterAllocator()
-regalloc=... command line option.
static cl::opt< bool > DisablePostRASched("disable-post-ra", cl::Hidden, cl::desc("Disable Post Regalloc Scheduler"))
static cl::opt< bool > EnableBlockPlacementStats("enable-block-placement-stats", cl::Hidden, cl::desc("Collect probability-driven block placement stats"))
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 cl::opt< bool > DisableMachineDCE("disable-machine-dce", cl::Hidden, cl::desc("Disable Machine Dead Code Elimination"))
static std::string getFSRemappingFile(const TargetMachine *TM)
static const char StopBeforeOptName[]
static AnalysisID getPassIDFromName(StringRef PassName)
static cl::opt< bool > DisableEarlyIfConversion("disable-early-ifcvt", cl::Hidden, cl::desc("Disable Early If-conversion"))
static cl::opt< bool > DisableReplaceWithVecLib("disable-replace-with-vec-lib", cl::Hidden, cl::desc("Disable replace with vector math call pass"))
static cl::opt< bool > EnableMachineFunctionSplitter("enable-split-machine-functions", cl::Hidden, cl::desc("Split out cold blocks from machine functions based on profile " "information."))
Enable the machine function splitter pass.
static IdentifyingPassPtr overridePass(AnalysisID StandardID, IdentifyingPassPtr TargetID)
Allow standard passes to be disabled by the command line, regardless of who is adding the pass.
cl::opt< bool > EmitBBHash("emit-bb-hash", cl::desc("Emit the hash of basic block in the SHT_LLVM_BB_ADDR_MAP section."), cl::init(false), cl::Optional)
static std::pair< StringRef, unsigned > getPassNameAndInstanceNum(StringRef PassName)
static cl::opt< bool > PrintAfterISel("print-after-isel", cl::init(false), cl::Hidden, cl::desc("Print machine instrs after ISel"))
static cl::opt< cl::boolOrDefault > VerifyMachineCode("verify-machineinstrs", cl::Hidden, cl::desc("Verify generated machine code"))
static cl::opt< bool > DisablePartialLibcallInlining("disable-partial-libcall-inlining", cl::Hidden, cl::desc("Disable Partial Libcall Inlining"))
static cl::opt< std::string > StartAfterOpt(StringRef(StartAfterOptName), cl::desc("Resume compilation after a specific pass"), cl::value_desc("pass-name"), cl::init(""), cl::Hidden)
cl::opt< bool > PrintRegUsage("print-regusage", cl::Hidden, cl::desc("Print register usage details collected for IPRA"))
static cl::opt< bool > DisableBlockPlacement("disable-block-placement", cl::Hidden, cl::desc("Disable probability-driven block placement"))
static cl::opt< bool > DisableRAFSProfileLoader("disable-ra-fsprofile-loader", cl::init(false), cl::Hidden, cl::desc("Disable MIRProfileLoader before RegAlloc"))
static cl::opt< std::string > StopAfterOpt(StringRef(StopAfterOptName), cl::desc("Stop compilation after a specific pass"), cl::value_desc("pass-name"), cl::init(""), cl::Hidden)
static void initializeDefaultRegisterAllocatorOnce()
static cl::opt< bool > DisableSelectOptimize("disable-select-optimize", cl::init(true), cl::Hidden, cl::desc("Disable the select-optimization pass from running"))
Disable the select optimization pass.
static cl::opt< std::string > FSRemappingFile("fs-remapping-file", cl::init(""), cl::value_desc("filename"), cl::desc("Flow Sensitive profile remapping file name."), cl::Hidden)
static cl::opt< bool > DisableCFIFixup("disable-cfi-fixup", cl::Hidden, cl::desc("Disable the CFI fixup pass"))
static cl::opt< bool > SplitStaticData("split-static-data", cl::Hidden, cl::init(false), cl::desc("Split static data sections into hot and cold " "sections using profile information"))
static cl::opt< bool > DisablePostRAMachineLICM("disable-postra-machine-licm", cl::Hidden, cl::desc("Disable Machine LICM"))
static const char StartBeforeOptName[]
static const PassInfo * getPassInfo(StringRef PassName)
static cl::opt< bool > BasicBlockSectionMatchInfer("basic-block-section-match-infer", cl::desc("Enable matching and inference when generating basic block sections"), cl::init(false), cl::Optional)
Enable matching and inference when using propeller.
static cl::opt< bool > EarlyLiveIntervals("early-live-intervals", cl::Hidden, cl::desc("Run live interval analysis earlier in the pipeline"))
static cl::opt< bool > DisableMachineLICM("disable-machine-licm", cl::Hidden, cl::desc("Disable Machine LICM"))
static cl::opt< cl::boolOrDefault > EnableGlobalISelOption("global-isel", cl::Hidden, cl::desc("Enable the \"global\" instruction selector"))
static cl::opt< bool > DisableTailDuplicate("disable-tail-duplicate", cl::Hidden, cl::desc("Disable tail duplication"))
static cl::opt< bool > DisablePostRAMachineSink("disable-postra-machine-sink", cl::Hidden, cl::desc("Disable PostRA Machine Sinking"))
static const char StartAfterOptName[]
Option names for limiting the codegen pipeline.
static cl::opt< bool > EnableIPRA("enable-ipra", cl::init(false), cl::Hidden, cl::desc("Enable interprocedural register allocation " "to reduce load/store at procedure calls."))
static cl::opt< bool > DisableCGP("disable-cgp", cl::Hidden, cl::desc("Disable Codegen Prepare"))
static std::string getFSProfileFile(const TargetMachine *TM)
static cl::opt< std::string > StartBeforeOpt(StringRef(StartBeforeOptName), cl::desc("Resume compilation before a specific pass"), cl::value_desc("pass-name"), cl::init(""), cl::Hidden)
static cl::opt< bool > TriggerCrash("codegen-pipeline-trigger-crash", cl::init(false), cl::Hidden, cl::desc("Trigger crash in codegen pipeline"))
static IdentifyingPassPtr applyDisable(IdentifyingPassPtr PassID, bool Override)
Allow standard passes to be disabled by command line options.
static cl::opt< GlobalISelAbortMode > EnableGlobalISelAbort("global-isel-abort", cl::Hidden, cl::desc("Enable abort calls when \"global\" instruction selection " "fails to lower/select an instruction"), cl::values(clEnumValN(GlobalISelAbortMode::Disable, "0", "Disable the abort"), clEnumValN(GlobalISelAbortMode::Enable, "1", "Enable the abort"), clEnumValN(GlobalISelAbortMode::DisableWithDiag, "2", "Disable the abort but emit a diagnostic on failure")))
static cl::opt< bool > DisableEarlyTailDup("disable-early-taildup", cl::Hidden, cl::desc("Disable pre-register allocation tail duplication"))
static cl::opt< bool > DisableConstantHoisting("disable-constant-hoisting", cl::Hidden, cl::desc("Disable ConstantHoisting"))
static cl::opt< cl::boolOrDefault > EnableFastISelOption("fast-isel", cl::Hidden, cl::desc("Enable the \"fast\" instruction selector"))
static cl::opt< bool > DisableSSC("disable-ssc", cl::Hidden, cl::desc("Disable Stack Slot Coloring"))
static cl::opt< bool > EnableGlobalMergeFunc("enable-global-merge-func", cl::Hidden, cl::desc("Enable global merge functions that are based on hash function"))
static cl::opt< bool > DisableBranchFold("disable-branch-fold", cl::Hidden, cl::desc("Disable branch folding"))
#define DISABLE_PASS(Option, Name)
static RegisterRegAlloc defaultRegAlloc("default", "pick register allocator based on -O option", useDefaultRegisterAllocator)
static cl::opt< std::string > StopBeforeOpt(StringRef(StopBeforeOptName), cl::desc("Stop compilation before a specific pass"), cl::value_desc("pass-name"), cl::init(""), cl::Hidden)
static cl::opt< bool > DisableMachineCSE("disable-machine-cse", cl::Hidden, cl::desc("Disable Machine Common Subexpression Elimination"))
#define SET_OPTION_IF_PRESENT(Option)
static cl::opt< bool > EnableGCEmptyBlocks("enable-gc-empty-basic-blocks", cl::init(false), cl::Hidden, cl::desc("Enable garbage-collecting empty basic blocks"))
Enable garbage-collecting empty basic blocks.
static cl::opt< bool > DisableLayoutFSProfileLoader("disable-layout-fsprofile-loader", cl::init(false), cl::Hidden, cl::desc("Disable MIRProfileLoader before BlockPlacement"))
static cl::opt< bool > MISchedPostRA("misched-postra", cl::Hidden, cl::desc("Run MachineScheduler post regalloc (independent of preRA sched)"))
static cl::opt< bool > DisableCopyProp("disable-copyprop", cl::Hidden, cl::desc("Disable Copy Propagation pass"))
static cl::opt< bool > DisableLSR("disable-lsr", cl::Hidden, cl::desc("Disable Loop Strength Reduction Pass"))
static cl::opt< std::string > FSProfileFile("fs-profile-file", cl::init(""), cl::value_desc("filename"), cl::desc("Flow Sensitive profile file name."), cl::Hidden)
static cl::opt< cl::boolOrDefault > DebugifyCheckAndStripAll("debugify-check-and-strip-all-safe", cl::Hidden, cl::desc("Debugify MIR before, by checking and stripping the debug info after, " "each pass except those known to be unsafe when debug info is " "present"))
#define SET_OPTION(Option)
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:134
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:219
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.
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 char & GCMachineCodeAnalysisID
GCMachineCodeAnalysis - Target-independent pass to mark safe points in machine code.
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 FunctionPass * createWasmEHPass()
createWasmEHPass - This pass adapts exception handling code to use WebAssembly's exception handling s...
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 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 MachineFunctionPass * createResetMachineFunctionPass(bool EmitFallbackDiag, bool AbortOnFailedISel)
This pass resets a MachineFunction when it has the FailedISel property as if it was just created.
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:149
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...
static cl::opt< bool > TriggerCrash("opt-pipeline-trigger-crash", cl::init(false), cl::Hidden, cl::desc("Trigger crash in optimization pipeline"))
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 & MachineCSELegacyID
MachineCSE - This pass performs global CSE on machine instructions.
LLVM_ABI ImmutablePass * createTypeBasedAAWrapperPass()
LLVM_ABI FunctionPass * createWinEHPass(bool DemoteCatchSwitchPHIOnly=false)
createWinEHPass - Prepares personality functions used by MSVC on Windows, in addition to the Itanium ...
LLVM_ABI Pass * createLoopStrengthReducePass()
LLVM_ABI MachineFunctionPass * createMachineBlockHashInfoPass()
createMachineBlockHashInfoPass - This pass computes basic block hashes.
LLVM_ABI char & LiveVariablesID
LiveVariables pass - This pass computes the set of blocks in which each variable is life and sets mac...
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:57
@ ZOS
z/OS MVS Exception Handling.
Definition CodeGen.h:62
@ None
No exception support.
Definition CodeGen.h:55
@ AIX
AIX Exception Handling.
Definition CodeGen.h:61
@ DwarfCFI
DWARF-like instruction based exceptions.
Definition CodeGen.h:56
@ WinEH
Windows Exception Handling.
Definition CodeGen.h:59
@ Wasm
WebAssembly Exception Handling.
Definition CodeGen.h:60
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.
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)
A utility class that uses RAII to save and restore the value of a variable.
The llvm::once_flag structure.
Definition Threading.h:67