LLVM 24.0.0git
CodeGenPassBuilder.cpp
Go to the documentation of this file.
1//===--- CodeGenPassBuilder.cpp --------------------------------------- ---===//
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
16#include "llvm/ADT/StringRef.h"
66#include "llvm/CodeGen/PEI.h"
103#include "llvm/IR/PassManager.h"
104#include "llvm/IR/Verifier.h"
106#include "llvm/MC/MCAsmInfo.h"
107#include "llvm/MC/MCStreamer.h"
110#include "llvm/Support/CodeGen.h"
111#include "llvm/Support/Debug.h"
112#include "llvm/Support/Error.h"
128#include <cassert>
129#include <utility>
130
131using namespace llvm;
132
133namespace llvm {
134#define DUMMY_MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
135 AnalysisKey PASS_NAME::Key;
136#include "llvm/Passes/MachinePassRegistry.def"
137} // namespace llvm
138
140 const CGPassBuilderOption &Opts,
142 : TM(TM), Opt(Opts), PIC(PIC) {
143 // Target could set CGPassBuilderOption::MISchedPostRA to true to achieve
144 // substitutePass(&PostRASchedulerID, &PostMachineSchedulerID)
145
146 // Target should override TM.Options.EnableIPRA in their target-specific
147 // LLVMTM ctor. See TargetMachine::setGlobalISel for example.
148 if (Opt.EnableIPRA) {
149 TM.Options.EnableIPRA = *Opt.EnableIPRA;
150 } else {
151 // If not explicitly specified, use target default.
152 TM.Options.EnableIPRA |= TM.useIPRA();
153 }
154
155 if (Opt.EnableGlobalISelAbort)
156 TM.Options.GlobalISelAbort = *Opt.EnableGlobalISelAbort;
157
158 // An explicit RegAlloc choice implies its pipeline: only the fast
159 // allocator uses the unoptimized one.
160 if (Opt.OptimizeRegAlloc == cl::boolOrDefault::BOU_UNSET) {
161 bool Optimized = Opt.RegAlloc > RegAllocType::Default
162 ? Opt.RegAlloc != RegAllocType::Fast
163 : getOptLevel() != CodeGenOptLevel::None;
164 Opt.OptimizeRegAlloc =
165 Optimized ? cl::boolOrDefault::BOU_TRUE : cl::boolOrDefault::BOU_FALSE;
166 }
167}
168
169// Out-of-line to anchor the vtable in this translation unit.
171
173 return make_error<StringError>("addInstSelector is not overridden",
175}
176
178 return make_error<StringError>("addIRTranslator is not overridden",
180}
181
183 return make_error<StringError>("addLegalizeMachineIR is not overridden",
185}
186
188 return make_error<StringError>("addRegBankSelect is not overridden",
190}
191
193 return make_error<StringError>("addGlobalInstructionSelect is not overridden",
195}
196
198 llvm_unreachable("addAsmPrinterBegin is not overriden");
199}
200
202 llvm_unreachable("addAsmPrinter is not overridden");
203}
204
206 llvm_unreachable("addAsmPrinterEnd is not overriden");
207}
208
210 bool FreeMachineFunctions) {
211 if (PMW.FPM.isEmpty() && PMW.MFPM.isEmpty())
212 return;
213 if (!PMW.MFPM.isEmpty()) {
214 PMW.FPM.addPass(
215 createFunctionToMachineFunctionPassAdaptor(std::move(PMW.MFPM)));
216 PMW.MFPM = MachineFunctionPassManager();
217 }
218 if (FreeMachineFunctions)
220 if (AddInCGSCCOrder) {
222 createCGSCCToFunctionPassAdaptor(std::move(PMW.FPM))));
223 } else {
224 PMW.MPM.addPass(createModuleToFunctionPassAdaptor(std::move(PMW.FPM)));
225 }
226 PMW.FPM = FunctionPassManager();
227}
228
231 raw_pwrite_stream *DwoOut, CodeGenFileType FileType, MCContext &Ctx) {
232 auto StartStopInfo = TargetPassConfig::getStartStopInfo(*PIC);
233 if (!StartStopInfo)
234 return StartStopInfo.takeError();
235 setStartStopPasses(*StartStopInfo);
236
238 bool PrintMIR = !PrintAsm && FileType != CodeGenFileType::Null;
239
240 PassManagerWrapper PMW(MPM);
241
243 /*Force=*/true);
245 /*Force=*/true);
247 /*Force=*/true);
249 /*Force=*/true);
251 PMW,
252 /*Force=*/true);
253 addISelPasses(PMW);
254 flushFPMsToMPM(PMW);
255
256 if (PrintAsm) {
257 Expected<std::unique_ptr<MCStreamer>> MCStreamerOrErr =
258 TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
259 if (!MCStreamerOrErr)
260 return MCStreamerOrErr.takeError();
261 std::unique_ptr<AsmPrinter> Printer(
262 TM.getTarget().createAsmPrinter(TM, std::move(*MCStreamerOrErr)));
263 if (!Printer)
264 return createStringError("failed to create AsmPrinter");
265 MAM.registerPass([&] { return AsmPrinterAnalysis(std::move(Printer)); });
267 }
268
269 if (PrintMIR)
270 addModulePass(PrintMIRPreparePass(Out), PMW, /*Force=*/true);
271
272 if (auto Err = addCoreISelPasses(PMW))
273 return Err;
274
275 if (auto Err = addMachinePasses(PMW))
276 return Err;
277
278 if (!Opt.DisableVerify && TM.Options.EnableDefaultMachineVerifier)
280
281 // We add AsmPrinter regardless if we are emitting MIR or Assembly as the
282 // final output so that -stop-before=<target>-asm-printer works. When printing
283 // MIR as the final output, we never end up running AsmPrinter.
284 addAsmPrinter(PMW);
285
286 if (PrintAsm) {
287 flushFPMsToMPM(PMW, /*FreeMachineFunctions=*/true);
288 addAsmPrinterEnd(PMW);
289 } else {
290 if (PrintMIR)
291 addMachineFunctionPass(PrintMIRPass(Out), PMW, /*Force=*/true);
292 flushFPMsToMPM(PMW, /*FreeMachineFunctions=*/true);
293 }
294
295 return verifyStartStop(*StartStopInfo);
296}
297
298void CodeGenPassBuilder::setStartStopPasses(
300 if (!Info.StartPass.empty()) {
301 Started = false;
302 BeforeCallbacks.emplace_back([this, &Info, AfterFlag = Info.StartAfter,
303 Count = 0u](StringRef ClassName) mutable {
304 if (Count == Info.StartInstanceNum) {
305 if (AfterFlag) {
306 AfterFlag = false;
307 Started = true;
308 }
309 return Started;
310 }
311
312 auto PassName = PIC->getPassNameForClassName(ClassName);
313 if (Info.StartPass == PassName && ++Count == Info.StartInstanceNum)
314 Started = !Info.StartAfter;
315
316 return Started;
317 });
318 }
319
320 if (!Info.StopPass.empty()) {
321 Stopped = false;
322 BeforeCallbacks.emplace_back([this, &Info, AfterFlag = Info.StopAfter,
323 Count = 0u](StringRef ClassName) mutable {
324 if (Count == Info.StopInstanceNum) {
325 if (AfterFlag) {
326 AfterFlag = false;
327 Stopped = true;
328 }
329 return !Stopped;
330 }
331
332 auto PassName = PIC->getPassNameForClassName(ClassName);
333 if (Info.StopPass == PassName && ++Count == Info.StopInstanceNum)
334 Stopped = !Info.StopAfter;
335 return !Stopped;
336 });
337 }
338}
339
340Error CodeGenPassBuilder::verifyStartStop(
341 const TargetPassConfig::StartStopInfo &Info) const {
342 if (Started && Stopped)
343 return Error::success();
344
345 if (!Started)
347 "Can't find start pass \"" + Info.StartPass + "\".",
348 std::make_error_code(std::errc::invalid_argument));
349 if (!Stopped)
351 "Can't find stop pass \"" + Info.StopPass + "\".",
352 std::make_error_code(std::errc::invalid_argument));
353 return Error::success();
354}
355
358 if (TM.useEmulatedTLS())
360
361 // ObjCARCContract operates on ObjC intrinsics and must run before
362 // PreISelIntrinsicLowering.
365 flushFPMsToMPM(PMW);
366 }
369
370 addIRPasses(PMW);
373 addISelPrepare(PMW);
374}
375
376/// Add common target configurable passes that perform LLVM IR to IR transforms
377/// following machine independent optimization.
379 // Before running any passes, run the verifier to determine if the input
380 // coming from the front-end and/or optimizer is valid.
381 if (!Opt.DisableVerify)
382 addFunctionPass(VerifierPass(), PMW, /*Force=*/true);
383
384 // Run loop strength reduction before anything else.
385 if (getOptLevel() != CodeGenOptLevel::None && !Opt.DisableLSR) {
386 // These passes do not use MSSA.
387 LoopPassManager LPM;
388 LPM.addPass(CanonicalizeFreezeInLoopsPass());
389 LPM.addPass(LoopStrengthReducePass());
390 if (Opt.EnableLoopTermFold)
391 LPM.addPass(LoopTermFoldPass());
393 /*UseMemorySSA=*/false),
394 PMW);
395 }
396
397 // Run GC lowering passes for builtin collectors
398 // TODO: add a pass insertion point here
400 // Explicitly check to see if we should add ShadowStackGCLowering to avoid
401 // splitting the function pipeline if we do not have to.
402 if (runBeforeAdding(ShadowStackGCLoweringPass::name())) {
403 flushFPMsToMPM(PMW);
405 }
406
407 // Make sure that no unreachable blocks are instruction selected.
409
410 // Prepare expensive constants for SelectionDAG.
411 if (getOptLevel() != CodeGenOptLevel::None && !Opt.DisableConstantHoisting)
413
414 // Replace calls to LLVM intrinsics (e.g., exp, log) operating on vector
415 // operands with calls to the corresponding functions in a vector library.
418
420 !Opt.DisablePartialLibcallInlining)
422
423 // Instrument function entry and exit, e.g. with calls to mcount().
424 addFunctionPass(EntryExitInstrumenterPass(/*PostInlining=*/true), PMW);
425
426 // Add scalarization of target's unsupported masked memory intrinsics pass.
427 // the unsupported intrinsic will be replaced with a chain of basic blocks,
428 // that stores/loads element one-by-one if the appropriate mask bit is set.
430
431 // Expand reduction intrinsics into shuffle sequences if the target wants to.
432 if (!Opt.DisableExpandReductions)
434
435 // Convert conditional moves to conditional jumps when profitable.
436 if (getOptLevel() != CodeGenOptLevel::None && !Opt.DisableSelectOptimize)
438
439 if (Opt.EnableGlobalMergeFunc) {
440 flushFPMsToMPM(PMW);
442 }
443}
444
445/// Turn exception handling constructs into something the code generators can
446/// handle.
448 const MCAsmInfo &MCAI = TM.getMCAsmInfo();
449 switch (MCAI.getExceptionHandlingType()) {
451 // SjLj piggy-backs on dwarf for this bit. The cleanups done apply to both
452 // Dwarf EH prepare needs to be run after SjLj prepare. Otherwise,
453 // catch info can get misplaced when a selector ends up more than one block
454 // removed from the parent invoke(s). This could happen when a landing
455 // pad is shared by multiple invokes and is also a target of a normal
456 // edge from elsewhere.
458 [[fallthrough]];
464 break;
466 // We support using both GCC-style and MSVC-style exceptions on Windows, so
467 // add both preparation passes. Each pass will only actually run if it
468 // recognizes the personality function.
471 break;
473 // Wasm EH uses Windows EH instructions, but it does not need to demote PHIs
474 // on catchpads and cleanuppads because it does not outline them into
475 // funclets. Catchswitch blocks are not lowered in SelectionDAG, so we
476 // should remove PHIs there.
477 addFunctionPass(WinEHPreparePass(/*DemoteCatchSwitchPHIOnly=*/false), PMW);
479 break;
482
483 // The lower invoke pass may create unreachable code. Remove it.
485 break;
486 }
487}
488
489/// Add pass to prepare the LLVM IR for code generation. This should be done
490/// before exception handling preparation passes.
492 if (getOptLevel() != CodeGenOptLevel::None && !Opt.DisableCGP)
494 // TODO: Default ctor'd RewriteSymbolPass is no-op.
495 // addPass(RewriteSymbolPass());
496}
497
498/// Add common passes that perform LLVM IR to IR transforms in preparation for
499/// instruction selection.
501 addPreISel(PMW);
502
503 if (Opt.RequiresCodeGenSCCOrder && !AddInCGSCCOrder)
505
507 // Add both the safe stack and the stack protection passes: each of them will
508 // only protect functions that have corresponding attributes.
511
512 if (Opt.PrintISelInput)
514 dbgs(), "\n\n*** Final LLVM Code input to ISel ***\n"),
515 PMW);
516
517 // All passes which modify the LLVM IR are now complete; run the verifier
518 // to ensure that the IR is valid.
519 if (!Opt.DisableVerify)
520 addFunctionPass(VerifierPass(), PMW, /*Force=*/true);
521}
522
524 // Enable FastISel with -fast-isel, but allow that to be overridden.
525 TM.setO0WantsFastISel(Opt.EnableFastISelOption !=
527
528 // Determine an instruction selector.
529 enum class SelectorType { SelectionDAG, FastISel, GlobalISel };
530 SelectorType Selector;
531
532 if (Opt.EnableFastISelOption == cl::boolOrDefault::BOU_TRUE)
533 Selector = SelectorType::FastISel;
534 else if (Opt.EnableGlobalISelOption == cl::boolOrDefault::BOU_TRUE ||
535 (TM.Options.EnableGlobalISel &&
536 Opt.EnableGlobalISelOption != cl::boolOrDefault::BOU_FALSE))
537 Selector = SelectorType::GlobalISel;
538 else if (TM.getOptLevel() == CodeGenOptLevel::None && TM.getO0WantsFastISel())
539 Selector = SelectorType::FastISel;
540 else
541 Selector = SelectorType::SelectionDAG;
542
543 // Set consistently TM.Options.EnableFastISel and EnableGlobalISel.
544 if (Selector == SelectorType::FastISel) {
545 TM.setFastISel(true);
546 TM.setGlobalISel(false);
547 } else if (Selector == SelectorType::GlobalISel) {
548 TM.setFastISel(false);
549 TM.setGlobalISel(true);
550 }
551
552 // Add instruction selector passes.
553 if (Selector == SelectorType::GlobalISel) {
554 if (auto Err = addIRTranslator(PMW))
555 return Err;
556
558
559 if (auto Err = addLegalizeMachineIR(PMW))
560 return Err;
561
562 // Before running the register bank selector, ask the target if it
563 // wants to run some passes.
565
566 if (auto Err = addRegBankSelect(PMW))
567 return Err;
568
570
571 if (auto Err = addGlobalInstructionSelect(PMW))
572 return Err;
573
574 // Pass to reset the MachineFunction if the ISel failed.
576 ResetMachineFunctionPass(reportDiagnosticWhenGlobalISelFallback(),
578 PMW);
579
580 // Provide a fallback path when we do not want to abort on
581 // not-yet-supported input.
583 if (auto Err = addInstSelector(PMW))
584 return Err;
585
586 } else if (auto Err = addInstSelector(PMW))
587 return Err;
588
589 // Expand pseudo-instructions emitted by ISel. Don't run the verifier before
590 // FinalizeISel.
592
593 // // Print the instruction selected machine code...
594 // printAndVerify("After Instruction Selection");
595
596 return Error::success();
597}
598
599/// Add the complete set of target-independent postISel code generator passes.
600///
601/// This can be read as the standard order of major LLVM CodeGen stages. Stages
602/// with nontrivial configuration or multiple passes are broken out below in
603/// add%Stage routines.
604///
605/// Any CodeGenPassBuilder::addXX routine may be overriden by the Target. The
606/// addPre/Post methods with empty header implementations allow injecting
607/// target-specific fixups just before or after major stages. Additionally,
608/// targets have the flexibility to change pass order within a stage by
609/// overriding default implementation of add%Stage routines below. Each
610/// technique has maintainability tradeoffs because alternate pass orders are
611/// not well supported. addPre/Post works better if the target pass is easily
612/// tied to a common pass. But if it has subtle dependencies on multiple passes,
613/// the target should override the stage instead.
615 // Add passes that optimize machine instructions in SSA form.
618 } else {
619 // If the target requests it, assign local variables to stack slots relative
620 // to one another and simplify frame index references where possible.
622 }
623
624 if (TM.Options.EnableIPRA) {
625 flushFPMsToMPM(PMW);
627 PMW, /*Force=*/true);
629 }
630 // Run pre-ra passes.
631 addPreRegAlloc(PMW);
632
633 // Run register allocation and passes that are tightly coupled with it,
634 // including phi elimination and scheduling.
635 if (auto Err = Opt.OptimizeRegAlloc == cl::boolOrDefault::BOU_TRUE
637 : addFastRegAlloc(PMW))
638 return Err;
639
640 // Run post-ra passes.
641 addPostRegAlloc(PMW);
642
645
646 // Insert prolog/epilog code. Eliminate abstract frame index references...
650 }
651
653
654 /// Add passes that optimize machine instructions after register allocation.
657
658 // Expand pseudo instructions before second scheduling pass.
660
661 // Run pre-sched2 passes.
662 addPreSched2(PMW);
663
664 if (Opt.EnableImplicitNullChecks)
666
667 // Second pass scheduler.
668 // Let Target optionally insert this pass by itself at some other
669 // point.
671 !TM.targetSchedulesPostRAScheduling()) {
672 if (Opt.MISchedPostRA)
674 else
676 }
677
678 // GC
679 addGCPasses(PMW);
680
681 // Basic block placement.
684
685 // Insert before XRay Instrumentation.
687
690
691 addPreEmitPass(PMW);
692
693 if (TM.Options.EnableIPRA) {
694 // Collect register usage information and produce a register mask of
695 // clobbered registers, to be used to optimize call sites.
697 // If -print-regusage is specified, print the collected register usage info.
698 if (Opt.PrintRegUsage) {
699 flushFPMsToMPM(PMW);
701 }
702 }
703
705
707 addMachineFunctionPass(StackMapLivenessPass(), PMW);
709 LiveDebugValuesPass(TM.Options.ShouldEmitDebugEntryValues()), PMW);
711
712 if (TM.Options.EnableMachineOutliner &&
714 Opt.EnableMachineOutliner != RunOutliner::NeverOutline) {
715 if (Opt.EnableMachineOutliner != RunOutliner::TargetDefault ||
716 TM.Options.SupportsDefaultOutlining) {
717 flushFPMsToMPM(PMW);
718 addModulePass(MachineOutlinerPass(Opt.EnableMachineOutliner), PMW);
719 }
720 }
721
722 if (Opt.EnableGCEmptyBlocks)
724
726
728
729 // Add passes that directly emit MI after all other MI passes.
730 addPreEmitPass2(PMW);
731
732 return Error::success();
733}
734
735/// Add passes that optimize machine instructions in SSA form.
737 // Pre-ra tail duplication.
739
740 // Optimize PHIs before DCE: removing dead PHI cycles may make more
741 // instructions dead.
743
744 // This pass merges large allocas. StackSlotColoring is a different pass
745 // which merges spill slots.
747
748 // If the target requests it, assign local variables to stack slots relative
749 // to one another and simplify frame index references where possible.
751
752 // With optimization, dead code should already be eliminated. However
753 // there is one known exception: lowered code for arguments that are only
754 // used by tail calls, where the tail calls reuse the incoming stack
755 // arguments directly (see t11 in test/CodeGen/X86/sibcall.ll).
757
758 // Allow targets to insert passes that improve instruction level parallelism,
759 // like if-conversion. Such passes will typically need dominator trees and
760 // loop info, just like LICM and CSE below.
761 addILPOpts(PMW);
762
765
766 addMachineFunctionPass(MachineSinkingPass(Opt.EnableSinkAndFold), PMW);
767
769 // Clean-up the dead code that may have been generated by peephole
770 // rewriting.
772}
773
774//===---------------------------------------------------------------------===//
775/// Register Allocation Pass Configuration
776//===---------------------------------------------------------------------===//
777
778/// Instantiate the default register allocator pass for this target for either
779/// the optimized or unoptimized allocation path. This will be added to the pass
780/// manager by addFastRegAlloc in the unoptimized case or addOptimizedRegAlloc
781/// in the optimized case.
782///
783/// A target that uses the standard regalloc pass order for fast or optimized
784/// allocation may still override this for per-target regalloc
785/// selection. But -regalloc-npm=... always takes precedence.
786/// If a target does not want to allow users to set -regalloc-npm=... at all,
787/// check if Opt.RegAlloc == RegAllocType::Unset.
789 bool Optimized) {
790 if (Optimized)
792 else
794}
795
796/// Find and instantiate the register allocation pass requested by this target
797/// at the current optimization level. Different register allocators are
798/// defined as separate passes because they may require different analysis.
799///
800/// This helper ensures that the -regalloc-npm= option is always available,
801/// even for targets that override the default allocator.
803 bool Optimized) {
804 // Use the specified -regalloc-npm={basic|greedy|fast|pbqp}
805 if (Opt.RegAlloc > RegAllocType::Default) {
806 switch (Opt.RegAlloc) {
809 break;
812 break;
813 default:
814 reportFatalUsageError("register allocator not supported yet");
815 }
816 return;
817 }
818 // -regalloc=default or unspecified, so pick based on the optimization level
819 // or ask the target for the regalloc pass.
820 addTargetRegisterAllocator(PMW, Optimized);
821}
822
824 // TODO: Ensure allocator is default or fast.
825 addRegAllocPass(PMW, false);
826 return Error::success();
827}
828
831 // Add the selected register allocation pass.
832 addRegAllocPass(PMW, true);
833
834 // Allow targets to change the register assignments before rewriting.
835 addPreRewrite(PMW);
836
837 // Finally rewrite virtual registers.
839
840 return true;
841}
842
843/// Add the minimum set of target-independent passes that are required for
844/// register allocation. No coalescing or scheduling.
850
851/// Add standard target-independent passes that are tightly coupled with
852/// optimized register allocation, including coalescing, machine instruction
853/// scheduling, and register allocation itself.
856
858
860
861 // LiveVariables currently requires pure SSA form.
862 //
863 // FIXME: Once TwoAddressInstruction pass no longer uses kill flags,
864 // LiveVariables can be removed completely, and LiveIntervals can be directly
865 // computed. (We still either need to regenerate kill flags after regalloc, or
866 // preferably fix the scavenger to not depend on them).
867 // FIXME: UnreachableMachineBlockElim is a dependant pass of LiveVariables.
868 // When LiveVariables is removed this has to be removed/moved either.
869 // Explicit addition of UnreachableMachineBlockElim allows stopping before or
870 // after it with -stop-before/-stop-after.
874
875 // Edge splitting is smarter with machine loop info.
879
880 // Eventually, we want to run LiveIntervals before PHI elimination.
881 if (Opt.EarlyLiveIntervals)
884
887
888 // The machine scheduler may accidentally create disconnected components
889 // when moving subregister definitions around, avoid this by splitting them to
890 // separate vregs before. Splitting can also improve reg. allocation quality.
892
893 // PreRA instruction scheduling.
895
897 if (!AddedPasses)
898 return AddedPasses.takeError();
899 if (!AddedPasses.get())
900 return Error::success();
901
903
904 // Allow targets to expand pseudo instructions depending on the choice of
905 // registers before MachineCopyPropagation.
906 addPostRewrite(PMW);
907
908 // Copy propagate to forward register uses and try to eliminate COPYs that
909 // were not coalesced.
911
912 // Run post-ra machine LICM to hoist reloads / remats.
913 //
914 // FIXME: can this move into MachineLateOptimization?
916
917 return Error::success();
918}
919
920//===---------------------------------------------------------------------===//
921/// Post RegAlloc Pass Configuration
922//===---------------------------------------------------------------------===//
923
924/// Add passes that optimize machine instructions after register allocation.
926 // Cleanup of redundant (identical) address/immediate loads.
928
929 // Branch folding must be run after regalloc and prolog/epilog insertion.
930 addMachineFunctionPass(BranchFolderPass(Opt.EnableTailMerge), PMW);
931
932 // Tail duplication.
933 // Note that duplicating tail just increases code size and degrades
934 // performance for targets that require Structured Control Flow.
935 // In addition it can also make CFG irreducible. Thus we disable it.
936 if (!TM.requiresStructuredCFG())
938
939 // Copy propagation.
941}
942
943/// Add standard basic block placement passes.
946 // Run a separate pass to collect block placement statistics.
947 if (Opt.EnableBlockPlacementStats)
949}
amdgpu next use AMDGPU Next Use Analysis Printer
This is the interface for LLVM's primary stateless and local alias analysis.
This header provides classes for managing passes over SCCs of the call graph.
Interfaces for producing common pass manager configurations.
Defines an IR pass for CodeGen Prepare.
Analysis that tracks defined/used subregister lanes across COPY instructions and instructions that ge...
This file defines passes to print out IR in various granularities.
This header defines various interfaces for pass management in LLVM.
This file contains the declaration of the InterleavedAccessPass class, its corresponding pass name is...
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
The header file for the LowerConstantIntrinsics pass as used by the new pass manager.
ModuleAnalysisManager MAM
if(PassOpts->AAPipeline)
PassInstrumentationCallbacks PIC
This pass is required to take advantage of the interprocedural register allocation infrastructure.
This is the interface for a metadata-based scoped no-alias analysis.
This file contains the declaration of the SelectOptimizePass class, its corresponding pass name is se...
This file defines the SmallVector class.
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.
static const char PassName[]
A pass that canonicalizes freeze instructions in a loop.
virtual void addPreEmitPass(PassManagerWrapper &PMW)
This pass may be implemented by targets that want to run passes immediately before machine code is em...
virtual void addMachineSSAOptimization(PassManagerWrapper &PMW)
Methods with trivial inline returns are convenient points in the common codegen pass pipeline where t...
void addRegAllocPass(PassManagerWrapper &PMW, bool Optimized)
addMachinePasses helper to create the target-selected or overriden regalloc pass.
void addMachineFunctionPass(PassT &&Pass, PassManagerWrapper &PMW, bool Force=false, StringRef Name=PassT::name())
CodeGenPassBuilder(TargetMachine &TM, const CGPassBuilderOption &Opts, PassInstrumentationCallbacks *PIC)
virtual Error addLegalizeMachineIR(PassManagerWrapper &PMW)
This method should install a legalize pass, which converts the instruction sequence into one that can...
virtual void addPreRewrite(PassManagerWrapper &PMW)
addPreRewrite - Add passes to the optimized register allocation pipeline after register allocation is...
virtual Error addMachinePasses(PassManagerWrapper &PMW)
Add the complete, standard set of LLVM CodeGen passes.
void flushFPMsToMPM(PassManagerWrapper &PMW, bool FreeMachineFunctions=false)
virtual void addAsmPrinter(PassManagerWrapper &PMW)
virtual Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
Add core register allocator passes which do the actual register assignment and rewriting.
void addFunctionPass(PassT &&Pass, PassManagerWrapper &PMW, bool Force=false, StringRef Name=PassT::name())
virtual void addIRPasses(PassManagerWrapper &PMW)
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
virtual void addMachineLateOptimization(PassManagerWrapper &PMW)
Add passes that optimize machine instructions after register allocation.
Error buildPipeline(ModulePassManager &MPM, ModuleAnalysisManager &MAM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, MCContext &Ctx)
virtual void addPreRegAlloc(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes immediately before register allocat...
virtual void addPostRegAlloc(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes after register allocation pass pipe...
bool isGlobalISelAbortEnabled() const
Check whether or not GlobalISel should abort on error.
virtual void addPreSched2(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes after prolog-epilog insertion and b...
void addISelPasses(PassManagerWrapper &PMW)
High level function that adds all passes necessary to go from llvm IR representation to the MI repres...
virtual void addCodeGenPrepare(PassManagerWrapper &PMW)
Add pass to prepare the LLVM IR for code generation.
Error addCoreISelPasses(PassManagerWrapper &PMW)
Add the actual instruction selection passes.
virtual void addPreEmitPass2(PassManagerWrapper &PMW)
Targets may add passes immediately before machine code is emitted in this callback.
virtual void addPreRegBankSelect(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes immediately before the register ban...
virtual void addGlobalMergePass(PassManagerWrapper &PMW)
Target can override this to add GlobalMergePass before all IR passes.
CodeGenOptLevel getOptLevel() const
virtual void addTargetRegisterAllocator(PassManagerWrapper &PMW, bool Optimized)
Utilities for targets to add passes to the pass manager.
virtual Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
This method should install a (global) instruction selector pass, which converts possibly generic inst...
virtual void addAsmPrinterBegin(PassManagerWrapper &PMW)
virtual Error addIRTranslator(PassManagerWrapper &PMW)
This method should install an IR translator pass, which converts from LLVM code to machine instructio...
virtual void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes immediately before legalization.
virtual Expected< bool > addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
virtual void addISelPrepare(PassManagerWrapper &PMW)
Add common passes that perform LLVM IR to IR transforms in preparation for instruction selection.
virtual void addPreISel(PassManagerWrapper &PMW)
{{@ For GlobalISel
virtual Error addOptimizedRegAlloc(PassManagerWrapper &PMW)
addOptimizedRegAlloc - Add passes related to register allocation.
virtual void addPostBBSections(PassManagerWrapper &PMW)
void addModulePass(PassT &&Pass, PassManagerWrapper &PMW, bool Force=false, StringRef Name=PassT::name())
virtual Error addFastRegAlloc(PassManagerWrapper &PMW)
addFastRegAlloc - Add the minimum set of target-independent passes that are required for fast registe...
virtual void addPreGlobalInstructionSelect(PassManagerWrapper &PMW)
This method may be implemented by targets that want to run passes immediately before the (global) ins...
void addPassesToHandleExceptions(PassManagerWrapper &PMW)
Add passes to lower exception handling for the code generator.
virtual void addILPOpts(PassManagerWrapper &PMW)
Add passes that optimize instruction level parallelism for out-of-order targets.
PassInstrumentationCallbacks * PIC
virtual void addAsmPrinterEnd(PassManagerWrapper &PMW)
virtual Error addInstSelector(PassManagerWrapper &PMW)
addInstSelector - This method should install an instruction selector pass, which converts from LLVM c...
virtual void addBlockPlacement(PassManagerWrapper &PMW)
Add standard basic block placement passes.
virtual void addPostRewrite(PassManagerWrapper &PMW)
Add passes to be run immediately after virtual registers are rewritten to physical registers.
bool reportDiagnosticWhenGlobalISelFallback() const
Check whether or not a diagnostic should be emitted when GlobalISel uses the fallback path.
virtual void addGCPasses(PassManagerWrapper &PMW)
addGCPasses - Add late codegen passes that analyze code for garbage collection.
void requireCGSCCOrder(PassManagerWrapper &PMW)
virtual Error addRegBankSelect(PassManagerWrapper &PMW)
This method should install a register bank selector pass, which assigns register banks to virtual reg...
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
Error takeError()
Take ownership of the stored error.
Definition Error.h:612
reference get()
Returns a reference to the stored T value.
Definition Error.h:582
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:67
LowerIntrinsics - This pass rewrites calls to the llvm.gcread or llvm.gcwrite intrinsics,...
Definition GCMetadata.h:229
Performs Loop Strength Reduce Pass.
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
Context object for machine code objects.
Definition MCContext.h:83
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
LLVM_ABI StringRef getPassNameForClassName(StringRef ClassName)
Get the pass name for a given pass class name. Empty if no match found.
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
bool isEmpty() const
Returns if the pass manager contains any passes.
Pass (for the new pass manager) for printing a Function as LLVM's text IR assembly.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Primary interface to the complete machine description for the target machine.
static Expected< StartStopInfo > getStartStopInfo(PassInstrumentationCallbacks &PIC)
Returns pass name in -stop-before or -stop-after NOTE: New pass manager migration only.
static bool willCompleteCodeGenPipeline()
Returns true if none of the -stop-before and -stop-after options is set.
Create a verifier pass.
Definition Verifier.h:133
An abstract base class for streams implementations that also support a pwrite operation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
ModuleToFunctionPassAdaptor createModuleToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Definition Error.cpp:94
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Definition Error.h:1321
PassManager< Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, LPMUpdater & > LoopPassManager
The Loop pass manager.
ModuleToPostOrderCGSCCPassAdaptor createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
FunctionToLoopPassAdaptor createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA=false)
A function to deduce a loop pass type and wrap it in the templated adaptor.
CGSCCToFunctionPassAdaptor createCGSCCToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false, bool NoRerun=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
Definition CodeGen.h:178
FunctionToMachineFunctionPassAdaptor createFunctionToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass)
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
Definition Error.h:340
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
PassManager< Function > FunctionPassManager
Convenience typedef for a pass manager over functions.
@ 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
PassManager< MachineFunction > MachineFunctionPassManager
Convenience typedef for a pass manager over functions.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
Global function merging pass for new pass manager.
A utility pass template to force an analysis result to be available.