LLVM 23.0.0git
PassBuilderPipelines.cpp
Go to the documentation of this file.
1//===- Construction of pass pipelines -------------------------------------===//
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/// \file
9///
10/// This file provides the implementation of the PassBuilder based on our
11/// static pass registry as well as related functionality. It also provides
12/// helpers to aid in analyzing, debugging, and testing passes and pass
13/// pipelines.
14///
15//===----------------------------------------------------------------------===//
16
17#include "llvm/ADT/Statistic.h"
29#include "llvm/IR/PassManager.h"
30#include "llvm/Pass.h"
156
157using namespace llvm;
158
159namespace llvm {
160
162 "enable-ml-inliner", cl::init(InliningAdvisorMode::Default), cl::Hidden,
163 cl::desc("Enable ML policy for inliner. Currently trained for -Oz only"),
165 "Heuristics-based inliner version"),
167 "Use development mode (runtime-loadable model)"),
169 "Use release mode (AOT-compiled model)")));
170
171/// Flag to enable inline deferral during PGO.
172static cl::opt<bool>
173 EnablePGOInlineDeferral("enable-npm-pgo-inline-deferral", cl::init(true),
175 cl::desc("Enable inline deferral during PGO"));
176
177static cl::opt<bool> EnableModuleInliner("enable-module-inliner",
178 cl::init(false), cl::Hidden,
179 cl::desc("Enable module inliner"));
180
182 "mandatory-inlining-first", cl::init(false), cl::Hidden,
183 cl::desc("Perform mandatory inlinings module-wide, before performing "
184 "inlining"));
185
187 "eagerly-invalidate-analyses", cl::init(true), cl::Hidden,
188 cl::desc("Eagerly invalidate more analyses in default pipelines"));
189
191 "enable-merge-functions", cl::init(false), cl::Hidden,
192 cl::desc("Enable function merging as part of the optimization pipeline"));
193
195 "enable-post-pgo-loop-rotation", cl::init(true), cl::Hidden,
196 cl::desc("Run the loop rotation transformation after PGO instrumentation"));
197
199 "enable-global-analyses", cl::init(true), cl::Hidden,
200 cl::desc("Enable inter-procedural analyses"));
201
202static cl::opt<bool> RunPartialInlining("enable-partial-inlining",
203 cl::init(false), cl::Hidden,
204 cl::desc("Run Partial inlining pass"));
205
207 "extra-vectorizer-passes", cl::init(false), cl::Hidden,
208 cl::desc("Run cleanup optimization passes after vectorization"));
209
210static cl::opt<bool> RunNewGVN("enable-newgvn", cl::init(false), cl::Hidden,
211 cl::desc("Run the NewGVN pass"));
212
213static cl::opt<bool>
214 EnableLoopInterchange("enable-loopinterchange", cl::init(false), cl::Hidden,
215 cl::desc("Enable the LoopInterchange Pass"));
216
217static cl::opt<bool> EnableUnrollAndJam("enable-unroll-and-jam",
218 cl::init(false), cl::Hidden,
219 cl::desc("Enable Unroll And Jam Pass"));
220
221static cl::opt<bool> EnableLoopFlatten("enable-loop-flatten", cl::init(false),
223 cl::desc("Enable the LoopFlatten Pass"));
224
225static cl::opt<bool>
226 EnableInstrumentor("enable-instrumentor", cl::init(false), cl::Hidden,
227 cl::desc("Enable the Instrumentor Pass"));
228
229static cl::opt<bool>
230 EnableDFAJumpThreading("enable-dfa-jump-thread",
231 cl::desc("Enable DFA jump threading"),
232 cl::init(false), cl::Hidden);
233
234static cl::opt<bool>
235 EnableHotColdSplit("hot-cold-split",
236 cl::desc("Enable hot-cold splitting pass"));
237
238static cl::opt<bool> EnableIROutliner("ir-outliner", cl::init(false),
240 cl::desc("Enable ir outliner pass"));
241
242static cl::opt<bool>
243 DisablePreInliner("disable-preinline", cl::init(false), cl::Hidden,
244 cl::desc("Disable pre-instrumentation inliner"));
245
247 "preinline-threshold", cl::Hidden, cl::init(75),
248 cl::desc("Control the amount of inlining in pre-instrumentation inliner "
249 "(default = 75)"));
250
251static cl::opt<bool>
252 EnableGVNHoist("enable-gvn-hoist",
253 cl::desc("Enable the GVN hoisting pass (default = off)"));
254
255static cl::opt<bool>
256 EnableGVNSink("enable-gvn-sink",
257 cl::desc("Enable the GVN sinking pass (default = off)"));
258
260 "enable-jump-table-to-switch", cl::init(true),
261 cl::desc("Enable JumpTableToSwitch pass (default = true)"));
262
263// This option is used in simplifying testing SampleFDO optimizations for
264// profile loading.
265static cl::opt<bool>
266 EnableCHR("enable-chr", cl::init(true), cl::Hidden,
267 cl::desc("Enable control height reduction optimization (CHR)"));
268
270 "flattened-profile-used", cl::init(false), cl::Hidden,
271 cl::desc("Indicate the sample profile being used is flattened, i.e., "
272 "no inline hierarchy exists in the profile"));
273
274static cl::opt<bool>
275 EnableMatrix("enable-matrix", cl::init(false), cl::Hidden,
276 cl::desc("Enable lowering of the matrix intrinsics"));
277
279 "enable-mergeicmps", cl::init(true), cl::Hidden,
280 cl::desc("Enable MergeICmps pass in the optimization pipeline"));
281
283 "enable-constraint-elimination", cl::init(true), cl::Hidden,
284 cl::desc(
285 "Enable pass to eliminate conditions based on linear constraints"));
286
288 "attributor-enable", cl::Hidden, cl::init(AttributorRunOption::NONE),
289 cl::desc("Enable the attributor inter-procedural deduction pass"),
291 "enable all full attributor runs"),
293 "enable all attributor-light runs"),
295 "enable module-wide attributor runs"),
297 "enable module-wide attributor-light runs"),
299 "enable call graph SCC attributor runs"),
301 "enable call graph SCC attributor-light runs"),
302 clEnumValN(AttributorRunOption::NONE, "none",
303 "disable attributor runs")));
304
306 "enable-sampled-instrumentation", cl::init(false), cl::Hidden,
307 cl::desc("Enable profile instrumentation sampling (default = off)"));
309 "enable-loop-versioning-licm", cl::init(false), cl::Hidden,
310 cl::desc("Enable the experimental Loop Versioning LICM pass"));
311
313 "instrument-cold-function-only-path", cl::init(""),
314 cl::desc("File path for cold function only instrumentation(requires use "
315 "with --pgo-instrument-cold-function-only)"),
316 cl::Hidden);
317
318// TODO: There is a similar flag in WPD pass, we should consolidate them by
319// parsing the option only once in PassBuilder and share it across both places.
321 "enable-devirtualize-speculatively",
322 cl::desc("Enable speculative devirtualization optimization"),
323 cl::init(false));
324
327
329} // namespace llvm
330
348
349namespace llvm {
351} // namespace llvm
352
354 OptimizationLevel Level) {
355 for (auto &C : PeepholeEPCallbacks)
356 C(FPM, Level);
357}
360 for (auto &C : LateLoopOptimizationsEPCallbacks)
361 C(LPM, Level);
362}
364 OptimizationLevel Level) {
365 for (auto &C : LoopOptimizerEndEPCallbacks)
366 C(LPM, Level);
367}
370 for (auto &C : ScalarOptimizerLateEPCallbacks)
371 C(FPM, Level);
372}
374 OptimizationLevel Level) {
375 for (auto &C : CGSCCOptimizerLateEPCallbacks)
376 C(CGPM, Level);
377}
379 OptimizationLevel Level) {
380 for (auto &C : VectorizerStartEPCallbacks)
381 C(FPM, Level);
382}
384 OptimizationLevel Level) {
385 for (auto &C : VectorizerEndEPCallbacks)
386 C(FPM, Level);
387}
389 OptimizationLevel Level,
391 for (auto &C : OptimizerEarlyEPCallbacks)
392 C(MPM, Level, Phase);
393}
395 OptimizationLevel Level,
397 for (auto &C : OptimizerLastEPCallbacks)
398 C(MPM, Level, Phase);
399}
402 for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
403 C(MPM, Level);
404}
407 for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
408 C(MPM, Level);
409}
411 OptimizationLevel Level) {
412 for (auto &C : PipelineStartEPCallbacks)
413 C(MPM, Level);
414}
417 for (auto &C : PipelineEarlySimplificationEPCallbacks)
418 C(MPM, Level, Phase);
419}
420
421// Get IR stats with InstCount before/after the optimization pipeline
423 bool IsPreOptimization) {
424 if (AreStatisticsEnabled()) {
425 MPM.addPass(
427 }
428}
429
430// Helper to add AnnotationRemarksPass.
438
439// Helper to check if the current compilation phase is preparing for LTO
444
445// Helper to check if the current compilation phase is preparing for FullLTO
446[[maybe_unused]] static bool isFullLTOPreLink(ThinOrFullLTOPhase Phase) {
448}
449
450// Helper to check if the current compilation phase is preparing for ThinLTO
454
455// Helper to check if the current compilation phase is LTO backend
460
461// Helper to check if the current compilation phase is FullLTO backend
465
466// Helper to check if the current compilation phase is ThinLTO backend
470
471// Helper to wrap conditionally Coro passes.
473 // TODO: Skip passes according to Phase.
474 ModulePassManager CoroPM;
475 CoroPM.addPass(CoroEarlyPass());
476 CGSCCPassManager CGPM;
477 CGPM.addPass(CoroSplitPass());
478 CoroPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM)));
479 CoroPM.addPass(CoroCleanupPass());
480 CoroPM.addPass(GlobalDCEPass());
481 return CoroConditionalWrapper(std::move(CoroPM));
482}
483
484// TODO: Investigate the cost/benefit of tail call elimination on debugging.
486PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
488
490
492 FPM.addPass(CountVisitsPass());
493
494 // Form SSA out of local memory accesses after breaking apart aggregates into
495 // scalars.
496 FPM.addPass(SROAPass(SROAOptions::ModifyCFG));
497
498 // Catch trivial redundancies
499 FPM.addPass(EarlyCSEPass(true /* Enable mem-ssa. */));
500
501 // Hoisting of scalars and load expressions.
502 FPM.addPass(
503 SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
504 FPM.addPass(InstCombinePass());
505
506 FPM.addPass(LibCallsShrinkWrapPass());
507
508 invokePeepholeEPCallbacks(FPM, Level);
509
510 FPM.addPass(
511 SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
512
513 // Form canonically associated expression trees, and simplify the trees using
514 // basic mathematical properties. For example, this will form (nearly)
515 // minimal multiplication trees.
516 FPM.addPass(ReassociatePass());
517
518 // Add the primary loop simplification pipeline.
519 // FIXME: Currently this is split into two loop pass pipelines because we run
520 // some function passes in between them. These can and should be removed
521 // and/or replaced by scheduling the loop pass equivalents in the correct
522 // positions. But those equivalent passes aren't powerful enough yet.
523 // Specifically, `SimplifyCFGPass` and `InstCombinePass` are currently still
524 // used. We have `LoopSimplifyCFGPass` which isn't yet powerful enough yet to
525 // fully replace `SimplifyCFGPass`, and the closest to the other we have is
526 // `LoopInstSimplify`.
527 LoopPassManager LPM1, LPM2;
528
529 // Simplify the loop body. We do this initially to clean up after other loop
530 // passes run, either when iterating on a loop or on inner loops with
531 // implications on the outer loop.
532 LPM1.addPass(LoopInstSimplifyPass());
533 LPM1.addPass(LoopSimplifyCFGPass());
534
535 // Try to remove as much code from the loop header as possible,
536 // to reduce amount of IR that will have to be duplicated. However,
537 // do not perform speculative hoisting the first time as LICM
538 // will destroy metadata that may not need to be destroyed if run
539 // after loop rotation.
540 // TODO: Investigate promotion cap for O1.
541 LPM1.addPass(LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
542 /*AllowSpeculation=*/false));
543
544 LPM1.addPass(
545 LoopRotatePass(/*EnableHeaderDuplication=*/true, isLTOPreLink(Phase)));
546 // TODO: Investigate promotion cap for O1.
547 LPM1.addPass(LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
548 /*AllowSpeculation=*/true));
549 LPM1.addPass(SimpleLoopUnswitchPass());
551 LPM1.addPass(LoopFlattenPass());
552
553 LPM2.addPass(LoopIdiomRecognizePass());
554 LPM2.addPass(IndVarSimplifyPass());
555
557
558 LPM2.addPass(LoopDeletionPass());
559
560 // Do not enable unrolling in PreLinkThinLTO phase during sample PGO
561 // because it changes IR to makes profile annotation in back compile
562 // inaccurate. The normal unroller doesn't pay attention to forced full unroll
563 // attributes so we need to make sure and allow the full unroll pass to pay
564 // attention to it.
565 if (!isThinLTOPreLink(Phase) || !PGOOpt ||
566 PGOOpt->Action != PGOOptions::SampleUse)
567 LPM2.addPass(LoopFullUnrollPass(Level.getSpeedupLevel(),
568 /* OnlyWhenForced= */ !PTO.LoopUnrolling,
569 PTO.ForgetAllSCEVInLoopUnroll));
570
572
573 FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM1),
574 /*UseMemorySSA=*/true));
575 FPM.addPass(
576 SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
577 FPM.addPass(InstCombinePass());
578 // The loop passes in LPM2 (LoopFullUnrollPass) do not preserve MemorySSA.
579 // *All* loop passes must preserve it, in order to be able to use it.
580 FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM2),
581 /*UseMemorySSA=*/false));
582
583 // Delete small array after loop unroll.
584 FPM.addPass(SROAPass(SROAOptions::ModifyCFG));
585
586 // Specially optimize memory movement as it doesn't look like dataflow in SSA.
587 FPM.addPass(MemCpyOptPass());
588
589 // Sparse conditional constant propagation.
590 // FIXME: It isn't clear why we do this *after* loop passes rather than
591 // before...
592 FPM.addPass(SCCPPass());
593
594 // Delete dead bit computations (instcombine runs after to fold away the dead
595 // computations, and then ADCE will run later to exploit any new DCE
596 // opportunities that creates).
597 FPM.addPass(BDCEPass());
598
599 // Run instcombine after redundancy and dead bit elimination to exploit
600 // opportunities opened up by them.
601 FPM.addPass(InstCombinePass());
602 invokePeepholeEPCallbacks(FPM, Level);
603
604 FPM.addPass(CoroElidePass());
605
607
608 // Finally, do an expensive DCE pass to catch all the dead code exposed by
609 // the simplifications and basic cleanup after all the simplifications.
610 // TODO: Investigate if this is too expensive.
611 FPM.addPass(ADCEPass());
612 FPM.addPass(
613 SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
614 FPM.addPass(InstCombinePass());
615 invokePeepholeEPCallbacks(FPM, Level);
616
617 return FPM;
618}
619
623 assert(Level != OptimizationLevel::O0 && "Must request optimizations!");
624
625 // The O1 pipeline has a separate pipeline creation function to simplify
626 // construction readability.
627 if (Level.getSpeedupLevel() == 1)
628 return buildO1FunctionSimplificationPipeline(Level, Phase);
629
631
634
635 // Form SSA out of local memory accesses after breaking apart aggregates into
636 // scalars.
638
639 // Catch trivial redundancies
640 FPM.addPass(EarlyCSEPass(true /* Enable mem-ssa. */));
643
644 // Hoisting of scalars and load expressions.
645 if (EnableGVNHoist)
646 FPM.addPass(GVNHoistPass());
647
648 // Global value numbering based sinking.
649 if (EnableGVNSink) {
650 FPM.addPass(GVNSinkPass());
651 FPM.addPass(
652 SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
653 }
654
655 // Speculative execution if the target has divergent branches; otherwise nop.
656 FPM.addPass(SpeculativeExecutionPass(/* OnlyIfDivergentTarget =*/true));
657
658 // Optimize based on known information about branches, and cleanup afterward.
661
662 // Jump table to switch conversion.
665
666 FPM.addPass(
667 SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
671
672 invokePeepholeEPCallbacks(FPM, Level);
673
674 // For PGO use pipeline, try to optimize memory intrinsics such as memcpy
675 // using the size value profile. Don't perform this when optimizing for size.
676 if (PGOOpt && PGOOpt->Action == PGOOptions::IRUse)
678
679 FPM.addPass(TailCallElimPass(/*UpdateFunctionEntryCount=*/
680 isInstrumentedPGOUse()));
681 FPM.addPass(
682 SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
683
684 // Form canonically associated expression trees, and simplify the trees using
685 // basic mathematical properties. For example, this will form (nearly)
686 // minimal multiplication trees.
688
691
692 // Add the primary loop simplification pipeline.
693 // FIXME: Currently this is split into two loop pass pipelines because we run
694 // some function passes in between them. These can and should be removed
695 // and/or replaced by scheduling the loop pass equivalents in the correct
696 // positions. But those equivalent passes aren't powerful enough yet.
697 // Specifically, `SimplifyCFGPass` and `InstCombinePass` are currently still
698 // used. We have `LoopSimplifyCFGPass` which isn't yet powerful enough yet to
699 // fully replace `SimplifyCFGPass`, and the closest to the other we have is
700 // `LoopInstSimplify`.
701 LoopPassManager LPM1, LPM2;
702
703 // Simplify the loop body. We do this initially to clean up after other loop
704 // passes run, either when iterating on a loop or on inner loops with
705 // implications on the outer loop.
706 LPM1.addPass(LoopInstSimplifyPass());
707 LPM1.addPass(LoopSimplifyCFGPass());
708
709 // Try to remove as much code from the loop header as possible,
710 // to reduce amount of IR that will have to be duplicated. However,
711 // do not perform speculative hoisting the first time as LICM
712 // will destroy metadata that may not need to be destroyed if run
713 // after loop rotation.
714 // TODO: Investigate promotion cap for O1.
715 LPM1.addPass(LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
716 /*AllowSpeculation=*/false));
717
718 LPM1.addPass(
719 LoopRotatePass(/*EnableHeaderDuplication=*/true, isLTOPreLink(Phase)));
720 // TODO: Investigate promotion cap for O1.
721 LPM1.addPass(LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
722 /*AllowSpeculation=*/true));
723 LPM1.addPass(
724 SimpleLoopUnswitchPass(/* NonTrivial */ Level == OptimizationLevel::O3));
726 LPM1.addPass(LoopFlattenPass());
727
728 LPM2.addPass(LoopIdiomRecognizePass());
729 LPM2.addPass(IndVarSimplifyPass());
730
731 {
733 ExtraPasses.addPass(SimpleLoopUnswitchPass(/* NonTrivial */ Level ==
735 LPM2.addPass(std::move(ExtraPasses));
736 }
737
739
740 LPM2.addPass(LoopDeletionPass());
741
742 // Do not enable unrolling in PreLinkThinLTO phase during sample PGO
743 // because it changes IR to makes profile annotation in back compile
744 // inaccurate. The normal unroller doesn't pay attention to forced full unroll
745 // attributes so we need to make sure and allow the full unroll pass to pay
746 // attention to it.
747 if (!isThinLTOPreLink(Phase) || !PGOOpt ||
748 PGOOpt->Action != PGOOptions::SampleUse)
749 LPM2.addPass(LoopFullUnrollPass(Level.getSpeedupLevel(),
750 /* OnlyWhenForced= */ !PTO.LoopUnrolling,
751 PTO.ForgetAllSCEVInLoopUnroll));
752
754
755 FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM1),
756 /*UseMemorySSA=*/true));
757 FPM.addPass(
758 SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
760 // The loop passes in LPM2 (LoopIdiomRecognizePass, IndVarSimplifyPass,
761 // LoopDeletionPass and LoopFullUnrollPass) do not preserve MemorySSA.
762 // *All* loop passes must preserve it, in order to be able to use it.
763 FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM2),
764 /*UseMemorySSA=*/false));
765
766 // Delete small array after loop unroll.
768
769 // Try vectorization/scalarization transforms that are both improvements
770 // themselves and can allow further folds with GVN and InstCombine.
771 FPM.addPass(VectorCombinePass(/*TryEarlyFoldsOnly=*/true));
772
773 // Eliminate redundancies.
775 if (RunNewGVN)
776 FPM.addPass(NewGVNPass());
777 else
778 FPM.addPass(GVNPass());
779
780 // Sparse conditional constant propagation.
781 // FIXME: It isn't clear why we do this *after* loop passes rather than
782 // before...
783 FPM.addPass(SCCPPass());
784
785 // Delete dead bit computations (instcombine runs after to fold away the dead
786 // computations, and then ADCE will run later to exploit any new DCE
787 // opportunities that creates).
788 FPM.addPass(BDCEPass());
789
790 // Run instcombine after redundancy and dead bit elimination to exploit
791 // opportunities opened up by them.
793 invokePeepholeEPCallbacks(FPM, Level);
794
795 // Re-consider control flow based optimizations after redundancy elimination,
796 // redo DCE, etc.
799
802
803 // Finally, do an expensive DCE pass to catch all the dead code exposed by
804 // the simplifications and basic cleanup after all the simplifications.
805 // TODO: Investigate if this is too expensive.
806 FPM.addPass(ADCEPass());
807
808 // Specially optimize memory movement as it doesn't look like dataflow in SSA.
809 FPM.addPass(MemCpyOptPass());
810
811 FPM.addPass(DSEPass());
813
815 LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
816 /*AllowSpeculation=*/true),
817 /*UseMemorySSA=*/true));
818
819 FPM.addPass(CoroElidePass());
820
822
824 .convertSwitchRangeToICmp(true)
825 .convertSwitchToArithmetic(true)
826 .hoistCommonInsts(true)
827 .sinkCommonInsts(true)));
829 invokePeepholeEPCallbacks(FPM, Level);
830
831 return FPM;
832}
833
834void PassBuilder::addRequiredLTOPreLinkPasses(ModulePassManager &MPM) {
837}
838
839void PassBuilder::addPreInlinerPasses(ModulePassManager &MPM,
840 OptimizationLevel Level,
841 ThinOrFullLTOPhase LTOPhase) {
842 assert(Level != OptimizationLevel::O0 && "Not expecting O0 here!");
844 return;
845 InlineParams IP;
846
848
849 // FIXME: The hint threshold has the same value used by the regular inliner
850 // when not optimzing for size. This should probably be lowered after
851 // performance testing.
852 // FIXME: this comment is cargo culted from the old pass manager, revisit).
853 IP.HintThreshold = 325;
856 IP, /* MandatoryFirst */ true,
858 CGSCCPassManager &CGPipeline = MIWP.getPM();
859
861 FPM.addPass(SROAPass(SROAOptions::ModifyCFG));
862 FPM.addPass(EarlyCSEPass()); // Catch trivial redundancies.
863 FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
864 true))); // Merge & remove basic blocks.
865 FPM.addPass(InstCombinePass()); // Combine silly sequences.
866 invokePeepholeEPCallbacks(FPM, Level);
867
868 CGPipeline.addPass(createCGSCCToFunctionPassAdaptor(
869 std::move(FPM), PTO.EagerlyInvalidateAnalyses));
870
871 MPM.addPass(std::move(MIWP));
872
873 // Delete anything that is now dead to make sure that we don't instrument
874 // dead code. Instrumentation can end up keeping dead code around and
875 // dramatically increase code size.
876 MPM.addPass(GlobalDCEPass());
877}
878
879void PassBuilder::addPostPGOLoopRotation(ModulePassManager &MPM,
880 OptimizationLevel Level) {
882 // Disable header duplication in loop rotation at -Oz.
884 createFunctionToLoopPassAdaptor(LoopRotatePass(),
885 /*UseMemorySSA=*/false),
886 PTO.EagerlyInvalidateAnalyses));
887 }
888}
889
890void PassBuilder::addPGOInstrPasses(ModulePassManager &MPM,
891 OptimizationLevel Level, bool RunProfileGen,
892 bool IsCS, bool AtomicCounterUpdate,
893 std::string ProfileFile,
894 std::string ProfileRemappingFile) {
895 assert(Level != OptimizationLevel::O0 && "Not expecting O0 here!");
896
897 if (!RunProfileGen) {
898 assert(!ProfileFile.empty() && "Profile use expecting a profile file!");
899 MPM.addPass(
900 PGOInstrumentationUse(ProfileFile, ProfileRemappingFile, IsCS, FS));
901 // Cache ProfileSummaryAnalysis once to avoid the potential need to insert
902 // RequireAnalysisPass for PSI before subsequent non-module passes.
903 MPM.addPass(RequireAnalysisPass<ProfileSummaryAnalysis, Module>());
904 return;
905 }
906
907 // Perform PGO instrumentation.
908 MPM.addPass(PGOInstrumentationGen(IsCS ? PGOInstrumentationType::CSFDO
910
911 addPostPGOLoopRotation(MPM, Level);
912 // Add the profile lowering pass.
913 InstrProfOptions Options;
914 if (!ProfileFile.empty())
915 Options.InstrProfileOutput = ProfileFile;
916 // Do counter promotion at Level greater than O0.
917 Options.DoCounterPromotion = true;
918 Options.UseBFIInPromotion = IsCS;
919 if (EnableSampledInstr) {
920 Options.Sampling = true;
921 // With sampling, there is little beneifit to enable counter promotion.
922 // But note that sampling does work with counter promotion.
923 Options.DoCounterPromotion = false;
924 }
925 Options.Atomic = AtomicCounterUpdate;
926 MPM.addPass(InstrProfilingLoweringPass(Options, IsCS));
927}
928
930 bool RunProfileGen, bool IsCS,
931 bool AtomicCounterUpdate,
932 std::string ProfileFile,
933 std::string ProfileRemappingFile) {
934 if (!RunProfileGen) {
935 assert(!ProfileFile.empty() && "Profile use expecting a profile file!");
936 MPM.addPass(
937 PGOInstrumentationUse(ProfileFile, ProfileRemappingFile, IsCS, FS));
938 // Cache ProfileSummaryAnalysis once to avoid the potential need to insert
939 // RequireAnalysisPass for PSI before subsequent non-module passes.
941 return;
942 }
943
944 // Perform PGO instrumentation.
947 // Add the profile lowering pass.
949 if (!ProfileFile.empty())
950 Options.InstrProfileOutput = ProfileFile;
951 // Do not do counter promotion at O0.
952 Options.DoCounterPromotion = false;
953 Options.UseBFIInPromotion = IsCS;
954 Options.Atomic = AtomicCounterUpdate;
956}
957
959 return getInlineParamsFromOptLevel(Level.getSpeedupLevel());
960}
961
965 InlineParams IP;
966 if (PTO.InlinerThreshold == -1)
968 else
969 IP = getInlineParams(PTO.InlinerThreshold);
970 // For PreLinkThinLTO + SamplePGO or PreLinkFullLTO + SamplePGO,
971 // set hot-caller threshold to 0 to disable hot
972 // callsite inline (as much as possible [1]) because it makes
973 // profile annotation in the backend inaccurate.
974 //
975 // [1] Note the cost of a function could be below zero due to erased
976 // prologue / epilogue.
977 if (isLTOPreLink(Phase) && PGOOpt && PGOOpt->Action == PGOOptions::SampleUse)
979
980 if (PGOOpt)
982
986
987 // Require the GlobalsAA analysis for the module so we can query it within
988 // the CGSCC pipeline.
990 MIWP.addModulePass(RequireAnalysisPass<GlobalsAA, Module>());
991 // Invalidate AAManager so it can be recreated and pick up the newly
992 // available GlobalsAA.
993 MIWP.addModulePass(
995 }
996
997 // Require the ProfileSummaryAnalysis for the module so we can query it within
998 // the inliner pass.
1000
1001 // Now begin the main postorder CGSCC pipeline.
1002 // FIXME: The current CGSCC pipeline has its origins in the legacy pass
1003 // manager and trying to emulate its precise behavior. Much of this doesn't
1004 // make a lot of sense and we should revisit the core CGSCC structure.
1005 CGSCCPassManager &MainCGPipeline = MIWP.getPM();
1006
1007 // Note: historically, the PruneEH pass was run first to deduce nounwind and
1008 // generally clean up exception handling overhead. It isn't clear this is
1009 // valuable as the inliner doesn't currently care whether it is inlining an
1010 // invoke or a call.
1011
1013 MainCGPipeline.addPass(AttributorCGSCCPass());
1015 MainCGPipeline.addPass(AttributorLightCGSCCPass());
1016
1017 // Deduce function attributes. We do another run of this after the function
1018 // simplification pipeline, so this only needs to run when it could affect the
1019 // function simplification pipeline, which is only the case with recursive
1020 // functions.
1021 MainCGPipeline.addPass(PostOrderFunctionAttrsPass(/*SkipNonRecursive*/ true));
1022
1023 // When at O3 add argument promotion to the pass pipeline.
1024 // FIXME: It isn't at all clear why this should be limited to O3.
1025 if (Level == OptimizationLevel::O3)
1026 MainCGPipeline.addPass(ArgumentPromotionPass());
1027
1028 // Try to perform OpenMP specific optimizations. This is a (quick!) no-op if
1029 // there are no OpenMP runtime calls present in the module.
1030 if (Level == OptimizationLevel::O2 || Level == OptimizationLevel::O3)
1031 MainCGPipeline.addPass(OpenMPOptCGSCCPass(Phase));
1032
1033 invokeCGSCCOptimizerLateEPCallbacks(MainCGPipeline, Level);
1034
1035 // Add the core function simplification pipeline nested inside the
1036 // CGSCC walk.
1039 PTO.EagerlyInvalidateAnalyses, /*NoRerun=*/true));
1040
1041 // Finally, deduce any function attributes based on the fully simplified
1042 // function.
1043 MainCGPipeline.addPass(PostOrderFunctionAttrsPass());
1044
1045 // Mark that the function is fully simplified and that it shouldn't be
1046 // simplified again if we somehow revisit it due to CGSCC mutations unless
1047 // it's been modified since.
1050
1051 if (!isThinLTOPreLink(Phase)) {
1052 MainCGPipeline.addPass(CoroSplitPass(Level != OptimizationLevel::O0));
1053 MainCGPipeline.addPass(CoroAnnotationElidePass());
1054 }
1055
1056 // Make sure we don't affect potential future NoRerun CGSCC adaptors.
1057 MIWP.addLateModulePass(createModuleToFunctionPassAdaptor(
1059
1060 return MIWP;
1061}
1062
1067
1069 // For PreLinkThinLTO + SamplePGO or PreLinkFullLTO + SamplePGO,
1070 // set hot-caller threshold to 0 to disable hot
1071 // callsite inline (as much as possible [1]) because it makes
1072 // profile annotation in the backend inaccurate.
1073 //
1074 // [1] Note the cost of a function could be below zero due to erased
1075 // prologue / epilogue.
1076 if (isLTOPreLink(Phase) && PGOOpt && PGOOpt->Action == PGOOptions::SampleUse)
1077 IP.HotCallSiteThreshold = 0;
1078
1079 if (PGOOpt)
1081
1082 // The inline deferral logic is used to avoid losing some
1083 // inlining chance in future. It is helpful in SCC inliner, in which
1084 // inlining is processed in bottom-up order.
1085 // While in module inliner, the inlining order is a priority-based order
1086 // by default. The inline deferral is unnecessary there. So we disable the
1087 // inline deferral logic in module inliner.
1088 IP.EnableDeferral = false;
1089
1092 MPM.addPass(GlobalOptPass());
1093 MPM.addPass(GlobalDCEPass());
1094 MPM.addPass(PGOCtxProfFlatteningPass(/*IsPreThinlink=*/false));
1095 }
1096
1099 PTO.EagerlyInvalidateAnalyses));
1100
1101 if (!isThinLTOPreLink(Phase)) {
1104 MPM.addPass(
1106 }
1107
1108 return MPM;
1109}
1110
1114 assert(Level != OptimizationLevel::O0 &&
1115 "Should not be used for O0 pipeline");
1116
1118 "FullLTOPostLink shouldn't call buildModuleSimplificationPipeline!");
1119
1121
1122 // Place pseudo probe instrumentation as the first pass of the pipeline to
1123 // minimize the impact of optimization changes.
1124 if (PGOOpt && PGOOpt->PseudoProbeForProfiling && !isThinLTOPostLink(Phase))
1126
1127 bool HasSampleProfile = PGOOpt && (PGOOpt->Action == PGOOptions::SampleUse);
1128
1129 // In ThinLTO mode, when flattened profile is used, all the available
1130 // profile information will be annotated in PreLink phase so there is
1131 // no need to load the profile again in PostLink.
1132 bool LoadSampleProfile =
1133 HasSampleProfile && !(FlattenedProfileUsed && isThinLTOPostLink(Phase));
1134
1135 // During the ThinLTO backend phase we perform early indirect call promotion
1136 // here, before globalopt. Otherwise imported available_externally functions
1137 // look unreferenced and are removed. If we are going to load the sample
1138 // profile then defer until later.
1139 // TODO: See if we can move later and consolidate with the location where
1140 // we perform ICP when we are loading a sample profile.
1141 // TODO: We pass HasSampleProfile (whether there was a sample profile file
1142 // passed to the compile) to the SamplePGO flag of ICP. This is used to
1143 // determine whether the new direct calls are annotated with prof metadata.
1144 // Ideally this should be determined from whether the IR is annotated with
1145 // sample profile, and not whether the a sample profile was provided on the
1146 // command line. E.g. for flattened profiles where we will not be reloading
1147 // the sample profile in the ThinLTO backend, we ideally shouldn't have to
1148 // provide the sample profile file.
1149 if (isThinLTOPostLink(Phase) && !LoadSampleProfile)
1150 MPM.addPass(PGOIndirectCallPromotion(true /* InLTO */, HasSampleProfile));
1151
1152 // Create an early function pass manager to cleanup the output of the
1153 // frontend. Not necessary with LTO post link pipelines since the pre link
1154 // pipeline already cleaned up the frontend output.
1155 if (!isThinLTOPostLink(Phase)) {
1156 // Do basic inference of function attributes from known properties of system
1157 // libraries and other oracles.
1159 MPM.addPass(CoroEarlyPass());
1160
1161 FunctionPassManager EarlyFPM;
1162 EarlyFPM.addPass(EntryExitInstrumenterPass(/*PostInlining=*/false));
1163 // Lower llvm.expect to metadata before attempting transforms.
1164 // Compare/branch metadata may alter the behavior of passes like
1165 // SimplifyCFG.
1167 EarlyFPM.addPass(SimplifyCFGPass());
1169 EarlyFPM.addPass(EarlyCSEPass());
1170 if (Level == OptimizationLevel::O3)
1171 EarlyFPM.addPass(CallSiteSplittingPass());
1173 std::move(EarlyFPM), PTO.EagerlyInvalidateAnalyses));
1174 }
1175
1176 if (LoadSampleProfile) {
1177 // Annotate sample profile right after early FPM to ensure freshness of
1178 // the debug info.
1180 PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile, Phase, FS));
1181 // Cache ProfileSummaryAnalysis once to avoid the potential need to insert
1182 // RequireAnalysisPass for PSI before subsequent non-module passes.
1184 // Do not invoke ICP in the LTOPrelink phase as it makes it hard
1185 // for the profile annotation to be accurate in the LTO backend.
1186 if (!isLTOPreLink(Phase))
1187 // We perform early indirect call promotion here, before globalopt.
1188 // This is important for the ThinLTO backend phase because otherwise
1189 // imported available_externally functions look unreferenced and are
1190 // removed.
1191 MPM.addPass(
1192 PGOIndirectCallPromotion(true /* IsInLTO */, true /* SamplePGO */));
1193 }
1194
1195 // Try to perform OpenMP specific optimizations on the module. This is a
1196 // (quick!) no-op if there are no OpenMP runtime calls present in the module.
1198
1200 MPM.addPass(AttributorPass());
1203
1204 // Lower type metadata and the type.test intrinsic in the ThinLTO
1205 // post link pipeline after ICP. This is to enable usage of the type
1206 // tests in ICP sequences.
1209
1211
1212 // Interprocedural constant propagation now that basic cleanup has occurred
1213 // and prior to optimizing globals.
1214 // FIXME: This position in the pipeline hasn't been carefully considered in
1215 // years, it should be re-analyzed.
1216 MPM.addPass(
1217 IPSCCPPass(IPSCCPOptions(/*AllowFuncSpec=*/!isLTOPreLink(Phase))));
1218
1219 // Attach metadata to indirect call sites indicating the set of functions
1220 // they may target at run-time. This should follow IPSCCP.
1222
1223 // Optimize globals to try and fold them into constants.
1224 MPM.addPass(GlobalOptPass());
1225
1226 // Create a small function pass pipeline to cleanup after all the global
1227 // optimizations.
1228 FunctionPassManager GlobalCleanupPM;
1229 // FIXME: Should this instead by a run of SROA?
1230 GlobalCleanupPM.addPass(PromotePass());
1231 GlobalCleanupPM.addPass(InstCombinePass());
1232 invokePeepholeEPCallbacks(GlobalCleanupPM, Level);
1233 GlobalCleanupPM.addPass(
1234 SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
1235 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(GlobalCleanupPM),
1236 PTO.EagerlyInvalidateAnalyses));
1237
1238 // We already asserted this happens in non-FullLTOPostLink earlier.
1239 const bool IsPreLink = !isThinLTOPostLink(Phase);
1240 // Enable contextual profiling instrumentation.
1241 const bool IsCtxProfGen =
1243 const bool IsPGOPreLink = !IsCtxProfGen && PGOOpt && IsPreLink;
1244 const bool IsPGOInstrGen =
1245 IsPGOPreLink && PGOOpt->Action == PGOOptions::IRInstr;
1246 const bool IsPGOInstrUse =
1247 IsPGOPreLink && PGOOpt->Action == PGOOptions::IRUse;
1248 const bool IsMemprofUse = IsPGOPreLink && !PGOOpt->MemoryProfile.empty();
1249 // We don't want to mix pgo ctx gen and pgo gen; we also don't currently
1250 // enable ctx profiling from the frontend.
1252 "Enabling both instrumented PGO and contextual instrumentation is not "
1253 "supported.");
1254 const bool IsCtxProfUse = !UseCtxProfile.empty() && isThinLTOPreLink(Phase);
1255
1256 assert(
1258 "--instrument-cold-function-only-path is provided but "
1259 "--pgo-instrument-cold-function-only is not enabled");
1260 const bool IsColdFuncOnlyInstrGen = PGOInstrumentColdFunctionOnly &&
1261 IsPGOPreLink &&
1263
1264 if (IsPGOInstrGen || IsPGOInstrUse || IsMemprofUse || IsCtxProfGen ||
1265 IsCtxProfUse || IsColdFuncOnlyInstrGen)
1266 addPreInlinerPasses(MPM, Level, Phase);
1267
1268 // Add all the requested passes for instrumentation PGO, if requested.
1269 if (IsPGOInstrGen || IsPGOInstrUse) {
1270 addPGOInstrPasses(MPM, Level,
1271 /*RunProfileGen=*/IsPGOInstrGen,
1272 /*IsCS=*/false, PGOOpt->AtomicCounterUpdate,
1273 PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile);
1274 } else if (IsCtxProfGen || IsCtxProfUse) {
1276 // In pre-link, we just want the instrumented IR. We use the contextual
1277 // profile in the post-thinlink phase.
1278 // The instrumentation will be removed in post-thinlink after IPO.
1279 // FIXME(mtrofin): move AssignGUIDPass if there is agreement to use this
1280 // mechanism for GUIDs.
1281 MPM.addPass(AssignGUIDPass());
1282 if (IsCtxProfUse) {
1283 MPM.addPass(PGOCtxProfFlatteningPass(/*IsPreThinlink=*/true));
1284 return MPM;
1285 }
1286 // Block further inlining in the instrumented ctxprof case. This avoids
1287 // confusingly collecting profiles for the same GUID corresponding to
1288 // different variants of the function. We could do like PGO and identify
1289 // functions by a (GUID, Hash) tuple, but since the ctxprof "use" waits for
1290 // thinlto to happen before performing any further optimizations, it's
1291 // unnecessary to collect profiles for non-prevailing copies.
1293 addPostPGOLoopRotation(MPM, Level);
1295 } else if (IsColdFuncOnlyInstrGen) {
1296 addPGOInstrPasses(MPM, Level, /* RunProfileGen */ true, /* IsCS */ false,
1297 /* AtomicCounterUpdate */ false,
1299 /* ProfileRemappingFile */ "");
1300 }
1301
1302 if (IsPGOInstrGen || IsPGOInstrUse || IsCtxProfGen)
1303 MPM.addPass(PGOIndirectCallPromotion(false, false));
1304
1305 if (IsPGOPreLink && PGOOpt->CSAction == PGOOptions::CSIRInstr)
1306 MPM.addPass(PGOInstrumentationGenCreateVar(PGOOpt->CSProfileGenFile,
1308
1309 if (IsMemprofUse)
1310 MPM.addPass(MemProfUsePass(PGOOpt->MemoryProfile, FS));
1311
1312 if (PGOOpt && (PGOOpt->Action == PGOOptions::IRUse ||
1313 PGOOpt->Action == PGOOptions::SampleUse))
1314 MPM.addPass(PGOForceFunctionAttrsPass(PGOOpt->ColdOptType));
1315
1316 MPM.addPass(AlwaysInlinerPass(/*InsertLifetimeIntrinsics=*/true));
1317
1320 else
1321 MPM.addPass(buildInlinerPipeline(Level, Phase));
1322
1323 // Remove any dead arguments exposed by cleanups, constant folding globals,
1324 // and argument promotion.
1326
1329
1330 if (!isThinLTOPreLink(Phase))
1331 MPM.addPass(CoroCleanupPass());
1332
1333 // Optimize globals now that functions are fully simplified.
1334 MPM.addPass(GlobalOptPass());
1335 MPM.addPass(GlobalDCEPass());
1336
1337 return MPM;
1338}
1339
1340/// TODO: Should LTO cause any differences to this set of passes?
1341void PassBuilder::addVectorPasses(OptimizationLevel Level,
1343 ThinOrFullLTOPhase LTOPhase) {
1346
1347 // Drop dereferenceable assumes after vectorization, as they are no longer
1348 // needed and can inhibit further optimization.
1349 if (!isLTOPreLink(LTOPhase))
1350 FPM.addPass(DropUnnecessaryAssumesPass(/*DropDereferenceable=*/true));
1351
1353 if (isFullLTOPostLink(LTOPhase)) {
1354 // The vectorizer may have significantly shortened a loop body; unroll
1355 // again. Unroll small loops to hide loop backedge latency and saturate any
1356 // parallel execution resources of an out-of-order processor. We also then
1357 // need to clean up redundancies and loop invariant code.
1358 // FIXME: It would be really good to use a loop-integrated instruction
1359 // combiner for cleanup here so that the unrolling and LICM can be pipelined
1360 // across the loop nests.
1361 // We do UnrollAndJam in a separate LPM to ensure it happens before unroll
1364 LoopUnrollAndJamPass(Level.getSpeedupLevel())));
1366 Level.getSpeedupLevel(), /*OnlyWhenForced=*/!PTO.LoopUnrolling,
1369 // Now that we are done with loop unrolling, be it either by LoopVectorizer,
1370 // or LoopUnroll passes, some variable-offset GEP's into alloca's could have
1371 // become constant-offset, thus enabling SROA and alloca promotion. Do so.
1372 // NOTE: we are very late in the pipeline, and we don't have any LICM
1373 // or SimplifyCFG passes scheduled after us, that would cleanup
1374 // the CFG mess this may created if allowed to modify CFG, so forbid that.
1376 }
1377
1378 if (!isFullLTOPostLink(LTOPhase)) {
1379 // Eliminate loads by forwarding stores from the previous iteration to loads
1380 // of the current iteration.
1382 }
1383 // Cleanup after the loop optimization passes.
1384 FPM.addPass(InstCombinePass());
1385
1386 if (Level.getSpeedupLevel() > 1 && ExtraVectorizerPasses) {
1387 ExtraFunctionPassManager<ShouldRunExtraVectorPasses> ExtraPasses;
1388 // At higher optimization levels, try to clean up any runtime overlap and
1389 // alignment checks inserted by the vectorizer. We want to track correlated
1390 // runtime checks for two inner loops in the same outer loop, fold any
1391 // common computations, hoist loop-invariant aspects out of any outer loop,
1392 // and unswitch the runtime checks if possible. Once hoisted, we may have
1393 // dead (or speculatable) control flows or more combining opportunities.
1394 ExtraPasses.addPass(EarlyCSEPass());
1395 ExtraPasses.addPass(CorrelatedValuePropagationPass());
1396 ExtraPasses.addPass(InstCombinePass());
1397 LoopPassManager LPM;
1398 LPM.addPass(LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
1399 /*AllowSpeculation=*/true));
1400 LPM.addPass(SimpleLoopUnswitchPass(/* NonTrivial */ Level ==
1402 ExtraPasses.addPass(
1403 createFunctionToLoopPassAdaptor(std::move(LPM), /*UseMemorySSA=*/true));
1404 ExtraPasses.addPass(
1405 SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
1406 ExtraPasses.addPass(InstCombinePass());
1407 FPM.addPass(std::move(ExtraPasses));
1408 }
1409
1410 // Now that we've formed fast to execute loop structures, we do further
1411 // optimizations. These are run afterward as they might block doing complex
1412 // analyses and transforms such as what are needed for loop vectorization.
1413
1414 // Cleanup after loop vectorization, etc. Simplification passes like CVP and
1415 // GVN, loop transforms, and others have already run, so it's now better to
1416 // convert to more optimized IR using more aggressive simplify CFG options.
1417 // The extra sinking transform can create larger basic blocks, so do this
1418 // before SLP vectorization.
1419 FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions()
1420 .forwardSwitchCondToPhi(true)
1421 .convertSwitchRangeToICmp(true)
1422 .convertSwitchToArithmetic(true)
1423 .convertSwitchToLookupTable(true)
1424 .needCanonicalLoops(false)
1425 .hoistCommonInsts(true)
1426 .sinkCommonInsts(true)));
1427
1428 if (isFullLTOPostLink(LTOPhase)) {
1429 FPM.addPass(SCCPPass());
1430 FPM.addPass(InstCombinePass());
1431 FPM.addPass(BDCEPass());
1432 }
1433
1434 // Optimize parallel scalar instruction chains into SIMD instructions.
1435 if (PTO.SLPVectorization) {
1436 FPM.addPass(SLPVectorizerPass());
1437 if (Level.getSpeedupLevel() > 1 && ExtraVectorizerPasses) {
1438 FPM.addPass(EarlyCSEPass());
1439 }
1440 }
1441 // Enhance/cleanup vector code.
1442 FPM.addPass(VectorCombinePass());
1443
1444 if (!isFullLTOPostLink(LTOPhase)) {
1445 FPM.addPass(InstCombinePass());
1446 // Unroll small loops to hide loop backedge latency and saturate any
1447 // parallel execution resources of an out-of-order processor. We also then
1448 // need to clean up redundancies and loop invariant code.
1449 // FIXME: It would be really good to use a loop-integrated instruction
1450 // combiner for cleanup here so that the unrolling and LICM can be pipelined
1451 // across the loop nests.
1452 // We do UnrollAndJam in a separate LPM to ensure it happens before unroll
1453 if (EnableUnrollAndJam && PTO.LoopUnrolling) {
1455 LoopUnrollAndJamPass(Level.getSpeedupLevel())));
1456 }
1457 FPM.addPass(LoopUnrollPass(LoopUnrollOptions(
1458 Level.getSpeedupLevel(), /*OnlyWhenForced=*/!PTO.LoopUnrolling,
1459 PTO.ForgetAllSCEVInLoopUnroll)));
1460 FPM.addPass(WarnMissedTransformationsPass());
1461 // Now that we are done with loop unrolling, be it either by LoopVectorizer,
1462 // or LoopUnroll passes, some variable-offset GEP's into alloca's could have
1463 // become constant-offset, thus enabling SROA and alloca promotion. Do so.
1464 // NOTE: we are very late in the pipeline, and we don't have any LICM
1465 // or SimplifyCFG passes scheduled after us, that would cleanup
1466 // the CFG mess this may created if allowed to modify CFG, so forbid that.
1467 FPM.addPass(SROAPass(SROAOptions::PreserveCFG));
1468 }
1469
1470 FPM.addPass(InferAlignmentPass());
1471 FPM.addPass(InstCombinePass());
1472
1473 // This is needed for two reasons:
1474 // 1. It works around problems that instcombine introduces, such as sinking
1475 // expensive FP divides into loops containing multiplications using the
1476 // divide result.
1477 // 2. It helps to clean up some loop-invariant code created by the loop
1478 // unroll pass when IsFullLTO=false.
1480 LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
1481 /*AllowSpeculation=*/true),
1482 /*UseMemorySSA=*/true));
1483
1484 // Now that we've vectorized and unrolled loops, we may have more refined
1485 // alignment information, try to re-derive it here.
1486 FPM.addPass(AlignmentFromAssumptionsPass());
1487}
1488
1491 ThinOrFullLTOPhase LTOPhase) {
1493
1494 // Run partial inlining pass to partially inline functions that have
1495 // large bodies.
1498
1499 // Remove avail extern fns and globals definitions since we aren't compiling
1500 // an object file for later LTO. For LTO we want to preserve these so they
1501 // are eligible for inlining at link-time. Note if they are unreferenced they
1502 // will be removed by GlobalDCE later, so this only impacts referenced
1503 // available externally globals. Eventually they will be suppressed during
1504 // codegen, but eliminating here enables more opportunity for GlobalDCE as it
1505 // may make globals referenced by available external functions dead and saves
1506 // running remaining passes on the eliminated functions. These should be
1507 // preserved during prelinking for link-time inlining decisions.
1508 if (!isLTOPreLink(LTOPhase))
1510
1511 // Do RPO function attribute inference across the module to forward-propagate
1512 // attributes where applicable.
1513 // FIXME: Is this really an optimization rather than a canonicalization?
1515
1516 // Do a post inline PGO instrumentation and use pass. This is a context
1517 // sensitive PGO pass. We don't want to do this in LTOPreLink phrase as
1518 // cross-module inline has not been done yet. The context sensitive
1519 // instrumentation is after all the inlines are done.
1520 if (!isLTOPreLink(LTOPhase) && PGOOpt) {
1521 if (PGOOpt->CSAction == PGOOptions::CSIRInstr)
1522 addPGOInstrPasses(MPM, Level, /*RunProfileGen=*/true,
1523 /*IsCS=*/true, PGOOpt->AtomicCounterUpdate,
1524 PGOOpt->CSProfileGenFile, PGOOpt->ProfileRemappingFile);
1525 else if (PGOOpt->CSAction == PGOOptions::CSIRUse)
1526 addPGOInstrPasses(MPM, Level, /*RunProfileGen=*/false,
1527 /*IsCS=*/true, PGOOpt->AtomicCounterUpdate,
1528 PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile);
1529 }
1530
1531 // Re-compute GlobalsAA here prior to function passes. This is particularly
1532 // useful as the above will have inlined, DCE'ed, and function-attr
1533 // propagated everything. We should at this point have a reasonably minimal
1534 // and richly annotated call graph. By computing aliasing and mod/ref
1535 // information for all local globals here, the late loop passes and notably
1536 // the vectorizer will be able to use them to help recognize vectorizable
1537 // memory operations.
1540
1541 invokeOptimizerEarlyEPCallbacks(MPM, Level, LTOPhase);
1542
1543 FunctionPassManager OptimizePM;
1544
1545 // Only drop unnecessary assumes post-inline and post-link, as otherwise
1546 // additional uses of the affected value may be introduced through inlining
1547 // and CSE.
1548 if (!isLTOPreLink(LTOPhase))
1549 OptimizePM.addPass(DropUnnecessaryAssumesPass());
1550
1551 // Scheduling LoopVersioningLICM when inlining is over, because after that
1552 // we may see more accurate aliasing. Reason to run this late is that too
1553 // early versioning may prevent further inlining due to increase of code
1554 // size. Other optimizations which runs later might get benefit of no-alias
1555 // assumption in clone loop.
1557 OptimizePM.addPass(
1559 // LoopVersioningLICM pass might increase new LICM opportunities.
1561 LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
1562 /*AllowSpeculation=*/true),
1563 /*USeMemorySSA=*/true));
1564 }
1565
1566 OptimizePM.addPass(Float2IntPass());
1568
1569 if (EnableMatrix) {
1570 OptimizePM.addPass(LowerMatrixIntrinsicsPass());
1571 OptimizePM.addPass(EarlyCSEPass());
1572 }
1573
1574 // CHR pass should only be applied with the profile information.
1575 // The check is to check the profile summary information in CHR.
1576 if (EnableCHR && Level == OptimizationLevel::O3)
1577 OptimizePM.addPass(ControlHeightReductionPass());
1578
1579 // FIXME: We need to run some loop optimizations to re-rotate loops after
1580 // simplifycfg and others undo their rotation.
1581
1582 // Optimize the loop execution. These passes operate on entire loop nests
1583 // rather than on each loop in an inside-out manner, and so they are actually
1584 // function passes.
1585
1586 invokeVectorizerStartEPCallbacks(OptimizePM, Level);
1587
1588 LoopPassManager LPM;
1589 // First rotate loops that may have been un-rotated by prior passes.
1590 // Disable header duplication at -Oz.
1591 LPM.addPass(LoopRotatePass(/*EnableLoopHeaderDuplication=*/true,
1592 isLTOPreLink(LTOPhase),
1593 /*CheckExitCount=*/true));
1594 // Some loops may have become dead by now. Try to delete them.
1595 // FIXME: see discussion in https://reviews.llvm.org/D112851,
1596 // this may need to be revisited once we run GVN before loop deletion
1597 // in the simplification pipeline.
1598 LPM.addPass(LoopDeletionPass());
1599
1600 if (PTO.LoopInterchange)
1601 LPM.addPass(LoopInterchangePass());
1602
1603 OptimizePM.addPass(
1604 createFunctionToLoopPassAdaptor(std::move(LPM), /*UseMemorySSA=*/false));
1605
1606 // FIXME: This may not be the right place in the pipeline.
1607 // We need to have the data to support the right place.
1608 if (PTO.LoopFusion)
1609 OptimizePM.addPass(LoopFusePass());
1610
1611 // Distribute loops to allow partial vectorization. I.e. isolate dependences
1612 // into separate loop that would otherwise inhibit vectorization. This is
1613 // currently only performed for loops marked with the metadata
1614 // llvm.loop.distribute=true or when -enable-loop-distribute is specified.
1615 OptimizePM.addPass(LoopDistributePass());
1616
1617 // Populates the VFABI attribute with the scalar-to-vector mappings
1618 // from the TargetLibraryInfo.
1619 OptimizePM.addPass(InjectTLIMappings());
1620
1621 addVectorPasses(Level, OptimizePM, LTOPhase);
1622
1623 invokeVectorizerEndEPCallbacks(OptimizePM, Level);
1624
1625 // LoopSink pass sinks instructions hoisted by LICM, which serves as a
1626 // canonicalization pass that enables other optimizations. As a result,
1627 // LoopSink pass needs to be a very late IR pass to avoid undoing LICM
1628 // result too early.
1629 OptimizePM.addPass(LoopSinkPass());
1630
1631 // And finally clean up LCSSA form before generating code.
1632 OptimizePM.addPass(InstSimplifyPass());
1633
1634 // This hoists/decomposes div/rem ops. It should run after other sink/hoist
1635 // passes to avoid re-sinking, but before SimplifyCFG because it can allow
1636 // flattening of blocks.
1637 OptimizePM.addPass(DivRemPairsPass());
1638
1639 // Merge adjacent icmps into memcmp, then expand memcmp to loads/compares.
1640 // TODO: move this furter up so that it can be optimized by GVN, etc.
1641 if (EnableMergeICmps)
1642 OptimizePM.addPass(MergeICmpsPass());
1643 OptimizePM.addPass(ExpandMemCmpPass());
1644
1645 // Try to annotate calls that were created during optimization.
1646 OptimizePM.addPass(
1647 TailCallElimPass(/*UpdateFunctionEntryCount=*/isInstrumentedPGOUse()));
1648
1649 // LoopSink (and other loop passes since the last simplifyCFG) might have
1650 // resulted in single-entry-single-exit or empty blocks. Clean up the CFG.
1651 OptimizePM.addPass(
1653 .convertSwitchRangeToICmp(true)
1654 .convertSwitchToArithmetic(true)
1655 .speculateUnpredictables(true)
1656 .hoistLoadsStoresWithCondFaulting(true)));
1657
1658 // Add the core optimizing pipeline.
1659 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM),
1660 PTO.EagerlyInvalidateAnalyses));
1661
1662 // AllocToken transforms heap allocation calls; this needs to run late after
1663 // other allocation call transformations (such as those in InstCombine).
1664 if (!isLTOPreLink(LTOPhase))
1665 MPM.addPass(AllocTokenPass());
1666
1667 invokeOptimizerLastEPCallbacks(MPM, Level, LTOPhase);
1668
1669 // Run the Instrumentor pass late.
1671 MPM.addPass(InstrumentorPass(FS));
1672
1673 // Split out cold code. Splitting is done late to avoid hiding context from
1674 // other optimizations and inadvertently regressing performance. The tradeoff
1675 // is that this has a higher code size cost than splitting early.
1676 if (EnableHotColdSplit && !isLTOPreLink(LTOPhase))
1678
1679 // Search the code for similar regions of code. If enough similar regions can
1680 // be found where extracting the regions into their own function will decrease
1681 // the size of the program, we extract the regions, a deduplicate the
1682 // structurally similar regions.
1683 if (EnableIROutliner)
1684 MPM.addPass(IROutlinerPass());
1685
1686 // Now we need to do some global optimization transforms.
1687 // FIXME: It would seem like these should come first in the optimization
1688 // pipeline and maybe be the bottom of the canonicalization pipeline? Weird
1689 // ordering here.
1690 MPM.addPass(GlobalDCEPass());
1692
1693 // Merge functions if requested. It has a better chance to merge functions
1694 // after ConstantMerge folded jump tables.
1695 if (PTO.MergeFunctions)
1697
1698 if (PTO.CallGraphProfile && !isLTOPreLink(LTOPhase))
1699 MPM.addPass(CGProfilePass(isLTOPostLink(LTOPhase)));
1700
1701 // RelLookupTableConverterPass runs later in LTO post-link pipeline.
1702 if (!isLTOPreLink(LTOPhase))
1704
1705 // Add devirtualization pass only when LTO is not enabled, as otherwise
1706 // the pass is already enabled in the LTO pipeline.
1707 if (PTO.DevirtualizeSpeculatively && LTOPhase == ThinOrFullLTOPhase::None) {
1708 // TODO: explore a better pipeline configuration that can improve
1709 // compilation time overhead.
1711 /*ExportSummary*/ nullptr,
1712 /*ImportSummary*/ nullptr,
1713 /*DevirtSpeculatively*/ PTO.DevirtualizeSpeculatively));
1715 // Given that the devirtualization creates more opportunities for inlining,
1716 // we run the Inliner again here to maximize the optimization gain we
1717 // get from devirtualization.
1718 // Also, we can't run devirtualization before inlining because the
1719 // devirtualization depends on the passes optimizing/eliminating vtable GVs
1720 // and those passes are only effective after inlining.
1721 if (EnableModuleInliner) {
1725 } else {
1728 /* MandatoryFirst */ true,
1730 }
1731 }
1732 return MPM;
1733}
1734
1738 if (Level == OptimizationLevel::O0)
1739 return buildO0DefaultPipeline(Level, Phase);
1740
1742 instructionCountersPass(MPM, /* IsPreOptimization */ true);
1743 // Currently this pipeline is only invoked in an LTO pre link pass or when we
1744 // are not running LTO. If that changes the below checks may need updating.
1746
1747 // If we are invoking this in non-LTO mode, remove any MemProf related
1748 // attributes and metadata, as we don't know whether we are linking with
1749 // a library containing the necessary interfaces.
1752
1753 // Convert @llvm.global.annotations to !annotation metadata.
1755
1756 // Force any function attributes we want the rest of the pipeline to observe.
1758
1759 if (PGOOpt && PGOOpt->DebugInfoForProfiling)
1761
1762 // Apply module pipeline start EP callback.
1764
1765 // Add the core simplification pipeline.
1767
1768 // Now add the optimization pipeline.
1770
1771 if (PGOOpt && PGOOpt->PseudoProbeForProfiling &&
1772 PGOOpt->Action == PGOOptions::SampleUse)
1774
1775 // Emit annotation remarks.
1777
1778 if (isLTOPreLink(Phase))
1779 addRequiredLTOPreLinkPasses(MPM);
1780
1781 instructionCountersPass(MPM, /* IsPreOptimization */ false);
1782 return MPM;
1783}
1784
1787 bool EmitSummary) {
1789
1790 instructionCountersPass(MPM, /* IsPreOptimization */ true);
1791
1792 if (ThinLTO)
1794 else
1796 MPM.addPass(EmbedBitcodePass(ThinLTO, EmitSummary));
1797
1798 // Perform any cleanups to the IR that aren't suitable for per TU compilation,
1799 // like removing CFI/WPD related instructions. Note, we reuse
1800 // DropTypeTestsPass to clean up type tests rather than duplicate that logic
1801 // in FatLtoCleanup.
1802 MPM.addPass(FatLtoCleanup());
1803
1804 // If we're doing FatLTO w/ CFI enabled, we don't want the type tests in the
1805 // object code, only in the bitcode section, so drop it before we run
1806 // module optimization and generate machine code. If llvm.type.test() isn't in
1807 // the IR, this won't do anything.
1809
1810 // Use the ThinLTO post-link pipeline with sample profiling
1811 if (ThinLTO && PGOOpt && PGOOpt->Action == PGOOptions::SampleUse)
1812 MPM.addPass(buildThinLTODefaultPipeline(Level, /*ImportSummary=*/nullptr));
1813 else {
1814 // ModuleSimplification does not run the coroutine passes for
1815 // ThinLTOPreLink, so we need the coroutine passes to run for ThinLTO
1816 // builds, otherwise they will miscompile.
1817 if (ThinLTO) {
1818 // TODO: replace w/ buildCoroWrapper() when it takes phase and level into
1819 // consideration.
1820 CGSCCPassManager CGPM;
1824 MPM.addPass(CoroCleanupPass());
1825 }
1826
1827 // otherwise, just use module optimization
1828 MPM.addPass(
1830 // Emit annotation remarks.
1832 }
1833
1834 instructionCountersPass(MPM, /* IsPreOptimization */ false);
1835
1836 return MPM;
1837}
1838
1841 if (Level == OptimizationLevel::O0)
1843
1845
1846 instructionCountersPass(MPM, /* IsPreOptimization */ true);
1847
1848 // Convert @llvm.global.annotations to !annotation metadata.
1850
1851 // Force any function attributes we want the rest of the pipeline to observe.
1853
1854 if (PGOOpt && PGOOpt->DebugInfoForProfiling)
1856
1857 // Apply module pipeline start EP callback.
1859
1860 // If we are planning to perform ThinLTO later, we don't bloat the code with
1861 // unrolling/vectorization/... now. Just simplify the module as much as we
1862 // can.
1865 // In pre-link, for ctx prof use, we stop here with an instrumented IR. We let
1866 // thinlto use the contextual info to perform imports; then use the contextual
1867 // profile in the post-thinlink phase.
1868 if (!UseCtxProfile.empty()) {
1869 addRequiredLTOPreLinkPasses(MPM);
1870 return MPM;
1871 }
1872
1873 // Run partial inlining pass to partially inline functions that have
1874 // large bodies.
1875 // FIXME: It isn't clear whether this is really the right place to run this
1876 // in ThinLTO. Because there is another canonicalization and simplification
1877 // phase that will run after the thin link, running this here ends up with
1878 // less information than will be available later and it may grow functions in
1879 // ways that aren't beneficial.
1882
1883 if (PGOOpt && PGOOpt->PseudoProbeForProfiling &&
1884 PGOOpt->Action == PGOOptions::SampleUse)
1886
1887 // Handle Optimizer{Early,Last}EPCallbacks added by clang on PreLink. Actual
1888 // optimization is going to be done in PostLink stage, but clang can't add
1889 // callbacks there in case of in-process ThinLTO called by linker.
1894
1895 // Emit annotation remarks.
1897
1898 addRequiredLTOPreLinkPasses(MPM);
1899
1900 instructionCountersPass(MPM, /* IsPreOptimization */ false);
1901
1902 return MPM;
1903}
1904
1906 OptimizationLevel Level, const ModuleSummaryIndex *ImportSummary) {
1908
1909 instructionCountersPass(MPM, /* IsPreOptimization */ true);
1910
1911 // If we are invoking this without a summary index noting that we are linking
1912 // with a library containing the necessary APIs, remove any MemProf related
1913 // attributes and metadata.
1914 if (!ImportSummary || !ImportSummary->withSupportsHotColdNew())
1916
1917 if (ImportSummary) {
1918 // For ThinLTO we must apply the context disambiguation decisions early, to
1919 // ensure we can correctly match the callsites to summary data.
1922 ImportSummary, PGOOpt && PGOOpt->Action == PGOOptions::SampleUse));
1923
1924 // These passes import type identifier resolutions for whole-program
1925 // devirtualization and CFI. They must run early because other passes may
1926 // disturb the specific instruction patterns that these passes look for,
1927 // creating dependencies on resolutions that may not appear in the summary.
1928 //
1929 // For example, GVN may transform the pattern assume(type.test) appearing in
1930 // two basic blocks into assume(phi(type.test, type.test)), which would
1931 // transform a dependency on a WPD resolution into a dependency on a type
1932 // identifier resolution for CFI.
1933 //
1934 // Also, WPD has access to more precise information than ICP and can
1935 // devirtualize more effectively, so it should operate on the IR first.
1936 //
1937 // The WPD and LowerTypeTest passes need to run at -O0 to lower type
1938 // metadata and intrinsics.
1939 MPM.addPass(WholeProgramDevirtPass(nullptr, ImportSummary));
1940 MPM.addPass(LowerTypeTestsPass(nullptr, ImportSummary));
1941 }
1942
1943 if (Level == OptimizationLevel::O0) {
1944 // Run a second time to clean up any type tests left behind by WPD for use
1945 // in ICP.
1948
1949 // AllocToken transforms heap allocation calls; this needs to run late after
1950 // other allocation call transformations (such as those in InstCombine).
1951 MPM.addPass(AllocTokenPass());
1952
1953 // Drop available_externally and unreferenced globals. This is necessary
1954 // with ThinLTO in order to avoid leaving undefined references to dead
1955 // globals in the object file.
1957 MPM.addPass(GlobalDCEPass());
1958 return MPM;
1959 }
1960 if (!UseCtxProfile.empty()) {
1961 MPM.addPass(
1963 } else {
1964 // Add the core simplification pipeline.
1967 }
1968 // Now add the optimization pipeline.
1971
1972 // Emit annotation remarks.
1974
1975 instructionCountersPass(MPM, /* IsPreOptimization */ false);
1976
1977 return MPM;
1978}
1979
1982 // FIXME: We should use a customized pre-link pipeline!
1983 return buildPerModuleDefaultPipeline(Level,
1985}
1986
1989 ModuleSummaryIndex *ExportSummary) {
1991
1992 instructionCountersPass(MPM, /* IsPreOptimization */ true);
1993
1995
1996 // If we are invoking this without a summary index noting that we are linking
1997 // with a library containing the necessary APIs, remove any MemProf related
1998 // attributes and metadata.
1999 if (!ExportSummary || !ExportSummary->withSupportsHotColdNew())
2001
2002 // Create a function that performs CFI checks for cross-DSO calls with targets
2003 // in the current module.
2004 MPM.addPass(CrossDSOCFIPass());
2005
2006 if (Level == OptimizationLevel::O0) {
2007 // The WPD and LowerTypeTest passes need to run at -O0 to lower type
2008 // metadata and intrinsics.
2009 MPM.addPass(WholeProgramDevirtPass(ExportSummary, nullptr));
2010 MPM.addPass(LowerTypeTestsPass(ExportSummary, nullptr));
2011 // Run a second time to clean up any type tests left behind by WPD for use
2012 // in ICP.
2014
2016
2017 // AllocToken transforms heap allocation calls; this needs to run late after
2018 // other allocation call transformations (such as those in InstCombine).
2019 MPM.addPass(AllocTokenPass());
2020
2022
2023 // Emit annotation remarks.
2025
2026 return MPM;
2027 }
2028
2029 if (PGOOpt && PGOOpt->Action == PGOOptions::SampleUse) {
2030 // Load sample profile before running the LTO optimization pipeline.
2031 MPM.addPass(SampleProfileLoaderPass(PGOOpt->ProfileFile,
2032 PGOOpt->ProfileRemappingFile,
2034 // Cache ProfileSummaryAnalysis once to avoid the potential need to insert
2035 // RequireAnalysisPass for PSI before subsequent non-module passes.
2037 }
2038
2039 // Try to run OpenMP optimizations, quick no-op if no OpenMP metadata present.
2041
2042 // Remove unused virtual tables to improve the quality of code generated by
2043 // whole-program devirtualization and bitset lowering.
2044 MPM.addPass(GlobalDCEPass(/*InLTOPostLink=*/true));
2045
2046 // Do basic inference of function attributes from known properties of system
2047 // libraries and other oracles.
2049
2050 if (Level.getSpeedupLevel() > 1) {
2052 CallSiteSplittingPass(), PTO.EagerlyInvalidateAnalyses));
2053
2054 // Indirect call promotion. This should promote all the targets that are
2055 // left by the earlier promotion pass that promotes intra-module targets.
2056 // This two-step promotion is to save the compile time. For LTO, it should
2057 // produce the same result as if we only do promotion here.
2059 true /* InLTO */, PGOOpt && PGOOpt->Action == PGOOptions::SampleUse));
2060
2061 // Promoting by-reference arguments to by-value exposes more constants to
2062 // IPSCCP.
2063 CGSCCPassManager CGPM;
2066 CGPM.addPass(
2069
2070 // Propagate constants at call sites into the functions they call. This
2071 // opens opportunities for globalopt (and inlining) by substituting function
2072 // pointers passed as arguments to direct uses of functions.
2073 MPM.addPass(IPSCCPPass(IPSCCPOptions(/*AllowFuncSpec=*/true)));
2074
2075 // Attach metadata to indirect call sites indicating the set of functions
2076 // they may target at run-time. This should follow IPSCCP.
2078 }
2079
2080 // Do RPO function attribute inference across the module to forward-propagate
2081 // attributes where applicable.
2082 // FIXME: Is this really an optimization rather than a canonicalization?
2084
2085 // Use in-range annotations on GEP indices to split globals where beneficial.
2086 MPM.addPass(GlobalSplitPass());
2087
2088 // Run whole program optimization of virtual call when the list of callees
2089 // is fixed.
2090 MPM.addPass(WholeProgramDevirtPass(ExportSummary, nullptr));
2091
2093 // Stop here at -O1.
2094 if (Level == OptimizationLevel::O1) {
2095 // The LowerTypeTestsPass needs to run to lower type metadata and the
2096 // type.test intrinsics. The pass does nothing if CFI is disabled.
2097 MPM.addPass(LowerTypeTestsPass(ExportSummary, nullptr));
2098 // Run a second time to clean up any type tests left behind by WPD for use
2099 // in ICP (which is performed earlier than this in the regular LTO
2100 // pipeline).
2102
2104
2105 // AllocToken transforms heap allocation calls; this needs to run late after
2106 // other allocation call transformations (such as those in InstCombine).
2107 MPM.addPass(AllocTokenPass());
2108
2110
2111 // Emit annotation remarks.
2113
2114 instructionCountersPass(MPM, /* IsPreOptimization */ false);
2115
2116 return MPM;
2117 }
2118
2119 // TODO: Skip to match buildCoroWrapper.
2120 MPM.addPass(CoroEarlyPass());
2121
2122 // Optimize globals to try and fold them into constants.
2123 MPM.addPass(GlobalOptPass());
2124
2125 // Promote any localized globals to SSA registers.
2127
2128 // Linking modules together can lead to duplicate global constant, only
2129 // keep one copy of each constant.
2131
2132 // Remove unused arguments from functions.
2134
2135 // Reduce the code after globalopt and ipsccp. Both can open up significant
2136 // simplification opportunities, and both can propagate functions through
2137 // function pointers. When this happens, we often have to resolve varargs
2138 // calls, etc, so let instcombine do this.
2139 FunctionPassManager PeepholeFPM;
2140 PeepholeFPM.addPass(InstCombinePass());
2141 if (Level.getSpeedupLevel() > 1)
2142 PeepholeFPM.addPass(AggressiveInstCombinePass());
2143 invokePeepholeEPCallbacks(PeepholeFPM, Level);
2144
2145 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(PeepholeFPM),
2146 PTO.EagerlyInvalidateAnalyses));
2147
2148 // Lower variadic functions for supported targets prior to inlining.
2150
2151 // Note: historically, the PruneEH pass was run first to deduce nounwind and
2152 // generally clean up exception handling overhead. It isn't clear this is
2153 // valuable as the inliner doesn't currently care whether it is inlining an
2154 // invoke or a call.
2155 // Run the inliner now.
2156 if (EnableModuleInliner) {
2160 } else {
2163 /* MandatoryFirst */ true,
2166 }
2167
2168 // Perform context disambiguation after inlining, since that would reduce the
2169 // amount of additional cloning required to distinguish the allocation
2170 // contexts.
2173 /*Summary=*/nullptr,
2174 PGOOpt && PGOOpt->Action == PGOOptions::SampleUse));
2175
2176 // Optimize globals again after we ran the inliner.
2177 MPM.addPass(GlobalOptPass());
2178
2179 // Run the OpenMPOpt pass again after global optimizations.
2181
2182 // Garbage collect dead functions.
2183 MPM.addPass(GlobalDCEPass(/*InLTOPostLink=*/true));
2184
2185 // If we didn't decide to inline a function, check to see if we can
2186 // transform it to pass arguments by value instead of by reference.
2187 CGSCCPassManager CGPM;
2192
2194 // The IPO Passes may leave cruft around. Clean up after them.
2195 FPM.addPass(InstCombinePass());
2196 invokePeepholeEPCallbacks(FPM, Level);
2197
2200
2202
2203 // Do a post inline PGO instrumentation and use pass. This is a context
2204 // sensitive PGO pass.
2205 if (PGOOpt) {
2206 if (PGOOpt->CSAction == PGOOptions::CSIRInstr)
2207 addPGOInstrPasses(MPM, Level, /*RunProfileGen=*/true,
2208 /*IsCS=*/true, PGOOpt->AtomicCounterUpdate,
2209 PGOOpt->CSProfileGenFile, PGOOpt->ProfileRemappingFile);
2210 else if (PGOOpt->CSAction == PGOOptions::CSIRUse)
2211 addPGOInstrPasses(MPM, Level, /*RunProfileGen=*/false,
2212 /*IsCS=*/true, PGOOpt->AtomicCounterUpdate,
2213 PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile);
2214 }
2215
2216 // Break up allocas
2218
2219 // LTO provides additional opportunities for tailcall elimination due to
2220 // link-time inlining, and visibility of nocapture attribute.
2221 FPM.addPass(
2222 TailCallElimPass(/*UpdateFunctionEntryCount=*/isInstrumentedPGOUse()));
2223
2224 // Run a few AA driver optimizations here and now to cleanup the code.
2225 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM),
2226 PTO.EagerlyInvalidateAnalyses));
2227
2228 MPM.addPass(
2230
2231 // Require the GlobalsAA analysis for the module so we can query it within
2232 // MainFPM.
2235 // Invalidate AAManager so it can be recreated and pick up the newly
2236 // available GlobalsAA.
2237 MPM.addPass(
2239 }
2240
2241 FunctionPassManager MainFPM;
2243 LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
2244 /*AllowSpeculation=*/true),
2245 /*USeMemorySSA=*/true));
2246
2247 if (RunNewGVN)
2248 MainFPM.addPass(NewGVNPass());
2249 else
2250 MainFPM.addPass(GVNPass());
2251
2252 // Remove dead memcpy()'s.
2253 MainFPM.addPass(MemCpyOptPass());
2254
2255 // Nuke dead stores.
2256 MainFPM.addPass(DSEPass());
2257 MainFPM.addPass(MoveAutoInitPass());
2259
2260 invokeVectorizerStartEPCallbacks(MainFPM, Level);
2261
2262 LoopPassManager LPM;
2263 if (EnableLoopFlatten && Level.getSpeedupLevel() > 1)
2264 LPM.addPass(LoopFlattenPass());
2265 LPM.addPass(IndVarSimplifyPass());
2266 LPM.addPass(LoopDeletionPass());
2267 // FIXME: Add loop interchange.
2268
2269 // Unroll small loops and perform peeling.
2270 LPM.addPass(LoopFullUnrollPass(Level.getSpeedupLevel(),
2271 /* OnlyWhenForced= */ !PTO.LoopUnrolling,
2272 PTO.ForgetAllSCEVInLoopUnroll));
2273 // The loop passes in LPM (LoopFullUnrollPass) do not preserve MemorySSA.
2274 // *All* loop passes must preserve it, in order to be able to use it.
2275 MainFPM.addPass(
2276 createFunctionToLoopPassAdaptor(std::move(LPM), /*UseMemorySSA=*/false));
2277
2278 MainFPM.addPass(LoopDistributePass());
2279
2280 addVectorPasses(Level, MainFPM, ThinOrFullLTOPhase::FullLTOPostLink);
2281
2282 invokeVectorizerEndEPCallbacks(MainFPM, Level);
2283
2284 // Run the OpenMPOpt CGSCC pass again late.
2287
2288 invokePeepholeEPCallbacks(MainFPM, Level);
2289 MainFPM.addPass(JumpThreadingPass());
2290 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(MainFPM),
2291 PTO.EagerlyInvalidateAnalyses));
2292
2293 // Lower type metadata and the type.test intrinsic. This pass supports
2294 // clang's control flow integrity mechanisms (-fsanitize=cfi*) and needs
2295 // to be run at link time if CFI is enabled. This pass does nothing if
2296 // CFI is disabled.
2297 MPM.addPass(LowerTypeTestsPass(ExportSummary, nullptr));
2298 // Run a second time to clean up any type tests left behind by WPD for use
2299 // in ICP (which is performed earlier than this in the regular LTO pipeline).
2301
2302 // Enable splitting late in the FullLTO post-link pipeline.
2305
2306 // Add late LTO optimization passes.
2307 FunctionPassManager LateFPM;
2308
2309 // LoopSink pass sinks instructions hoisted by LICM, which serves as a
2310 // canonicalization pass that enables other optimizations. As a result,
2311 // LoopSink pass needs to be a very late IR pass to avoid undoing LICM
2312 // result too early.
2313 LateFPM.addPass(LoopSinkPass());
2314
2315 // This hoists/decomposes div/rem ops. It should run after other sink/hoist
2316 // passes to avoid re-sinking, but before SimplifyCFG because it can allow
2317 // flattening of blocks.
2318 LateFPM.addPass(DivRemPairsPass());
2319
2320 // Delete basic blocks, which optimization passes may have killed.
2322 .convertSwitchRangeToICmp(true)
2323 .convertSwitchToArithmetic(true)
2324 .hoistCommonInsts(true)
2325 .speculateUnpredictables(true)));
2326 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(LateFPM)));
2327
2328 // Drop bodies of available eternally objects to improve GlobalDCE.
2330
2331 // Now that we have optimized the program, discard unreachable functions.
2332 MPM.addPass(GlobalDCEPass(/*InLTOPostLink=*/true));
2333
2334 if (PTO.MergeFunctions)
2336
2338
2339 if (PTO.CallGraphProfile)
2340 MPM.addPass(CGProfilePass(/*InLTOPostLink=*/true));
2341
2342 MPM.addPass(CoroCleanupPass());
2343
2344 // AllocToken transforms heap allocation calls; this needs to run late after
2345 // other allocation call transformations (such as those in InstCombine).
2346 MPM.addPass(AllocTokenPass());
2347
2349
2350 // Emit annotation remarks.
2352
2353 instructionCountersPass(MPM, /* IsPreOptimization */ false);
2354
2355 return MPM;
2356}
2357
2361 assert(Level == OptimizationLevel::O0 &&
2362 "buildO0DefaultPipeline should only be used with O0");
2363
2365
2366 instructionCountersPass(MPM, /* IsPreOptimization */ true);
2367
2368 // Perform pseudo probe instrumentation in O0 mode. This is for the
2369 // consistency between different build modes. For example, a LTO build can be
2370 // mixed with an O0 prelink and an O2 postlink. Loading a sample profile in
2371 // the postlink will require pseudo probe instrumentation in the prelink.
2372 if (PGOOpt && PGOOpt->PseudoProbeForProfiling)
2374
2375 if (PGOOpt && (PGOOpt->Action == PGOOptions::IRInstr ||
2376 PGOOpt->Action == PGOOptions::IRUse))
2378 MPM,
2379 /*RunProfileGen=*/(PGOOpt->Action == PGOOptions::IRInstr),
2380 /*IsCS=*/false, PGOOpt->AtomicCounterUpdate, PGOOpt->ProfileFile,
2381 PGOOpt->ProfileRemappingFile);
2382
2383 // Instrument function entry and exit before all inlining.
2385 EntryExitInstrumenterPass(/*PostInlining=*/false)));
2386
2388
2389 if (PGOOpt && PGOOpt->DebugInfoForProfiling)
2391
2392 if (PGOOpt && PGOOpt->Action == PGOOptions::SampleUse) {
2393 // Explicitly disable sample loader inlining and use flattened profile in O0
2394 // pipeline.
2395 MPM.addPass(SampleProfileLoaderPass(PGOOpt->ProfileFile,
2396 PGOOpt->ProfileRemappingFile,
2398 /*DisableSampleProfileInlining=*/true,
2399 /*UseFlattenedProfile=*/true));
2400 // Cache ProfileSummaryAnalysis once to avoid the potential need to insert
2401 // RequireAnalysisPass for PSI before subsequent non-module passes.
2403 }
2404
2406
2407 // Build a minimal pipeline based on the semantics required by LLVM,
2408 // which is just that always inlining occurs. Further, disable generating
2409 // lifetime intrinsics to avoid enabling further optimizations during
2410 // code generation.
2412 /*InsertLifetimeIntrinsics=*/false));
2413
2414 if (PTO.MergeFunctions)
2416
2417 if (EnableMatrix)
2418 MPM.addPass(
2420
2421 if (!CGSCCOptimizerLateEPCallbacks.empty()) {
2422 CGSCCPassManager CGPM;
2424 if (!CGPM.isEmpty())
2426 }
2427 if (!LateLoopOptimizationsEPCallbacks.empty()) {
2428 LoopPassManager LPM;
2430 if (!LPM.isEmpty()) {
2432 createFunctionToLoopPassAdaptor(std::move(LPM))));
2433 }
2434 }
2435 if (!LoopOptimizerEndEPCallbacks.empty()) {
2436 LoopPassManager LPM;
2438 if (!LPM.isEmpty()) {
2440 createFunctionToLoopPassAdaptor(std::move(LPM))));
2441 }
2442 }
2443 if (!ScalarOptimizerLateEPCallbacks.empty()) {
2446 if (!FPM.isEmpty())
2447 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
2448 }
2449
2451
2452 if (!VectorizerStartEPCallbacks.empty()) {
2455 if (!FPM.isEmpty())
2456 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
2457 }
2458
2459 if (!VectorizerEndEPCallbacks.empty()) {
2462 if (!FPM.isEmpty())
2463 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
2464 }
2465
2467
2468 // AllocToken transforms heap allocation calls; this needs to run late after
2469 // other allocation call transformations (such as those in InstCombine).
2470 if (!isLTOPreLink(Phase))
2471 MPM.addPass(AllocTokenPass());
2472
2474
2476 MPM.addPass(InstrumentorPass(FS));
2477
2478 if (isLTOPreLink(Phase))
2479 addRequiredLTOPreLinkPasses(MPM);
2480
2481 // Emit annotation remarks.
2483
2484 instructionCountersPass(MPM, /* IsPreOptimization */ false);
2485
2486 return MPM;
2487}
2488
2490 AAManager AA;
2491
2492 // The order in which these are registered determines their priority when
2493 // being queried.
2494
2495 // Add any target-specific alias analyses that should be run early.
2496 if (TM)
2497 TM->registerEarlyDefaultAliasAnalyses(AA);
2498
2499 // First we register the basic alias analysis that provides the majority of
2500 // per-function local AA logic. This is a stateless, on-demand local set of
2501 // AA techniques.
2502 AA.registerFunctionAnalysis<BasicAA>();
2503
2504 // Next we query fast, specialized alias analyses that wrap IR-embedded
2505 // information about aliasing.
2506 AA.registerFunctionAnalysis<ScopedNoAliasAA>();
2507 AA.registerFunctionAnalysis<TypeBasedAA>();
2508
2509 // Add support for querying global aliasing information when available.
2510 // Because the `AAManager` is a function analysis and `GlobalsAA` is a module
2511 // analysis, all that the `AAManager` can do is query for any *cached*
2512 // results from `GlobalsAA` through a readonly proxy.
2514 AA.registerModuleAnalysis<GlobalsAA>();
2515
2516 // Add target-specific alias analyses.
2517 if (TM)
2518 TM->registerDefaultAliasAnalyses(AA);
2519
2520 return AA;
2521}
2522
2523bool PassBuilder::isInstrumentedPGOUse() const {
2524 return (PGOOpt && PGOOpt->Action == PGOOptions::IRUse) ||
2525 !UseCtxProfile.empty();
2526}
aarch64 falkor hwpf fix Falkor HW Prefetch Fix Late Phase
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AggressiveInstCombiner - Combine expression patterns to form expressions with fewer,...
Provides passes to inlining "always_inline" functions.
This is the interface for LLVM's primary stateless and local alias analysis.
This file provides the interface for LLVM's Call Graph Profile pass.
This header provides classes for managing passes over SCCs of the call graph.
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This file provides the interface for a simple, fast CSE pass.
This file provides a pass which clones the current module and runs the provided pass pipeline on the ...
This file provides a pass manager that only runs its passes if the provided marker analysis has been ...
Super simple passes to force specific function attrs from the commandline into the IR for debugging p...
Provides passes for computing function attributes based on interprocedural analyses.
This file provides the interface for LLVM's Global Value Numbering pass which eliminates fully redund...
This is the interface for a simple mod/ref and alias analysis over globals.
AcceleratorCodeSelection - Identify all functions reachable from a kernel, removing those that are un...
This header defines various interfaces for pass management in LLVM.
Interfaces for passes which infer implicit function attributes from the name and signature of functio...
This file provides the primary interface to the instcombine pass.
Defines passes for running instruction simplification across chunks of IR.
This file provides the interface for LLVM's PGO Instrumentation lowering pass.
See the comments on JumpThreadingPass.
static LVOptions Options
Definition LVOptions.cpp:25
This file implements the Loop Fusion pass.
This header defines the LoopLoadEliminationPass object.
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.
The header file for the LowerExpectIntrinsic pass as used by the new pass manager.
This pass performs merges of loads and stores on both sides of a.
This file provides the interface for LLVM's Global Value Numbering pass.
This header enumerates the LLVM-provided high-level optimization levels.
This file provides the interface for IR based instrumentation passes ( (profile-gen,...
Define option tunables for PGO.
static bool isThinLTOPostLink(ThinOrFullLTOPhase Phase)
static void addAnnotationRemarksPass(ModulePassManager &MPM)
static CoroConditionalWrapper buildCoroWrapper(ThinOrFullLTOPhase Phase)
static bool isFullLTOPostLink(ThinOrFullLTOPhase Phase)
static bool isThinLTOPreLink(ThinOrFullLTOPhase Phase)
static bool isLTOPreLink(ThinOrFullLTOPhase Phase)
static void instructionCountersPass(ModulePassManager &MPM, bool IsPreOptimization)
static bool isFullLTOPreLink(ThinOrFullLTOPhase Phase)
static bool isLTOPostLink(ThinOrFullLTOPhase Phase)
This file implements relative lookup table converter that converts lookup tables to relative lookup t...
This file provides the interface for LLVM's Scalar Replacement of Aggregates pass.
This file provides the interface for the pseudo probe implementation for AutoFDO.
This file provides the interface for the sampled PGO loader pass.
This is the interface for a metadata-based scoped no-alias analysis.
This file provides the interface for the pass responsible for both simplifying and canonicalizing the...
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
This is the interface for a metadata-based TBAA.
Defines the virtual file system interface vfs::FileSystem.
A manager for alias analyses.
A module pass that rewrites heap allocations to use token-enabled allocation functions based on vario...
Definition AllocToken.h:36
Inlines functions marked as "always_inline".
Argument promotion pass.
Assign a GUID to functions as metadata.
Analysis pass providing a never-invalidated alias analysis result.
Simple pass that canonicalizes aliases.
A pass that merges duplicate global constants into a single constant.
This class implements a trivial dead store elimination.
Eliminate dead arguments (and return values) from functions.
A pass that transforms external global definitions into declarations.
Pass embeds a copy of the module optimized with the provided pass pipeline into a global variable.
A pass manager to run a set of extra loop passes if the MarkerTy analysis is present.
Statistics pass for the FunctionPropertiesAnalysis results.
The core GVN pass object.
Definition GVN.h:128
Pass to remove unused function declarations.
Definition GlobalDCE.h:38
Optimize globals that never have their address taken.
Definition GlobalOpt.h:25
Pass to perform split of global variables.
Definition GlobalSplit.h:26
Analysis pass providing a never-invalidated alias analysis result.
Pass to outline cold regions.
Pass to perform interprocedural constant propagation.
Definition SCCP.h:48
Pass to outline similar regions.
Definition IROutliner.h:468
Run instruction simplification across each instruction in the function.
Instrumentation based profiling lowering pass.
The Instrumentor pass.
This pass performs 'jump threading', which looks at blocks that have multiple predecessors and multip...
Performs Loop Invariant Code Motion Pass.
Definition LICM.h:66
Loop unroll pass that only does full loop unrolling and peeling.
Performs Loop Idiom Recognize Pass.
Performs Loop Inst Simplify Pass.
A simple loop rotation transformation.
Performs basic CFG simplifications to assist other loop passes.
A pass that does profile-guided sinking of instructions into loops.
Definition LoopSink.h:33
A simple loop rotation transformation.
Loop unroll pass that will support both full and partial unrolling.
Strips MemProf attributes and metadata.
Merge identical functions.
The module inliner pass for the new pass manager.
Module pass, wrapping the inliner pass.
Definition Inliner.h:65
void addModulePass(T Pass)
Add a module pass that runs before the CGSCC passes.
Definition Inliner.h:81
Class to hold module path string table and global value map, and encapsulate methods for operating on...
Simple pass that provides a name to every anonymous globals.
Additional 'norecurse' attribute deduction during postlink LTO phase.
OpenMP optimizations pass.
Definition OpenMPOpt.h:42
static LLVM_ABI const OptimizationLevel O3
Optimize for fast execution as much as possible.
static LLVM_ABI const OptimizationLevel O0
Disable as many optimizations as possible.
static LLVM_ABI const OptimizationLevel O2
Optimize for fast execution as much as possible without triggering significant incremental compile ti...
static LLVM_ABI const OptimizationLevel O1
Optimize quickly without destroying debuggability.
The indirect function call promotion pass.
The instrumentation (profile-instr-gen) pass for IR based PGO.
The instrumentation (profile-instr-gen) pass for IR based PGO.
The profile annotation (profile-instr-use) pass for IR based PGO.
The profile size based optimization pass for memory intrinsics.
Pass to remove unused function declarations.
LLVM_ABI void invokeFullLinkTimeOptimizationLastEPCallbacks(ModulePassManager &MPM, OptimizationLevel Level)
LLVM_ABI ModuleInlinerWrapperPass buildInlinerPipeline(OptimizationLevel Level, ThinOrFullLTOPhase Phase)
Construct the module pipeline that performs inlining as well as the inlining-driven cleanups.
LLVM_ABI void invokeOptimizerEarlyEPCallbacks(ModulePassManager &MPM, OptimizationLevel Level, ThinOrFullLTOPhase Phase)
LLVM_ABI void invokeVectorizerStartEPCallbacks(FunctionPassManager &FPM, OptimizationLevel Level)
LLVM_ABI AAManager buildDefaultAAPipeline()
Build the default AAManager with the default alias analysis pipeline registered.
LLVM_ABI void invokeCGSCCOptimizerLateEPCallbacks(CGSCCPassManager &CGPM, OptimizationLevel Level)
LLVM_ABI ModulePassManager buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level)
Build a pre-link, ThinLTO-targeting default optimization pipeline to a pass manager.
LLVM_ABI void addPGOInstrPassesForO0(ModulePassManager &MPM, bool RunProfileGen, bool IsCS, bool AtomicCounterUpdate, std::string ProfileFile, std::string ProfileRemappingFile)
Add PGOInstrumenation passes for O0 only.
LLVM_ABI void invokeScalarOptimizerLateEPCallbacks(FunctionPassManager &FPM, OptimizationLevel Level)
LLVM_ABI ModulePassManager buildPerModuleDefaultPipeline(OptimizationLevel Level, ThinOrFullLTOPhase Phase=ThinOrFullLTOPhase::None)
Build a per-module default optimization pipeline.
LLVM_ABI void invokePipelineStartEPCallbacks(ModulePassManager &MPM, OptimizationLevel Level)
LLVM_ABI void invokeVectorizerEndEPCallbacks(FunctionPassManager &FPM, OptimizationLevel Level)
LLVM_ABI ModulePassManager buildO0DefaultPipeline(OptimizationLevel Level, ThinOrFullLTOPhase Phase=ThinOrFullLTOPhase::None)
Build an O0 pipeline with the minimal semantically required passes.
LLVM_ABI FunctionPassManager buildFunctionSimplificationPipeline(OptimizationLevel Level, ThinOrFullLTOPhase Phase)
Construct the core LLVM function canonicalization and simplification pipeline.
LLVM_ABI void invokePeepholeEPCallbacks(FunctionPassManager &FPM, OptimizationLevel Level)
LLVM_ABI void invokePipelineEarlySimplificationEPCallbacks(ModulePassManager &MPM, OptimizationLevel Level, ThinOrFullLTOPhase Phase)
LLVM_ABI void invokeLoopOptimizerEndEPCallbacks(LoopPassManager &LPM, OptimizationLevel Level)
LLVM_ABI ModulePassManager buildLTODefaultPipeline(OptimizationLevel Level, ModuleSummaryIndex *ExportSummary)
Build an LTO default optimization pipeline to a pass manager.
LLVM_ABI ModulePassManager buildModuleInlinerPipeline(OptimizationLevel Level, ThinOrFullLTOPhase Phase)
Construct the module pipeline that performs inlining with module inliner pass.
LLVM_ABI ModulePassManager buildThinLTODefaultPipeline(OptimizationLevel Level, const ModuleSummaryIndex *ImportSummary)
Build a ThinLTO default optimization pipeline to a pass manager.
LLVM_ABI void invokeLateLoopOptimizationsEPCallbacks(LoopPassManager &LPM, OptimizationLevel Level)
LLVM_ABI void invokeFullLinkTimeOptimizationEarlyEPCallbacks(ModulePassManager &MPM, OptimizationLevel Level)
LLVM_ABI ModulePassManager buildFatLTODefaultPipeline(OptimizationLevel Level, bool ThinLTO, bool EmitSummary)
Build a fat object default optimization pipeline.
LLVM_ABI ModulePassManager buildModuleSimplificationPipeline(OptimizationLevel Level, ThinOrFullLTOPhase Phase)
Construct the core LLVM module canonicalization and simplification pipeline.
LLVM_ABI ModulePassManager buildModuleOptimizationPipeline(OptimizationLevel Level, ThinOrFullLTOPhase LTOPhase)
Construct the core LLVM module optimization pipeline.
LLVM_ABI void invokeOptimizerLastEPCallbacks(ModulePassManager &MPM, OptimizationLevel Level, ThinOrFullLTOPhase Phase)
LLVM_ABI ModulePassManager buildLTOPreLinkDefaultPipeline(OptimizationLevel Level)
Build a pre-link, LTO-targeting default optimization pipeline to a pass manager.
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.
unsigned LicmMssaNoAccForPromotionCap
Tuning option to disable promotion to scalars in LICM with MemorySSA, if the number of access is too ...
Definition PassBuilder.h:78
bool SLPVectorization
Tuning option to enable/disable slp loop vectorization, set based on opt level.
Definition PassBuilder.h:56
int InlinerThreshold
Tuning option to override the default inliner threshold.
Definition PassBuilder.h:92
bool LoopFusion
Tuning option to enable/disable loop fusion. Its default value is false.
Definition PassBuilder.h:66
bool CallGraphProfile
Tuning option to enable/disable call graph profile.
Definition PassBuilder.h:82
bool MergeFunctions
Tuning option to enable/disable function merging.
Definition PassBuilder.h:89
bool ForgetAllSCEVInLoopUnroll
Tuning option to forget all SCEV loops in LoopUnroll.
Definition PassBuilder.h:70
unsigned LicmMssaOptCap
Tuning option to cap the number of calls to retrive clobbering accesses in MemorySSA,...
Definition PassBuilder.h:74
bool LoopInterleaving
Tuning option to set loop interleaving on/off, set based on opt level.
Definition PassBuilder.h:48
LLVM_ABI PipelineTuningOptions()
Constructor sets pipeline tuning defaults based on cl::opts.
bool LoopUnrolling
Tuning option to enable/disable loop unrolling. Its default value is true.
Definition PassBuilder.h:59
bool LoopInterchange
Tuning option to enable/disable loop interchange.
Definition PassBuilder.h:63
bool LoopVectorization
Tuning option to enable/disable loop vectorization, set based on opt level.
Definition PassBuilder.h:52
Reassociate commutative expressions.
Definition Reassociate.h:74
A pass to do RPO deduction and propagation of function attributes.
This pass performs function-level constant propagation and merging.
Definition SCCP.h:30
The sample profiler data loader pass.
Analysis pass providing a never-invalidated alias analysis result.
This pass transforms loops that contain branches or switches on loop- invariant conditions to have mu...
A pass to simplify and canonicalize the CFG of a function.
Definition SimplifyCFG.h:30
Analysis pass providing a never-invalidated alias analysis result.
Optimize scalar/vector interactions in IR using target cost models.
Interfaces for registering analysis passes, producing common pass manager configurations,...
Abstract Attribute helper functions.
Definition Attributor.h:165
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
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)
@ All
Drop only llvm.assumes using type test value.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI cl::opt< bool > EnableKnowledgeRetention
static cl::opt< bool > RunNewGVN("enable-newgvn", cl::init(false), cl::Hidden, cl::desc("Run the NewGVN pass"))
static cl::opt< bool > DisablePreInliner("disable-preinline", cl::init(false), cl::Hidden, cl::desc("Disable pre-instrumentation inliner"))
static cl::opt< bool > PerformMandatoryInliningsFirst("mandatory-inlining-first", cl::init(false), cl::Hidden, cl::desc("Perform mandatory inlinings module-wide, before performing " "inlining"))
static cl::opt< bool > RunPartialInlining("enable-partial-inlining", cl::init(false), cl::Hidden, cl::desc("Run Partial inlining pass"))
static cl::opt< bool > EnableGVNSink("enable-gvn-sink", cl::desc("Enable the GVN sinking pass (default = off)"))
static cl::opt< bool > EnableModuleInliner("enable-module-inliner", cl::init(false), cl::Hidden, cl::desc("Enable module inliner"))
static cl::opt< bool > EnableEagerlyInvalidateAnalyses("eagerly-invalidate-analyses", cl::init(true), cl::Hidden, cl::desc("Eagerly invalidate more analyses in default pipelines"))
static cl::opt< bool > EnableMatrix("enable-matrix", cl::init(false), cl::Hidden, cl::desc("Enable lowering of the matrix intrinsics"))
ModuleToFunctionPassAdaptor createModuleToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
cl::opt< std::string > UseCtxProfile("use-ctx-profile", cl::init(""), cl::Hidden, cl::desc("Use the specified contextual profile file"))
static cl::opt< bool > EnableSampledInstr("enable-sampled-instrumentation", cl::init(false), cl::Hidden, cl::desc("Enable profile instrumentation sampling (default = off)"))
static cl::opt< bool > EnableLoopFlatten("enable-loop-flatten", cl::init(false), cl::Hidden, cl::desc("Enable the LoopFlatten Pass"))
static cl::opt< InliningAdvisorMode > UseInlineAdvisor("enable-ml-inliner", cl::init(InliningAdvisorMode::Default), cl::Hidden, cl::desc("Enable ML policy for inliner. Currently trained for -Oz only"), cl::values(clEnumValN(InliningAdvisorMode::Default, "default", "Heuristics-based inliner version"), clEnumValN(InliningAdvisorMode::Development, "development", "Use development mode (runtime-loadable model)"), clEnumValN(InliningAdvisorMode::Release, "release", "Use release mode (AOT-compiled model)")))
static cl::opt< bool > EnableJumpTableToSwitch("enable-jump-table-to-switch", cl::init(true), cl::desc("Enable JumpTableToSwitch pass (default = true)"))
PassManager< LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, CGSCCUpdateResult & > CGSCCPassManager
The CGSCC pass manager.
static cl::opt< bool > EnableUnrollAndJam("enable-unroll-and-jam", cl::init(false), cl::Hidden, cl::desc("Enable Unroll And Jam Pass"))
@ CGSCC_LIGHT
@ MODULE_LIGHT
ThinOrFullLTOPhase
This enumerates the LLVM full LTO or ThinLTO optimization phases.
Definition Pass.h:77
@ FullLTOPreLink
Full LTO prelink phase.
Definition Pass.h:85
@ ThinLTOPostLink
ThinLTO postlink (backend compile) phase.
Definition Pass.h:83
@ None
No LTO/ThinLTO behavior needed.
Definition Pass.h:79
@ FullLTOPostLink
Full LTO postlink (backend compile) phase.
Definition Pass.h:87
@ ThinLTOPreLink
ThinLTO prelink (summary) phase.
Definition Pass.h:81
PassManager< Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, LPMUpdater & > LoopPassManager
The Loop pass manager.
static cl::opt< bool > EnableConstraintElimination("enable-constraint-elimination", cl::init(true), cl::Hidden, cl::desc("Enable pass to eliminate conditions based on linear constraints"))
ModuleToPostOrderCGSCCPassAdaptor createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
static cl::opt< bool > EnablePGOInlineDeferral("enable-npm-pgo-inline-deferral", cl::init(true), cl::Hidden, cl::desc("Enable inline deferral during PGO"))
Flag to enable inline deferral during PGO.
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.
cl::opt< bool > ForgetSCEVInLoopUnroll
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
static cl::opt< bool > EnablePostPGOLoopRotation("enable-post-pgo-loop-rotation", cl::init(true), cl::Hidden, cl::desc("Run the loop rotation transformation after PGO instrumentation"))
LLVM_ABI bool AreStatisticsEnabled()
Check if statistics are enabled.
static cl::opt< std::string > InstrumentColdFuncOnlyPath("instrument-cold-function-only-path", cl::init(""), cl::desc("File path for cold function only instrumentation(requires use " "with --pgo-instrument-cold-function-only)"), cl::Hidden)
static cl::opt< bool > EnableGlobalAnalyses("enable-global-analyses", cl::init(true), cl::Hidden, cl::desc("Enable inter-procedural analyses"))
static cl::opt< bool > EnableDFAJumpThreading("enable-dfa-jump-thread", cl::desc("Enable DFA jump threading"), cl::init(false), cl::Hidden)
static cl::opt< bool > FlattenedProfileUsed("flattened-profile-used", cl::init(false), cl::Hidden, cl::desc("Indicate the sample profile being used is flattened, i.e., " "no inline hierarchy exists in the profile"))
static cl::opt< AttributorRunOption > AttributorRun("attributor-enable", cl::Hidden, cl::init(AttributorRunOption::NONE), cl::desc("Enable the attributor inter-procedural deduction pass"), cl::values(clEnumValN(AttributorRunOption::FULL, "full", "enable all full attributor runs"), clEnumValN(AttributorRunOption::LIGHT, "light", "enable all attributor-light runs"), clEnumValN(AttributorRunOption::MODULE, "module", "enable module-wide attributor runs"), clEnumValN(AttributorRunOption::MODULE_LIGHT, "module-light", "enable module-wide attributor-light runs"), clEnumValN(AttributorRunOption::CGSCC, "cgscc", "enable call graph SCC attributor runs"), clEnumValN(AttributorRunOption::CGSCC_LIGHT, "cgscc-light", "enable call graph SCC attributor-light runs"), clEnumValN(AttributorRunOption::NONE, "none", "disable attributor runs")))
static cl::opt< bool > ExtraVectorizerPasses("extra-vectorizer-passes", cl::init(false), cl::Hidden, cl::desc("Run cleanup optimization passes after vectorization"))
static cl::opt< bool > EnableHotColdSplit("hot-cold-split", cl::desc("Enable hot-cold splitting pass"))
cl::opt< bool > EnableMemProfContextDisambiguation
Enable MemProf context disambiguation for thin link.
PassManager< Function > FunctionPassManager
Convenience typedef for a pass manager over functions.
LLVM_ABI InlineParams getInlineParams()
Generate the parameters to tune the inline cost analysis based only on the commandline options.
cl::opt< bool > PGOInstrumentColdFunctionOnly
static cl::opt< bool > EnableLoopInterchange("enable-loopinterchange", cl::init(false), cl::Hidden, cl::desc("Enable the LoopInterchange Pass"))
static cl::opt< bool > EnableCHR("enable-chr", cl::init(true), cl::Hidden, cl::desc("Enable control height reduction optimization (CHR)"))
static cl::opt< bool > EnableMergeFunctions("enable-merge-functions", cl::init(false), cl::Hidden, cl::desc("Enable function merging as part of the optimization pipeline"))
static cl::opt< bool > EnableDevirtualizeSpeculatively("enable-devirtualize-speculatively", cl::desc("Enable speculative devirtualization optimization"), cl::init(false))
static cl::opt< bool > EnableGVNHoist("enable-gvn-hoist", cl::desc("Enable the GVN hoisting pass (default = off)"))
cl::opt< unsigned > SetLicmMssaNoAccForPromotionCap
LLVM_ABI InlineParams getInlineParamsFromOptLevel(unsigned OptLevel)
Generate the parameters to tune the inline cost analysis based on command line options.
static cl::opt< bool > EnableIROutliner("ir-outliner", cl::init(false), cl::Hidden, cl::desc("Enable ir outliner pass"))
static cl::opt< int > PreInlineThreshold("preinline-threshold", cl::Hidden, cl::init(75), cl::desc("Control the amount of inlining in pre-instrumentation inliner " "(default = 75)"))
static cl::opt< bool > UseLoopVersioningLICM("enable-loop-versioning-licm", cl::init(false), cl::Hidden, cl::desc("Enable the experimental Loop Versioning LICM pass"))
cl::opt< unsigned > MaxDevirtIterations("max-devirt-iterations", cl::ReallyHidden, cl::init(4))
cl::opt< unsigned > SetLicmMssaOptCap
static cl::opt< bool > EnableInstrumentor("enable-instrumentor", cl::init(false), cl::Hidden, cl::desc("Enable the Instrumentor Pass"))
static cl::opt< bool > EnableMergeICmps("enable-mergeicmps", cl::init(true), cl::Hidden, cl::desc("Enable MergeICmps pass in the optimization pipeline"))
A DCE pass that assumes instructions are dead until proven otherwise.
Definition ADCE.h:31
Pass to convert @llvm.global.annotations to !annotation metadata.
This pass attempts to minimize the number of assume without loosing any information.
A more lightweight version of the Attributor which only runs attribute inference but no simplificatio...
A more lightweight version of the Attributor which only runs attribute inference but no simplificatio...
Hoist/decompose integer division and remainder instructions to enable CFG improvements and better cod...
Definition DivRemPairs.h:23
A simple and fast domtree-based CSE pass.
Definition EarlyCSE.h:31
Pass which forces specific function attributes into the IR, primarily as a debugging tool.
A simple and fast domtree-based GVN pass to hoist common expressions from sibling branches.
Definition GVN.h:432
Uses an "inverted" value numbering to decide the similarity of expressions and sinks similar expressi...
Definition GVN.h:439
A set of parameters to control various transforms performed by IPSCCP pass.
Definition SCCP.h:35
A pass which infers function attributes from the names and signatures of function declarations in a m...
Provides context on when an inline advisor is constructed in the pipeline (e.g., link phase,...
Thresholds to tune inline cost analysis.
Definition InlineCost.h:207
std::optional< int > OptSizeHintThreshold
Threshold to use for callees with inline hint, when the caller is optimized for size.
Definition InlineCost.h:216
std::optional< int > HotCallSiteThreshold
Threshold to use when the callsite is considered hot.
Definition InlineCost.h:228
int DefaultThreshold
The default threshold to start with for a callee.
Definition InlineCost.h:209
std::optional< bool > EnableDeferral
Indicate whether we should allow inline deferral.
Definition InlineCost.h:241
std::optional< int > HintThreshold
Threshold to use for callees with inline hint.
Definition InlineCost.h:212
Options for the frontend instrumentation based profiling pass.
A no-op pass template which simply forces a specific analysis result to be invalidated.
Pass to forward loads in a loop around the backedge to subsequent iterations.
A set of parameters used to control various transforms performed by the LoopUnroll pass.
The LoopVectorize Pass.
Computes function attributes in post-order over the call graph.
A utility pass template to force an analysis result to be available.