annotate lib/Passes/PassBuilder.cpp @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===- Parsing, selection, and construction of pass pipelines -------------===//
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 /// \file
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 /// This file provides the implementation of the PassBuilder based on our
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 /// static pass registry as well as related functionality. It also provides
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 /// helpers to aid in analyzing, debugging, and testing passes and pass
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 /// pipelines.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 //===----------------------------------------------------------------------===//
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 #include "llvm/Passes/PassBuilder.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
19 #include "llvm/ADT/StringSwitch.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
20 #include "llvm/Analysis/AliasAnalysis.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
21 #include "llvm/Analysis/AliasAnalysisEvaluator.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "llvm/Analysis/AssumptionCache.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
23 #include "llvm/Analysis/BasicAliasAnalysis.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
24 #include "llvm/Analysis/BlockFrequencyInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
25 #include "llvm/Analysis/BranchProbabilityInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
26 #include "llvm/Analysis/CFGPrinter.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
27 #include "llvm/Analysis/CFLAndersAliasAnalysis.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
28 #include "llvm/Analysis/CFLSteensAliasAnalysis.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 #include "llvm/Analysis/CGSCCPassManager.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
30 #include "llvm/Analysis/CallGraph.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
31 #include "llvm/Analysis/DemandedBits.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
32 #include "llvm/Analysis/DependenceAnalysis.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
33 #include "llvm/Analysis/DominanceFrontier.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
34 #include "llvm/Analysis/GlobalsModRef.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
35 #include "llvm/Analysis/IVUsers.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 #include "llvm/Analysis/LazyCallGraph.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
37 #include "llvm/Analysis/LazyValueInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
38 #include "llvm/Analysis/LoopAccessAnalysis.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 #include "llvm/Analysis/LoopInfo.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
40 #include "llvm/Analysis/MemoryDependenceAnalysis.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
41 #include "llvm/Analysis/MemorySSA.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
42 #include "llvm/Analysis/ModuleSummaryAnalysis.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
43 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
44 #include "llvm/Analysis/PostDominators.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
45 #include "llvm/Analysis/ProfileSummaryInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
46 #include "llvm/Analysis/RegionInfo.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 #include "llvm/Analysis/ScalarEvolution.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
48 #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
49 #include "llvm/Analysis/ScopedNoAliasAA.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 #include "llvm/Analysis/TargetLibraryInfo.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 #include "llvm/Analysis/TargetTransformInfo.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
52 #include "llvm/Analysis/TypeBasedAliasAnalysis.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
53 #include "llvm/CodeGen/PreISelIntrinsicLowering.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
54 #include "llvm/CodeGen/UnreachableBlockElim.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 #include "llvm/IR/Dominators.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 #include "llvm/IR/IRPrintingPasses.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 #include "llvm/IR/PassManager.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 #include "llvm/IR/Verifier.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 #include "llvm/Support/Debug.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
60 #include "llvm/Support/Regex.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 #include "llvm/Target/TargetMachine.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
62 #include "llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
63 #include "llvm/Transforms/GCOVProfiler.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
64 #include "llvm/Transforms/IPO/AlwaysInliner.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
65 #include "llvm/Transforms/IPO/ArgumentPromotion.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
66 #include "llvm/Transforms/IPO/CalledValuePropagation.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
67 #include "llvm/Transforms/IPO/ConstantMerge.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
68 #include "llvm/Transforms/IPO/CrossDSOCFI.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
69 #include "llvm/Transforms/IPO/DeadArgumentElimination.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
70 #include "llvm/Transforms/IPO/ElimAvailExtern.h"
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
71 #include "llvm/Transforms/IPO/ForceFunctionAttrs.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
72 #include "llvm/Transforms/IPO/FunctionAttrs.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
73 #include "llvm/Transforms/IPO/FunctionImport.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
74 #include "llvm/Transforms/IPO/GlobalDCE.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
75 #include "llvm/Transforms/IPO/GlobalOpt.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
76 #include "llvm/Transforms/IPO/GlobalSplit.h"
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
77 #include "llvm/Transforms/IPO/InferFunctionAttrs.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
78 #include "llvm/Transforms/IPO/Inliner.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
79 #include "llvm/Transforms/IPO/Internalize.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
80 #include "llvm/Transforms/IPO/LowerTypeTests.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
81 #include "llvm/Transforms/IPO/PartialInlining.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
82 #include "llvm/Transforms/IPO/SCCP.h"
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
83 #include "llvm/Transforms/IPO/StripDeadPrototypes.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
84 #include "llvm/Transforms/IPO/SyntheticCountsPropagation.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
85 #include "llvm/Transforms/IPO/WholeProgramDevirt.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 #include "llvm/Transforms/InstCombine/InstCombine.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
87 #include "llvm/Transforms/InstrProfiling.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
88 #include "llvm/Transforms/Instrumentation/BoundsChecking.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
89 #include "llvm/Transforms/PGOInstrumentation.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
90 #include "llvm/Transforms/SampleProfile.h"
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
91 #include "llvm/Transforms/Scalar/ADCE.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
92 #include "llvm/Transforms/Scalar/AlignmentFromAssumptions.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
93 #include "llvm/Transforms/Scalar/BDCE.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
94 #include "llvm/Transforms/Scalar/CallSiteSplitting.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
95 #include "llvm/Transforms/Scalar/ConstantHoisting.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
96 #include "llvm/Transforms/Scalar/CorrelatedValuePropagation.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
97 #include "llvm/Transforms/Scalar/DCE.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
98 #include "llvm/Transforms/Scalar/DeadStoreElimination.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
99 #include "llvm/Transforms/Scalar/DivRemPairs.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 #include "llvm/Transforms/Scalar/EarlyCSE.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
101 #include "llvm/Transforms/Scalar/Float2Int.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
102 #include "llvm/Transforms/Scalar/GVN.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
103 #include "llvm/Transforms/Scalar/GuardWidening.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
104 #include "llvm/Transforms/Scalar/IVUsersPrinter.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
105 #include "llvm/Transforms/Scalar/IndVarSimplify.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
106 #include "llvm/Transforms/Scalar/JumpThreading.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
107 #include "llvm/Transforms/Scalar/LICM.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
108 #include "llvm/Transforms/Scalar/LoopAccessAnalysisPrinter.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
109 #include "llvm/Transforms/Scalar/LoopDataPrefetch.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
110 #include "llvm/Transforms/Scalar/LoopDeletion.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
111 #include "llvm/Transforms/Scalar/LoopDistribute.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
112 #include "llvm/Transforms/Scalar/LoopIdiomRecognize.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
113 #include "llvm/Transforms/Scalar/LoopInstSimplify.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
114 #include "llvm/Transforms/Scalar/LoopLoadElimination.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
115 #include "llvm/Transforms/Scalar/LoopPassManager.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
116 #include "llvm/Transforms/Scalar/LoopPredication.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
117 #include "llvm/Transforms/Scalar/LoopRotation.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
118 #include "llvm/Transforms/Scalar/LoopSimplifyCFG.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
119 #include "llvm/Transforms/Scalar/LoopSink.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
120 #include "llvm/Transforms/Scalar/LoopStrengthReduce.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
121 #include "llvm/Transforms/Scalar/LoopUnrollPass.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
122 #include "llvm/Transforms/Scalar/LowerAtomic.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 #include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
124 #include "llvm/Transforms/Scalar/LowerGuardIntrinsic.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
125 #include "llvm/Transforms/Scalar/MemCpyOptimizer.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
126 #include "llvm/Transforms/Scalar/MergedLoadStoreMotion.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
127 #include "llvm/Transforms/Scalar/NaryReassociate.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
128 #include "llvm/Transforms/Scalar/NewGVN.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
129 #include "llvm/Transforms/Scalar/PartiallyInlineLibCalls.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
130 #include "llvm/Transforms/Scalar/Reassociate.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
131 #include "llvm/Transforms/Scalar/RewriteStatepointsForGC.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
132 #include "llvm/Transforms/Scalar/SCCP.h"
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
133 #include "llvm/Transforms/Scalar/SROA.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
134 #include "llvm/Transforms/Scalar/SimpleLoopUnswitch.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 #include "llvm/Transforms/Scalar/SimplifyCFG.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
136 #include "llvm/Transforms/Scalar/Sink.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
137 #include "llvm/Transforms/Scalar/SpeculateAroundPHIs.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
138 #include "llvm/Transforms/Scalar/SpeculativeExecution.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
139 #include "llvm/Transforms/Scalar/TailRecursionElimination.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
140 #include "llvm/Transforms/Utils/AddDiscriminators.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
141 #include "llvm/Transforms/Utils/BreakCriticalEdges.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
142 #include "llvm/Transforms/Utils/EntryExitInstrumenter.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
143 #include "llvm/Transforms/Utils/LCSSA.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
144 #include "llvm/Transforms/Utils/LibCallsShrinkWrap.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
145 #include "llvm/Transforms/Utils/LoopSimplify.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
146 #include "llvm/Transforms/Utils/LowerInvoke.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
147 #include "llvm/Transforms/Utils/Mem2Reg.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
148 #include "llvm/Transforms/Utils/NameAnonGlobals.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
149 #include "llvm/Transforms/Utils/SimplifyInstructions.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
150 #include "llvm/Transforms/Utils/SymbolRewriter.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
151 #include "llvm/Transforms/Vectorize/LoopVectorize.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
152 #include "llvm/Transforms/Vectorize/SLPVectorizer.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
153
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 using namespace llvm;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
156 static cl::opt<unsigned> MaxDevirtIterations("pm-max-devirt-iterations",
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
157 cl::ReallyHidden, cl::init(4));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
158 static cl::opt<bool>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
159 RunPartialInlining("enable-npm-partial-inlining", cl::init(false),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
160 cl::Hidden, cl::ZeroOrMore,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
161 cl::desc("Run Partial inlinining pass"));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
162
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
163 static cl::opt<bool>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
164 RunNewGVN("enable-npm-newgvn", cl::init(false),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
165 cl::Hidden, cl::ZeroOrMore,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
166 cl::desc("Run NewGVN instead of GVN"));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
167
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
168 static cl::opt<bool> EnableEarlyCSEMemSSA(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
169 "enable-npm-earlycse-memssa", cl::init(true), cl::Hidden,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
170 cl::desc("Enable the EarlyCSE w/ MemorySSA pass for the new PM (default = on)"));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
171
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
172 static cl::opt<bool> EnableGVNHoist(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
173 "enable-npm-gvn-hoist", cl::init(false), cl::Hidden,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
174 cl::desc("Enable the GVN hoisting pass for the new PM (default = off)"));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
175
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
176 static cl::opt<bool> EnableGVNSink(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
177 "enable-npm-gvn-sink", cl::init(false), cl::Hidden,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
178 cl::desc("Enable the GVN hoisting pass for the new PM (default = off)"));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
179
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
180 static cl::opt<bool> EnableSyntheticCounts(
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
181 "enable-npm-synthetic-counts", cl::init(false), cl::Hidden, cl::ZeroOrMore,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
182 cl::desc("Run synthetic function entry count generation "
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
183 "pass"));
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
184
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
185 static Regex DefaultAliasRegex(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
186 "^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
187
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
188 static bool isOptimizingForSize(PassBuilder::OptimizationLevel Level) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
189 switch (Level) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
190 case PassBuilder::O0:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
191 case PassBuilder::O1:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
192 case PassBuilder::O2:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
193 case PassBuilder::O3:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
194 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
195
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
196 case PassBuilder::Os:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
197 case PassBuilder::Oz:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
198 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
199 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
200 llvm_unreachable("Invalid optimization level!");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
201 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
202
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 namespace {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 /// \brief No-op module pass which does nothing.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 struct NoOpModulePass {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
207 PreservedAnalyses run(Module &M, ModuleAnalysisManager &) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
208 return PreservedAnalyses::all();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
209 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 static StringRef name() { return "NoOpModulePass"; }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 };
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 /// \brief No-op module analysis.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
214 class NoOpModuleAnalysis : public AnalysisInfoMixin<NoOpModuleAnalysis> {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
215 friend AnalysisInfoMixin<NoOpModuleAnalysis>;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
216 static AnalysisKey Key;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
217
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
218 public:
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 struct Result {};
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
220 Result run(Module &, ModuleAnalysisManager &) { return Result(); }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 static StringRef name() { return "NoOpModuleAnalysis"; }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 };
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 /// \brief No-op CGSCC pass which does nothing.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 struct NoOpCGSCCPass {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
226 PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
227 LazyCallGraph &, CGSCCUpdateResult &UR) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 return PreservedAnalyses::all();
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 static StringRef name() { return "NoOpCGSCCPass"; }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 };
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 /// \brief No-op CGSCC analysis.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
234 class NoOpCGSCCAnalysis : public AnalysisInfoMixin<NoOpCGSCCAnalysis> {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
235 friend AnalysisInfoMixin<NoOpCGSCCAnalysis>;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
236 static AnalysisKey Key;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
237
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
238 public:
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 struct Result {};
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
240 Result run(LazyCallGraph::SCC &, CGSCCAnalysisManager &, LazyCallGraph &G) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
241 return Result();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
242 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 static StringRef name() { return "NoOpCGSCCAnalysis"; }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 };
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 /// \brief No-op function pass which does nothing.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 struct NoOpFunctionPass {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
248 PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
249 return PreservedAnalyses::all();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
250 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 static StringRef name() { return "NoOpFunctionPass"; }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 };
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 /// \brief No-op function analysis.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
255 class NoOpFunctionAnalysis : public AnalysisInfoMixin<NoOpFunctionAnalysis> {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
256 friend AnalysisInfoMixin<NoOpFunctionAnalysis>;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
257 static AnalysisKey Key;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
258
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
259 public:
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 struct Result {};
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
261 Result run(Function &, FunctionAnalysisManager &) { return Result(); }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 static StringRef name() { return "NoOpFunctionAnalysis"; }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 };
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
265 /// \brief No-op loop pass which does nothing.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
266 struct NoOpLoopPass {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
267 PreservedAnalyses run(Loop &L, LoopAnalysisManager &,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
268 LoopStandardAnalysisResults &, LPMUpdater &) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
269 return PreservedAnalyses::all();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
270 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
271 static StringRef name() { return "NoOpLoopPass"; }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
272 };
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
273
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
274 /// \brief No-op loop analysis.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
275 class NoOpLoopAnalysis : public AnalysisInfoMixin<NoOpLoopAnalysis> {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
276 friend AnalysisInfoMixin<NoOpLoopAnalysis>;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
277 static AnalysisKey Key;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
278
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
279 public:
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
280 struct Result {};
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
281 Result run(Loop &, LoopAnalysisManager &, LoopStandardAnalysisResults &) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
282 return Result();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
283 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
284 static StringRef name() { return "NoOpLoopAnalysis"; }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
285 };
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
286
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
287 AnalysisKey NoOpModuleAnalysis::Key;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
288 AnalysisKey NoOpCGSCCAnalysis::Key;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
289 AnalysisKey NoOpFunctionAnalysis::Key;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
290 AnalysisKey NoOpLoopAnalysis::Key;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
291
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 } // End anonymous namespace.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
294 void PassBuilder::invokePeepholeEPCallbacks(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
295 FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
296 for (auto &C : PeepholeEPCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
297 C(FPM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
298 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
299
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 void PassBuilder::registerModuleAnalyses(ModuleAnalysisManager &MAM) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
301 #define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
302 MAM.registerPass([&] { return CREATE_PASS; });
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 #include "PassRegistry.def"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
304
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
305 for (auto &C : ModuleAnalysisRegistrationCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
306 C(MAM);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
308
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 void PassBuilder::registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
310 #define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
311 CGAM.registerPass([&] { return CREATE_PASS; });
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 #include "PassRegistry.def"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
313
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
314 for (auto &C : CGSCCAnalysisRegistrationCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
315 C(CGAM);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
317
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 void PassBuilder::registerFunctionAnalyses(FunctionAnalysisManager &FAM) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
319 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
320 FAM.registerPass([&] { return CREATE_PASS; });
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
321 #include "PassRegistry.def"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
322
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
323 for (auto &C : FunctionAnalysisRegistrationCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
324 C(FAM);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
325 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
326
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
327 void PassBuilder::registerLoopAnalyses(LoopAnalysisManager &LAM) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
328 #define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
329 LAM.registerPass([&] { return CREATE_PASS; });
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 #include "PassRegistry.def"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
331
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
332 for (auto &C : LoopAnalysisRegistrationCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
333 C(LAM);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
335
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
336 FunctionPassManager
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
337 PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
338 ThinLTOPhase Phase,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
339 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
340 assert(Level != O0 && "Must request optimizations!");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
341 FunctionPassManager FPM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
342
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
343 // Form SSA out of local memory accesses after breaking apart aggregates into
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
344 // scalars.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
345 FPM.addPass(SROA());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
346
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
347 // Catch trivial redundancies
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
348 FPM.addPass(EarlyCSEPass(EnableEarlyCSEMemSSA));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
349
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
350 // Hoisting of scalars and load expressions.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
351 if (EnableGVNHoist)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
352 FPM.addPass(GVNHoistPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
353
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
354 // Global value numbering based sinking.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
355 if (EnableGVNSink) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
356 FPM.addPass(GVNSinkPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
357 FPM.addPass(SimplifyCFGPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
358 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
359
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
360 // Speculative execution if the target has divergent branches; otherwise nop.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
361 FPM.addPass(SpeculativeExecutionPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
362
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
363 // Optimize based on known information about branches, and cleanup afterward.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
364 FPM.addPass(JumpThreadingPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
365 FPM.addPass(CorrelatedValuePropagationPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
366 FPM.addPass(SimplifyCFGPass());
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
367 if (Level == O3)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
368 FPM.addPass(AggressiveInstCombinePass());
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
369 FPM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
370
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
371 if (!isOptimizingForSize(Level))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
372 FPM.addPass(LibCallsShrinkWrapPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
373
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
374 invokePeepholeEPCallbacks(FPM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
375
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
376 // For PGO use pipeline, try to optimize memory intrinsics such as memcpy
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
377 // using the size value profile. Don't perform this when optimizing for size.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
378 if (PGOOpt && !PGOOpt->ProfileUseFile.empty() &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
379 !isOptimizingForSize(Level))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
380 FPM.addPass(PGOMemOPSizeOpt());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
381
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
382 FPM.addPass(TailCallElimPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
383 FPM.addPass(SimplifyCFGPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
384
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
385 // Form canonically associated expression trees, and simplify the trees using
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
386 // basic mathematical properties. For example, this will form (nearly)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
387 // minimal multiplication trees.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
388 FPM.addPass(ReassociatePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
389
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
390 // Add the primary loop simplification pipeline.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
391 // FIXME: Currently this is split into two loop pass pipelines because we run
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
392 // some function passes in between them. These can and should be replaced by
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
393 // loop pass equivalenst but those aren't ready yet. Specifically,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
394 // `SimplifyCFGPass` and `InstCombinePass` are used. We have
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
395 // `LoopSimplifyCFGPass` which isn't yet powerful enough, and the closest to
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
396 // the other we have is `LoopInstSimplify`.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
397 LoopPassManager LPM1(DebugLogging), LPM2(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
398
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
399 // Rotate Loop - disable header duplication at -Oz
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
400 LPM1.addPass(LoopRotatePass(Level != Oz));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
401 LPM1.addPass(LICMPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
402 LPM1.addPass(SimpleLoopUnswitchPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
403 LPM2.addPass(IndVarSimplifyPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
404 LPM2.addPass(LoopIdiomRecognizePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
405
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
406 for (auto &C : LateLoopOptimizationsEPCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
407 C(LPM2, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
408
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
409 LPM2.addPass(LoopDeletionPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
410 // Do not enable unrolling in PreLinkThinLTO phase during sample PGO
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
411 // because it changes IR to makes profile annotation in back compile
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
412 // inaccurate.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
413 if (Phase != ThinLTOPhase::PreLink ||
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
414 !PGOOpt || PGOOpt->SampleProfileFile.empty())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
415 LPM2.addPass(LoopFullUnrollPass(Level));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
416
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
417 for (auto &C : LoopOptimizerEndEPCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
418 C(LPM2, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
419
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
420 // We provide the opt remark emitter pass for LICM to use. We only need to do
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
421 // this once as it is immutable.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
422 FPM.addPass(RequireAnalysisPass<OptimizationRemarkEmitterAnalysis, Function>());
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
423 FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM1), DebugLogging));
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
424 FPM.addPass(SimplifyCFGPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
425 FPM.addPass(InstCombinePass());
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
426 FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM2), DebugLogging));
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
427
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
428 // Eliminate redundancies.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
429 if (Level != O1) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
430 // These passes add substantial compile time so skip them at O1.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
431 FPM.addPass(MergedLoadStoreMotionPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
432 if (RunNewGVN)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
433 FPM.addPass(NewGVNPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
434 else
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
435 FPM.addPass(GVN());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
436 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
437
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
438 // Specially optimize memory movement as it doesn't look like dataflow in SSA.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
439 FPM.addPass(MemCpyOptPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
440
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
441 // Sparse conditional constant propagation.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
442 // FIXME: It isn't clear why we do this *after* loop passes rather than
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
443 // before...
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
444 FPM.addPass(SCCPPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
445
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
446 // Delete dead bit computations (instcombine runs after to fold away the dead
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
447 // computations, and then ADCE will run later to exploit any new DCE
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
448 // opportunities that creates).
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
449 FPM.addPass(BDCEPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
450
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
451 // Run instcombine after redundancy and dead bit elimination to exploit
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
452 // opportunities opened up by them.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
453 FPM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
454 invokePeepholeEPCallbacks(FPM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
455
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
456 // Re-consider control flow based optimizations after redundancy elimination,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
457 // redo DCE, etc.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
458 FPM.addPass(JumpThreadingPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
459 FPM.addPass(CorrelatedValuePropagationPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
460 FPM.addPass(DSEPass());
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
461 FPM.addPass(createFunctionToLoopPassAdaptor(LICMPass(), DebugLogging));
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
462
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
463 for (auto &C : ScalarOptimizerLateEPCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
464 C(FPM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
465
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
466 // Finally, do an expensive DCE pass to catch all the dead code exposed by
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
467 // the simplifications and basic cleanup after all the simplifications.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
468 FPM.addPass(ADCEPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
469 FPM.addPass(SimplifyCFGPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
470 FPM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
471 invokePeepholeEPCallbacks(FPM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
472
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
473 return FPM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
474 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
475
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
476 void PassBuilder::addPGOInstrPasses(ModulePassManager &MPM, bool DebugLogging,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
477 PassBuilder::OptimizationLevel Level,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
478 bool RunProfileGen,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
479 std::string ProfileGenFile,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
480 std::string ProfileUseFile) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
481 // Generally running simplification passes and the inliner with an high
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
482 // threshold results in smaller executables, but there may be cases where
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
483 // the size grows, so let's be conservative here and skip this simplification
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
484 // at -Os/Oz.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
485 if (!isOptimizingForSize(Level)) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
486 InlineParams IP;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
487
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
488 // In the old pass manager, this is a cl::opt. Should still this be one?
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
489 IP.DefaultThreshold = 75;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
490
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
491 // FIXME: The hint threshold has the same value used by the regular inliner.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
492 // This should probably be lowered after performance testing.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
493 // FIXME: this comment is cargo culted from the old pass manager, revisit).
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
494 IP.HintThreshold = 325;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
495
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
496 CGSCCPassManager CGPipeline(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
497
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
498 CGPipeline.addPass(InlinerPass(IP));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
499
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
500 FunctionPassManager FPM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
501 FPM.addPass(SROA());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
502 FPM.addPass(EarlyCSEPass()); // Catch trivial redundancies.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
503 FPM.addPass(SimplifyCFGPass()); // Merge & remove basic blocks.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
504 FPM.addPass(InstCombinePass()); // Combine silly sequences.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
505 invokePeepholeEPCallbacks(FPM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
506
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
507 CGPipeline.addPass(createCGSCCToFunctionPassAdaptor(std::move(FPM)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
508
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
509 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPipeline)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
510 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
511
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
512 // Delete anything that is now dead to make sure that we don't instrument
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
513 // dead code. Instrumentation can end up keeping dead code around and
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
514 // dramatically increase code size.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
515 MPM.addPass(GlobalDCEPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
516
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
517 if (RunProfileGen) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
518 MPM.addPass(PGOInstrumentationGen());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
519
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
520 FunctionPassManager FPM;
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
521 FPM.addPass(
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
522 createFunctionToLoopPassAdaptor(LoopRotatePass(), DebugLogging));
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
523 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
524
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
525 // Add the profile lowering pass.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
526 InstrProfOptions Options;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
527 if (!ProfileGenFile.empty())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
528 Options.InstrProfileOutput = ProfileGenFile;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
529 Options.DoCounterPromotion = true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
530 MPM.addPass(InstrProfiling(Options));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
531 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
532
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
533 if (!ProfileUseFile.empty())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
534 MPM.addPass(PGOInstrumentationUse(ProfileUseFile));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
535 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
536
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
537 static InlineParams
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
538 getInlineParamsFromOptLevel(PassBuilder::OptimizationLevel Level) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
539 auto O3 = PassBuilder::O3;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
540 unsigned OptLevel = Level > O3 ? 2 : Level;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
541 unsigned SizeLevel = Level > O3 ? Level - O3 : 0;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
542 return getInlineParams(OptLevel, SizeLevel);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
543 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
544
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
545 ModulePassManager
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
546 PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
547 ThinLTOPhase Phase,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
548 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
549 ModulePassManager MPM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
550
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
551 // Do basic inference of function attributes from known properties of system
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
552 // libraries and other oracles.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
553 MPM.addPass(InferFunctionAttrsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
554
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
555 // Create an early function pass manager to cleanup the output of the
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
556 // frontend.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
557 FunctionPassManager EarlyFPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
558 EarlyFPM.addPass(SimplifyCFGPass());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
559 EarlyFPM.addPass(SROA());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
560 EarlyFPM.addPass(EarlyCSEPass());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
561 EarlyFPM.addPass(LowerExpectIntrinsicPass());
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
562 if (Level == O3)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
563 EarlyFPM.addPass(CallSiteSplittingPass());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
564
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
565 // In SamplePGO ThinLTO backend, we need instcombine before profile annotation
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
566 // to convert bitcast to direct calls so that they can be inlined during the
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
567 // profile annotation prepration step.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
568 // More details about SamplePGO design can be found in:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
569 // https://research.google.com/pubs/pub45290.html
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
570 // FIXME: revisit how SampleProfileLoad/Inliner/ICP is structured.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
571 if (PGOOpt && !PGOOpt->SampleProfileFile.empty() &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
572 Phase == ThinLTOPhase::PostLink)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
573 EarlyFPM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
574 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(EarlyFPM)));
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
575
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
576 if (PGOOpt && !PGOOpt->SampleProfileFile.empty()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
577 // Annotate sample profile right after early FPM to ensure freshness of
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
578 // the debug info.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
579 MPM.addPass(SampleProfileLoaderPass(PGOOpt->SampleProfileFile,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
580 Phase == ThinLTOPhase::PreLink));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
581 // Do not invoke ICP in the ThinLTOPrelink phase as it makes it hard
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
582 // for the profile annotation to be accurate in the ThinLTO backend.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
583 if (Phase != ThinLTOPhase::PreLink)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
584 // We perform early indirect call promotion here, before globalopt.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
585 // This is important for the ThinLTO backend phase because otherwise
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
586 // imported available_externally functions look unreferenced and are
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
587 // removed.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
588 MPM.addPass(PGOIndirectCallPromotion(Phase == ThinLTOPhase::PostLink,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
589 true));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
590 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
591
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
592 // Interprocedural constant propagation now that basic cleanup has occurred
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
593 // and prior to optimizing globals.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
594 // FIXME: This position in the pipeline hasn't been carefully considered in
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
595 // years, it should be re-analyzed.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
596 MPM.addPass(IPSCCPPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
597
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
598 // Attach metadata to indirect call sites indicating the set of functions
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
599 // they may target at run-time. This should follow IPSCCP.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
600 MPM.addPass(CalledValuePropagationPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
601
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
602 // Optimize globals to try and fold them into constants.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
603 MPM.addPass(GlobalOptPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
604
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
605 // Promote any localized globals to SSA registers.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
606 // FIXME: Should this instead by a run of SROA?
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
607 // FIXME: We should probably run instcombine and simplify-cfg afterward to
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
608 // delete control flows that are dead once globals have been folded to
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
609 // constants.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
610 MPM.addPass(createModuleToFunctionPassAdaptor(PromotePass()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
611
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
612 // Remove any dead arguments exposed by cleanups and constand folding
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
613 // globals.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
614 MPM.addPass(DeadArgumentEliminationPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
615
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
616 // Create a small function pass pipeline to cleanup after all the global
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
617 // optimizations.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
618 FunctionPassManager GlobalCleanupPM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
619 GlobalCleanupPM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
620 invokePeepholeEPCallbacks(GlobalCleanupPM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
621
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
622 GlobalCleanupPM.addPass(SimplifyCFGPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
623 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(GlobalCleanupPM)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
624
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
625 // Add all the requested passes for instrumentation PGO, if requested.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
626 if (PGOOpt && Phase != ThinLTOPhase::PostLink &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
627 (!PGOOpt->ProfileGenFile.empty() || !PGOOpt->ProfileUseFile.empty())) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
628 addPGOInstrPasses(MPM, DebugLogging, Level, PGOOpt->RunProfileGen,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
629 PGOOpt->ProfileGenFile, PGOOpt->ProfileUseFile);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
630 MPM.addPass(PGOIndirectCallPromotion(false, false));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
631 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
632
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
633 // Synthesize function entry counts for non-PGO compilation.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
634 if (EnableSyntheticCounts && !PGOOpt)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
635 MPM.addPass(SyntheticCountsPropagation());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
636
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
637 // Require the GlobalsAA analysis for the module so we can query it within
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
638 // the CGSCC pipeline.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
639 MPM.addPass(RequireAnalysisPass<GlobalsAA, Module>());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
640
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
641 // Require the ProfileSummaryAnalysis for the module so we can query it within
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
642 // the inliner pass.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
643 MPM.addPass(RequireAnalysisPass<ProfileSummaryAnalysis, Module>());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
644
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
645 // Now begin the main postorder CGSCC pipeline.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
646 // FIXME: The current CGSCC pipeline has its origins in the legacy pass
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
647 // manager and trying to emulate its precise behavior. Much of this doesn't
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
648 // make a lot of sense and we should revisit the core CGSCC structure.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
649 CGSCCPassManager MainCGPipeline(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
650
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
651 // Note: historically, the PruneEH pass was run first to deduce nounwind and
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
652 // generally clean up exception handling overhead. It isn't clear this is
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
653 // valuable as the inliner doesn't currently care whether it is inlining an
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
654 // invoke or a call.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
655
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
656 // Run the inliner first. The theory is that we are walking bottom-up and so
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
657 // the callees have already been fully optimized, and we want to inline them
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
658 // into the callers so that our optimizations can reflect that.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
659 // For PreLinkThinLTO pass, we disable hot-caller heuristic for sample PGO
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
660 // because it makes profile annotation in the backend inaccurate.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
661 InlineParams IP = getInlineParamsFromOptLevel(Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
662 if (Phase == ThinLTOPhase::PreLink &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
663 PGOOpt && !PGOOpt->SampleProfileFile.empty())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
664 IP.HotCallSiteThreshold = 0;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
665 MainCGPipeline.addPass(InlinerPass(IP));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
666
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
667 // Now deduce any function attributes based in the current code.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
668 MainCGPipeline.addPass(PostOrderFunctionAttrsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
669
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
670 // When at O3 add argument promotion to the pass pipeline.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
671 // FIXME: It isn't at all clear why this should be limited to O3.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
672 if (Level == O3)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
673 MainCGPipeline.addPass(ArgumentPromotionPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
674
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
675 // Lastly, add the core function simplification pipeline nested inside the
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
676 // CGSCC walk.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
677 MainCGPipeline.addPass(createCGSCCToFunctionPassAdaptor(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
678 buildFunctionSimplificationPipeline(Level, Phase, DebugLogging)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
679
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
680 for (auto &C : CGSCCOptimizerLateEPCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
681 C(MainCGPipeline, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
682
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
683 // We wrap the CGSCC pipeline in a devirtualization repeater. This will try
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
684 // to detect when we devirtualize indirect calls and iterate the SCC passes
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
685 // in that case to try and catch knock-on inlining or function attrs
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
686 // opportunities. Then we add it to the module pipeline by walking the SCCs
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
687 // in postorder (or bottom-up).
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
688 MPM.addPass(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
689 createModuleToPostOrderCGSCCPassAdaptor(createDevirtSCCRepeatedPass(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
690 std::move(MainCGPipeline), MaxDevirtIterations)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
691
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
692 return MPM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
693 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
694
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
695 ModulePassManager
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
696 PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
697 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
698 ModulePassManager MPM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
699
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
700 // Optimize globals now that the module is fully simplified.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
701 MPM.addPass(GlobalOptPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
702 MPM.addPass(GlobalDCEPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
703
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
704 // Run partial inlining pass to partially inline functions that have
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
705 // large bodies.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
706 if (RunPartialInlining)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
707 MPM.addPass(PartialInlinerPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
708
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
709 // Remove avail extern fns and globals definitions since we aren't compiling
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
710 // an object file for later LTO. For LTO we want to preserve these so they
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
711 // are eligible for inlining at link-time. Note if they are unreferenced they
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
712 // will be removed by GlobalDCE later, so this only impacts referenced
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
713 // available externally globals. Eventually they will be suppressed during
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
714 // codegen, but eliminating here enables more opportunity for GlobalDCE as it
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
715 // may make globals referenced by available external functions dead and saves
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
716 // running remaining passes on the eliminated functions.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
717 MPM.addPass(EliminateAvailableExternallyPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
718
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
719 // Do RPO function attribute inference across the module to forward-propagate
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
720 // attributes where applicable.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
721 // FIXME: Is this really an optimization rather than a canonicalization?
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
722 MPM.addPass(ReversePostOrderFunctionAttrsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
723
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
724 // Re-require GloblasAA here prior to function passes. This is particularly
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
725 // useful as the above will have inlined, DCE'ed, and function-attr
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
726 // propagated everything. We should at this point have a reasonably minimal
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
727 // and richly annotated call graph. By computing aliasing and mod/ref
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
728 // information for all local globals here, the late loop passes and notably
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
729 // the vectorizer will be able to use them to help recognize vectorizable
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
730 // memory operations.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
731 MPM.addPass(RequireAnalysisPass<GlobalsAA, Module>());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
732
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
733 FunctionPassManager OptimizePM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
734 OptimizePM.addPass(Float2IntPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
735 // FIXME: We need to run some loop optimizations to re-rotate loops after
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
736 // simplify-cfg and others undo their rotation.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
737
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
738 // Optimize the loop execution. These passes operate on entire loop nests
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
739 // rather than on each loop in an inside-out manner, and so they are actually
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
740 // function passes.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
741
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
742 for (auto &C : VectorizerStartEPCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
743 C(OptimizePM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
744
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
745 // First rotate loops that may have been un-rotated by prior passes.
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
746 OptimizePM.addPass(
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
747 createFunctionToLoopPassAdaptor(LoopRotatePass(), DebugLogging));
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
748
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
749 // Distribute loops to allow partial vectorization. I.e. isolate dependences
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
750 // into separate loop that would otherwise inhibit vectorization. This is
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
751 // currently only performed for loops marked with the metadata
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
752 // llvm.loop.distribute=true or when -enable-loop-distribute is specified.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
753 OptimizePM.addPass(LoopDistributePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
754
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
755 // Now run the core loop vectorizer.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
756 OptimizePM.addPass(LoopVectorizePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
757
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
758 // Eliminate loads by forwarding stores from the previous iteration to loads
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
759 // of the current iteration.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
760 OptimizePM.addPass(LoopLoadEliminationPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
761
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
762 // Cleanup after the loop optimization passes.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
763 OptimizePM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
764
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
765 // Now that we've formed fast to execute loop structures, we do further
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
766 // optimizations. These are run afterward as they might block doing complex
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
767 // analyses and transforms such as what are needed for loop vectorization.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
768
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
769 // Cleanup after loop vectorization, etc. Simplification passes like CVP and
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
770 // GVN, loop transforms, and others have already run, so it's now better to
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
771 // convert to more optimized IR using more aggressive simplify CFG options.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
772 // The extra sinking transform can create larger basic blocks, so do this
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
773 // before SLP vectorization.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
774 OptimizePM.addPass(SimplifyCFGPass(SimplifyCFGOptions().
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
775 forwardSwitchCondToPhi(true).
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
776 convertSwitchToLookupTable(true).
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
777 needCanonicalLoops(false).
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
778 sinkCommonInsts(true)));
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
779
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
780 // Optimize parallel scalar instruction chains into SIMD instructions.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
781 OptimizePM.addPass(SLPVectorizerPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
782
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
783 OptimizePM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
784
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
785 // Unroll small loops to hide loop backedge latency and saturate any parallel
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
786 // execution resources of an out-of-order processor. We also then need to
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
787 // clean up redundancies and loop invariant code.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
788 // FIXME: It would be really good to use a loop-integrated instruction
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
789 // combiner for cleanup here so that the unrolling and LICM can be pipelined
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
790 // across the loop nests.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
791 OptimizePM.addPass(LoopUnrollPass(Level));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
792 OptimizePM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
793 OptimizePM.addPass(RequireAnalysisPass<OptimizationRemarkEmitterAnalysis, Function>());
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
794 OptimizePM.addPass(createFunctionToLoopPassAdaptor(LICMPass(), DebugLogging));
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
795
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
796 // Now that we've vectorized and unrolled loops, we may have more refined
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
797 // alignment information, try to re-derive it here.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
798 OptimizePM.addPass(AlignmentFromAssumptionsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
799
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
800 // LoopSink pass sinks instructions hoisted by LICM, which serves as a
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
801 // canonicalization pass that enables other optimizations. As a result,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
802 // LoopSink pass needs to be a very late IR pass to avoid undoing LICM
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
803 // result too early.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
804 OptimizePM.addPass(LoopSinkPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
805
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
806 // And finally clean up LCSSA form before generating code.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
807 OptimizePM.addPass(InstSimplifierPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
808
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
809 // This hoists/decomposes div/rem ops. It should run after other sink/hoist
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
810 // passes to avoid re-sinking, but before SimplifyCFG because it can allow
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
811 // flattening of blocks.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
812 OptimizePM.addPass(DivRemPairsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
813
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
814 // LoopSink (and other loop passes since the last simplifyCFG) might have
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
815 // resulted in single-entry-single-exit or empty blocks. Clean up the CFG.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
816 OptimizePM.addPass(SimplifyCFGPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
817
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
818 // Optimize PHIs by speculating around them when profitable. Note that this
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
819 // pass needs to be run after any PRE or similar pass as it is essentially
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
820 // inserting redudnancies into the progrem. This even includes SimplifyCFG.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
821 OptimizePM.addPass(SpeculateAroundPHIsPass());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
822
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
823 // Add the core optimizing pipeline.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
824 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
825
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
826 // Now we need to do some global optimization transforms.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
827 // FIXME: It would seem like these should come first in the optimization
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
828 // pipeline and maybe be the bottom of the canonicalization pipeline? Weird
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
829 // ordering here.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
830 MPM.addPass(GlobalDCEPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
831 MPM.addPass(ConstantMergePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
832
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
833 return MPM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
834 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
835
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
836 ModulePassManager
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
837 PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
838 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
839 assert(Level != O0 && "Must request optimizations for the default pipeline!");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
840
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
841 ModulePassManager MPM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
842
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
843 // Force any function attributes we want the rest of the pipeline to observe.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
844 MPM.addPass(ForceFunctionAttrsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
845
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
846 // Apply module pipeline start EP callback.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
847 for (auto &C : PipelineStartEPCallbacks)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
848 C(MPM);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
849
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
850 if (PGOOpt && PGOOpt->SamplePGOSupport)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
851 MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
852
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
853 // Add the core simplification pipeline.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
854 MPM.addPass(buildModuleSimplificationPipeline(Level, ThinLTOPhase::None,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
855 DebugLogging));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
856
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
857 // Now add the optimization pipeline.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
858 MPM.addPass(buildModuleOptimizationPipeline(Level, DebugLogging));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
859
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
860 return MPM;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
861 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
862
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
863 ModulePassManager
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
864 PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
865 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
866 assert(Level != O0 && "Must request optimizations for the default pipeline!");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
867
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
868 ModulePassManager MPM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
869
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
870 // Force any function attributes we want the rest of the pipeline to observe.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
871 MPM.addPass(ForceFunctionAttrsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
872
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
873 if (PGOOpt && PGOOpt->SamplePGOSupport)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
874 MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
875
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
876 // Apply module pipeline start EP callback.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
877 for (auto &C : PipelineStartEPCallbacks)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
878 C(MPM);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
879
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
880 // If we are planning to perform ThinLTO later, we don't bloat the code with
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
881 // unrolling/vectorization/... now. Just simplify the module as much as we
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
882 // can.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
883 MPM.addPass(buildModuleSimplificationPipeline(Level, ThinLTOPhase::PreLink,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
884 DebugLogging));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
885
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
886 // Run partial inlining pass to partially inline functions that have
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
887 // large bodies.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
888 // FIXME: It isn't clear whether this is really the right place to run this
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
889 // in ThinLTO. Because there is another canonicalization and simplification
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
890 // phase that will run after the thin link, running this here ends up with
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
891 // less information than will be available later and it may grow functions in
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
892 // ways that aren't beneficial.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
893 if (RunPartialInlining)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
894 MPM.addPass(PartialInlinerPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
895
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
896 // Reduce the size of the IR as much as possible.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
897 MPM.addPass(GlobalOptPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
898
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
899 return MPM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
900 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
901
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
902 ModulePassManager
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
903 PassBuilder::buildThinLTODefaultPipeline(OptimizationLevel Level,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
904 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
905 // FIXME: The summary index is not hooked in the new pass manager yet.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
906 // When it's going to be hooked, enable WholeProgramDevirt and LowerTypeTest
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
907 // here.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
908
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
909 ModulePassManager MPM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
910
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
911 // Force any function attributes we want the rest of the pipeline to observe.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
912 MPM.addPass(ForceFunctionAttrsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
913
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
914 // During the ThinLTO backend phase we perform early indirect call promotion
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
915 // here, before globalopt. Otherwise imported available_externally functions
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
916 // look unreferenced and are removed.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
917 // FIXME: move this into buildModuleSimplificationPipeline to merge the logic
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
918 // with SamplePGO.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
919 if (!PGOOpt || PGOOpt->SampleProfileFile.empty())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
920 MPM.addPass(PGOIndirectCallPromotion(true /* InLTO */,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
921 false /* SamplePGO */));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
922
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
923 // Add the core simplification pipeline.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
924 MPM.addPass(buildModuleSimplificationPipeline(Level, ThinLTOPhase::PostLink,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
925 DebugLogging));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
926
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
927 // Now add the optimization pipeline.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
928 MPM.addPass(buildModuleOptimizationPipeline(Level, DebugLogging));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
929
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
930 return MPM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
931 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
932
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
933 ModulePassManager
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
934 PassBuilder::buildLTOPreLinkDefaultPipeline(OptimizationLevel Level,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
935 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
936 assert(Level != O0 && "Must request optimizations for the default pipeline!");
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
937 // FIXME: We should use a customized pre-link pipeline!
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
938 return buildPerModuleDefaultPipeline(Level, DebugLogging);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
939 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
940
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
941 ModulePassManager PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
942 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
943 assert(Level != O0 && "Must request optimizations for the default pipeline!");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
944 ModulePassManager MPM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
945
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
946 // Remove unused virtual tables to improve the quality of code generated by
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
947 // whole-program devirtualization and bitset lowering.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
948 MPM.addPass(GlobalDCEPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
949
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
950 // Force any function attributes we want the rest of the pipeline to observe.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
951 MPM.addPass(ForceFunctionAttrsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
952
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
953 // Do basic inference of function attributes from known properties of system
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
954 // libraries and other oracles.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
955 MPM.addPass(InferFunctionAttrsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
956
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
957 if (Level > 1) {
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
958 FunctionPassManager EarlyFPM(DebugLogging);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
959 EarlyFPM.addPass(CallSiteSplittingPass());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
960 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(EarlyFPM)));
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
961
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
962 // Indirect call promotion. This should promote all the targets that are
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
963 // left by the earlier promotion pass that promotes intra-module targets.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
964 // This two-step promotion is to save the compile time. For LTO, it should
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
965 // produce the same result as if we only do promotion here.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
966 MPM.addPass(PGOIndirectCallPromotion(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
967 true /* InLTO */, PGOOpt && !PGOOpt->SampleProfileFile.empty()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
968 // Propagate constants at call sites into the functions they call. This
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
969 // opens opportunities for globalopt (and inlining) by substituting function
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
970 // pointers passed as arguments to direct uses of functions.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
971 MPM.addPass(IPSCCPPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
972
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
973 // Attach metadata to indirect call sites indicating the set of functions
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
974 // they may target at run-time. This should follow IPSCCP.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
975 MPM.addPass(CalledValuePropagationPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
976 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
977
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
978 // Now deduce any function attributes based in the current code.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
979 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
980 PostOrderFunctionAttrsPass()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
981
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
982 // Do RPO function attribute inference across the module to forward-propagate
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
983 // attributes where applicable.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
984 // FIXME: Is this really an optimization rather than a canonicalization?
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
985 MPM.addPass(ReversePostOrderFunctionAttrsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
986
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
987 // Use inragne annotations on GEP indices to split globals where beneficial.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
988 MPM.addPass(GlobalSplitPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
989
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
990 // Run whole program optimization of virtual call when the list of callees
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
991 // is fixed.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
992 MPM.addPass(WholeProgramDevirtPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
993
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
994 // Stop here at -O1.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
995 if (Level == 1)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
996 return MPM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
997
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
998 // Optimize globals to try and fold them into constants.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
999 MPM.addPass(GlobalOptPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1000
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1001 // Promote any localized globals to SSA registers.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1002 MPM.addPass(createModuleToFunctionPassAdaptor(PromotePass()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1003
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1004 // Linking modules together can lead to duplicate global constant, only
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1005 // keep one copy of each constant.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1006 MPM.addPass(ConstantMergePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1007
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1008 // Remove unused arguments from functions.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1009 MPM.addPass(DeadArgumentEliminationPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1010
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1011 // Reduce the code after globalopt and ipsccp. Both can open up significant
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1012 // simplification opportunities, and both can propagate functions through
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1013 // function pointers. When this happens, we often have to resolve varargs
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1014 // calls, etc, so let instcombine do this.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1015 FunctionPassManager PeepholeFPM(DebugLogging);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
1016 if (Level == O3)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
1017 PeepholeFPM.addPass(AggressiveInstCombinePass());
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1018 PeepholeFPM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1019 invokePeepholeEPCallbacks(PeepholeFPM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1020
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1021 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(PeepholeFPM)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1022
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1023 // Note: historically, the PruneEH pass was run first to deduce nounwind and
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1024 // generally clean up exception handling overhead. It isn't clear this is
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1025 // valuable as the inliner doesn't currently care whether it is inlining an
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1026 // invoke or a call.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1027 // Run the inliner now.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1028 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1029 InlinerPass(getInlineParamsFromOptLevel(Level))));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1030
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1031 // Optimize globals again after we ran the inliner.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1032 MPM.addPass(GlobalOptPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1033
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1034 // Garbage collect dead functions.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1035 // FIXME: Add ArgumentPromotion pass after once it's ported.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1036 MPM.addPass(GlobalDCEPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1037
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1038 FunctionPassManager FPM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1039 // The IPO Passes may leave cruft around. Clean up after them.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1040 FPM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1041 invokePeepholeEPCallbacks(FPM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1042
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1043 FPM.addPass(JumpThreadingPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1044
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1045 // Break up allocas
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1046 FPM.addPass(SROA());
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1047
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1048 // Run a few AA driver optimizations here and now to cleanup the code.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1049 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1050
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1051 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1052 PostOrderFunctionAttrsPass()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1053 // FIXME: here we run IP alias analysis in the legacy PM.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1054
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1055 FunctionPassManager MainFPM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1056
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1057 // FIXME: once we fix LoopPass Manager, add LICM here.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1058 // FIXME: once we provide support for enabling MLSM, add it here.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1059 // FIXME: once we provide support for enabling NewGVN, add it here.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1060 if (RunNewGVN)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1061 MainFPM.addPass(NewGVNPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1062 else
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1063 MainFPM.addPass(GVN());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1064
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1065 // Remove dead memcpy()'s.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1066 MainFPM.addPass(MemCpyOptPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1067
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1068 // Nuke dead stores.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1069 MainFPM.addPass(DSEPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1070
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1071 // FIXME: at this point, we run a bunch of loop passes:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1072 // indVarSimplify, loopDeletion, loopInterchange, loopUnrool,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1073 // loopVectorize. Enable them once the remaining issue with LPM
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1074 // are sorted out.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1075
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1076 MainFPM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1077 MainFPM.addPass(SimplifyCFGPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1078 MainFPM.addPass(SCCPPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1079 MainFPM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1080 MainFPM.addPass(BDCEPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1081
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1082 // FIXME: We may want to run SLPVectorizer here.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1083 // After vectorization, assume intrinsics may tell us more
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1084 // about pointer alignments.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1085 #if 0
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1086 MainFPM.add(AlignmentFromAssumptionsPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1087 #endif
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1088
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1089 // FIXME: Conditionally run LoadCombine here, after it's ported
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1090 // (in case we still have this pass, given its questionable usefulness).
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1091
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1092 MainFPM.addPass(InstCombinePass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1093 invokePeepholeEPCallbacks(MainFPM, Level);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1094 MainFPM.addPass(JumpThreadingPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1095 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(MainFPM)));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1096
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1097 // Create a function that performs CFI checks for cross-DSO calls with
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1098 // targets in the current module.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1099 MPM.addPass(CrossDSOCFIPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1100
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1101 // Lower type metadata and the type.test intrinsic. This pass supports
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1102 // clang's control flow integrity mechanisms (-fsanitize=cfi*) and needs
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1103 // to be run at link time if CFI is enabled. This pass does nothing if
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1104 // CFI is disabled.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1105 // Enable once we add support for the summary in the new PM.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1106 #if 0
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1107 MPM.addPass(LowerTypeTestsPass(Summary ? PassSummaryAction::Export :
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1108 PassSummaryAction::None,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1109 Summary));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1110 #endif
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1111
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1112 // Add late LTO optimization passes.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1113 // Delete basic blocks, which optimization passes may have killed.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1114 MPM.addPass(createModuleToFunctionPassAdaptor(SimplifyCFGPass()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1115
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1116 // Drop bodies of available eternally objects to improve GlobalDCE.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1117 MPM.addPass(EliminateAvailableExternallyPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1118
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1119 // Now that we have optimized the program, discard unreachable functions.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1120 MPM.addPass(GlobalDCEPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1122 // FIXME: Enable MergeFuncs, conditionally, after ported, maybe.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1123 return MPM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1124 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1125
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1126 AAManager PassBuilder::buildDefaultAAPipeline() {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1127 AAManager AA;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1128
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1129 // The order in which these are registered determines their priority when
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1130 // being queried.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1131
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1132 // First we register the basic alias analysis that provides the majority of
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1133 // per-function local AA logic. This is a stateless, on-demand local set of
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1134 // AA techniques.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1135 AA.registerFunctionAnalysis<BasicAA>();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1136
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1137 // Next we query fast, specialized alias analyses that wrap IR-embedded
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1138 // information about aliasing.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1139 AA.registerFunctionAnalysis<ScopedNoAliasAA>();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1140 AA.registerFunctionAnalysis<TypeBasedAA>();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1141
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1142 // Add support for querying global aliasing information when available.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1143 // Because the `AAManager` is a function analysis and `GlobalsAA` is a module
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1144 // analysis, all that the `AAManager` can do is query for any *cached*
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1145 // results from `GlobalsAA` through a readonly proxy.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1146 AA.registerModuleAnalysis<GlobalsAA>();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1147
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1148 return AA;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1149 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1150
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1151 static Optional<int> parseRepeatPassName(StringRef Name) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1152 if (!Name.consume_front("repeat<") || !Name.consume_back(">"))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1153 return None;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1154 int Count;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1155 if (Name.getAsInteger(0, Count) || Count <= 0)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1156 return None;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1157 return Count;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1158 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1159
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1160 static Optional<int> parseDevirtPassName(StringRef Name) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1161 if (!Name.consume_front("devirt<") || !Name.consume_back(">"))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1162 return None;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1163 int Count;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1164 if (Name.getAsInteger(0, Count) || Count <= 0)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1165 return None;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1166 return Count;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1167 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1168
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1169 /// Tests whether a pass name starts with a valid prefix for a default pipeline
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1170 /// alias.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1171 static bool startsWithDefaultPipelineAliasPrefix(StringRef Name) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1172 return Name.startswith("default") || Name.startswith("thinlto") ||
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1173 Name.startswith("lto");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1174 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1175
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1176 /// Tests whether registered callbacks will accept a given pass name.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1177 ///
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1178 /// When parsing a pipeline text, the type of the outermost pipeline may be
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1179 /// omitted, in which case the type is automatically determined from the first
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1180 /// pass name in the text. This may be a name that is handled through one of the
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1181 /// callbacks. We check this through the oridinary parsing callbacks by setting
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1182 /// up a dummy PassManager in order to not force the client to also handle this
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1183 /// type of query.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1184 template <typename PassManagerT, typename CallbacksT>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1185 static bool callbacksAcceptPassName(StringRef Name, CallbacksT &Callbacks) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1186 if (!Callbacks.empty()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1187 PassManagerT DummyPM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1188 for (auto &CB : Callbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1189 if (CB(Name, DummyPM, {}))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1190 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1191 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1192 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1193 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1194
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1195 template <typename CallbacksT>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1196 static bool isModulePassName(StringRef Name, CallbacksT &Callbacks) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1197 // Manually handle aliases for pre-configured pipeline fragments.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1198 if (startsWithDefaultPipelineAliasPrefix(Name))
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1199 return DefaultAliasRegex.match(Name);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1200
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1201 // Explicitly handle pass manager names.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1202 if (Name == "module")
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1203 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1204 if (Name == "cgscc")
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1205 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1206 if (Name == "function")
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1207 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1208
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1209 // Explicitly handle custom-parsed pass names.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1210 if (parseRepeatPassName(Name))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1211 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1212
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1213 #define MODULE_PASS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1214 if (Name == NAME) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1215 return true;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1216 #define MODULE_ANALYSIS(NAME, CREATE_PASS) \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1217 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1218 return true;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1219 #include "PassRegistry.def"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1220
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1221 return callbacksAcceptPassName<ModulePassManager>(Name, Callbacks);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1222 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1223
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1224 template <typename CallbacksT>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1225 static bool isCGSCCPassName(StringRef Name, CallbacksT &Callbacks) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1226 // Explicitly handle pass manager names.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1227 if (Name == "cgscc")
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1228 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1229 if (Name == "function")
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1230 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1231
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1232 // Explicitly handle custom-parsed pass names.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1233 if (parseRepeatPassName(Name))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1234 return true;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1235 if (parseDevirtPassName(Name))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1236 return true;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1237
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1238 #define CGSCC_PASS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1239 if (Name == NAME) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1240 return true;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1241 #define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1242 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1243 return true;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1244 #include "PassRegistry.def"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1245
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1246 return callbacksAcceptPassName<CGSCCPassManager>(Name, Callbacks);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1247 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1248
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1249 template <typename CallbacksT>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1250 static bool isFunctionPassName(StringRef Name, CallbacksT &Callbacks) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1251 // Explicitly handle pass manager names.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1252 if (Name == "function")
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1253 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1254 if (Name == "loop")
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1255 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1256
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1257 // Explicitly handle custom-parsed pass names.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1258 if (parseRepeatPassName(Name))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1259 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1260
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1261 #define FUNCTION_PASS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1262 if (Name == NAME) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1263 return true;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1264 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1265 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1266 return true;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1267 #include "PassRegistry.def"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1268
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1269 return callbacksAcceptPassName<FunctionPassManager>(Name, Callbacks);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1270 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1271
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1272 template <typename CallbacksT>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1273 static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1274 // Explicitly handle pass manager names.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1275 if (Name == "loop")
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1276 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1277
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1278 // Explicitly handle custom-parsed pass names.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1279 if (parseRepeatPassName(Name))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1280 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1281
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1282 #define LOOP_PASS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1283 if (Name == NAME) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1284 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1285 #define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1286 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1287 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1288 #include "PassRegistry.def"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1289
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1290 return callbacksAcceptPassName<LoopPassManager>(Name, Callbacks);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1291 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1292
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1293 Optional<std::vector<PassBuilder::PipelineElement>>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1294 PassBuilder::parsePipelineText(StringRef Text) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1295 std::vector<PipelineElement> ResultPipeline;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1296
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1297 SmallVector<std::vector<PipelineElement> *, 4> PipelineStack = {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1298 &ResultPipeline};
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1299 for (;;) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1300 std::vector<PipelineElement> &Pipeline = *PipelineStack.back();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1301 size_t Pos = Text.find_first_of(",()");
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1302 Pipeline.push_back({Text.substr(0, Pos), {}});
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1303
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1304 // If we have a single terminating name, we're done.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1305 if (Pos == Text.npos)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1306 break;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1307
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1308 char Sep = Text[Pos];
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1309 Text = Text.substr(Pos + 1);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1310 if (Sep == ',')
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1311 // Just a name ending in a comma, continue.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1312 continue;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1313
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1314 if (Sep == '(') {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1315 // Push the inner pipeline onto the stack to continue processing.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1316 PipelineStack.push_back(&Pipeline.back().InnerPipeline);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1317 continue;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1318 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1319
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1320 assert(Sep == ')' && "Bogus separator!");
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1321 // When handling the close parenthesis, we greedily consume them to avoid
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1322 // empty strings in the pipeline.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1323 do {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1324 // If we try to pop the outer pipeline we have unbalanced parentheses.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1325 if (PipelineStack.size() == 1)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1326 return None;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1327
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1328 PipelineStack.pop_back();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1329 } while (Text.consume_front(")"));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1330
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1331 // Check if we've finished parsing.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1332 if (Text.empty())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1333 break;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1334
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1335 // Otherwise, the end of an inner pipeline always has to be followed by
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1336 // a comma, and then we can continue.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1337 if (!Text.consume_front(","))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1338 return None;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1339 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1340
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1341 if (PipelineStack.size() > 1)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1342 // Unbalanced paretheses.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1343 return None;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1344
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1345 assert(PipelineStack.back() == &ResultPipeline &&
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1346 "Wrong pipeline at the bottom of the stack!");
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1347 return {std::move(ResultPipeline)};
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1348 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1349
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1350 bool PassBuilder::parseModulePass(ModulePassManager &MPM,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1351 const PipelineElement &E, bool VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1352 bool DebugLogging) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1353 auto &Name = E.Name;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1354 auto &InnerPipeline = E.InnerPipeline;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1355
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1356 // First handle complex passes like the pass managers which carry pipelines.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1357 if (!InnerPipeline.empty()) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1358 if (Name == "module") {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1359 ModulePassManager NestedMPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1360 if (!parseModulePassPipeline(NestedMPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1361 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1362 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1363 MPM.addPass(std::move(NestedMPM));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1364 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1365 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1366 if (Name == "cgscc") {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1367 CGSCCPassManager CGPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1368 if (!parseCGSCCPassPipeline(CGPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1369 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1370 return false;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1371 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM)));
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1372 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1373 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1374 if (Name == "function") {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1375 FunctionPassManager FPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1376 if (!parseFunctionPassPipeline(FPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1377 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1378 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1379 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1380 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1381 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1382 if (auto Count = parseRepeatPassName(Name)) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1383 ModulePassManager NestedMPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1384 if (!parseModulePassPipeline(NestedMPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1385 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1386 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1387 MPM.addPass(createRepeatedPass(*Count, std::move(NestedMPM)));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1388 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1389 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1390
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1391 for (auto &C : ModulePipelineParsingCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1392 if (C(Name, MPM, InnerPipeline))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1393 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1394
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1395 // Normal passes can't have pipelines.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1396 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1397 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1398
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1399 // Manually handle aliases for pre-configured pipeline fragments.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1400 if (startsWithDefaultPipelineAliasPrefix(Name)) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1401 SmallVector<StringRef, 3> Matches;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1402 if (!DefaultAliasRegex.match(Name, &Matches))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1403 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1404 assert(Matches.size() == 3 && "Must capture two matched strings!");
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1405
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1406 OptimizationLevel L = StringSwitch<OptimizationLevel>(Matches[2])
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1407 .Case("O0", O0)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1408 .Case("O1", O1)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1409 .Case("O2", O2)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1410 .Case("O3", O3)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1411 .Case("Os", Os)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1412 .Case("Oz", Oz);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1413 if (L == O0)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1414 // At O0 we do nothing at all!
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1415 return true;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1416
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1417 if (Matches[1] == "default") {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1418 MPM.addPass(buildPerModuleDefaultPipeline(L, DebugLogging));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1419 } else if (Matches[1] == "thinlto-pre-link") {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1420 MPM.addPass(buildThinLTOPreLinkDefaultPipeline(L, DebugLogging));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1421 } else if (Matches[1] == "thinlto") {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1422 MPM.addPass(buildThinLTODefaultPipeline(L, DebugLogging));
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1423 } else if (Matches[1] == "lto-pre-link") {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1424 MPM.addPass(buildLTOPreLinkDefaultPipeline(L, DebugLogging));
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1425 } else {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1426 assert(Matches[1] == "lto" && "Not one of the matched options!");
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1427 MPM.addPass(buildLTODefaultPipeline(L, DebugLogging));
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1428 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1429 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1430 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1431
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1432 // Finally expand the basic registered passes from the .inc file.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1433 #define MODULE_PASS(NAME, CREATE_PASS) \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1434 if (Name == NAME) { \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1435 MPM.addPass(CREATE_PASS); \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1436 return true; \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1437 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1438 #define MODULE_ANALYSIS(NAME, CREATE_PASS) \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1439 if (Name == "require<" NAME ">") { \
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1440 MPM.addPass( \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1441 RequireAnalysisPass< \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1442 std::remove_reference<decltype(CREATE_PASS)>::type, Module>()); \
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1443 return true; \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1444 } \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1445 if (Name == "invalidate<" NAME ">") { \
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1446 MPM.addPass(InvalidateAnalysisPass< \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1447 std::remove_reference<decltype(CREATE_PASS)>::type>()); \
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1448 return true; \
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1449 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1450 #include "PassRegistry.def"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1451
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1452 for (auto &C : ModulePipelineParsingCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1453 if (C(Name, MPM, InnerPipeline))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1454 return true;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1455 return false;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1456 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1457
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1458 bool PassBuilder::parseCGSCCPass(CGSCCPassManager &CGPM,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1459 const PipelineElement &E, bool VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1460 bool DebugLogging) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1461 auto &Name = E.Name;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1462 auto &InnerPipeline = E.InnerPipeline;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1463
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1464 // First handle complex passes like the pass managers which carry pipelines.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1465 if (!InnerPipeline.empty()) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1466 if (Name == "cgscc") {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1467 CGSCCPassManager NestedCGPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1468 if (!parseCGSCCPassPipeline(NestedCGPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1469 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1470 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1471 // Add the nested pass manager with the appropriate adaptor.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1472 CGPM.addPass(std::move(NestedCGPM));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1473 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1474 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1475 if (Name == "function") {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1476 FunctionPassManager FPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1477 if (!parseFunctionPassPipeline(FPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1478 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1479 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1480 // Add the nested pass manager with the appropriate adaptor.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1481 CGPM.addPass(createCGSCCToFunctionPassAdaptor(std::move(FPM)));
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1482 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1483 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1484 if (auto Count = parseRepeatPassName(Name)) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1485 CGSCCPassManager NestedCGPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1486 if (!parseCGSCCPassPipeline(NestedCGPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1487 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1488 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1489 CGPM.addPass(createRepeatedPass(*Count, std::move(NestedCGPM)));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1490 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1491 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1492 if (auto MaxRepetitions = parseDevirtPassName(Name)) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1493 CGSCCPassManager NestedCGPM(DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1494 if (!parseCGSCCPassPipeline(NestedCGPM, InnerPipeline, VerifyEachPass,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1495 DebugLogging))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1496 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1497 CGPM.addPass(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1498 createDevirtSCCRepeatedPass(std::move(NestedCGPM), *MaxRepetitions));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1499 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1500 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1501
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1502 for (auto &C : CGSCCPipelineParsingCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1503 if (C(Name, CGPM, InnerPipeline))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1504 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1505
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1506 // Normal passes can't have pipelines.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1507 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1508 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1509
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1510 // Now expand the basic registered passes from the .inc file.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1511 #define CGSCC_PASS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1512 if (Name == NAME) { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1513 CGPM.addPass(CREATE_PASS); \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1514 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1515 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1516 #define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1517 if (Name == "require<" NAME ">") { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1518 CGPM.addPass(RequireAnalysisPass< \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1519 std::remove_reference<decltype(CREATE_PASS)>::type, \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1520 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1521 CGSCCUpdateResult &>()); \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1522 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1523 } \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1524 if (Name == "invalidate<" NAME ">") { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1525 CGPM.addPass(InvalidateAnalysisPass< \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1526 std::remove_reference<decltype(CREATE_PASS)>::type>()); \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1527 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1528 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1529 #include "PassRegistry.def"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1530
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1531 for (auto &C : CGSCCPipelineParsingCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1532 if (C(Name, CGPM, InnerPipeline))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1533 return true;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1534 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1535 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1536
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1537 bool PassBuilder::parseFunctionPass(FunctionPassManager &FPM,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1538 const PipelineElement &E,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1539 bool VerifyEachPass, bool DebugLogging) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1540 auto &Name = E.Name;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1541 auto &InnerPipeline = E.InnerPipeline;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1542
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1543 // First handle complex passes like the pass managers which carry pipelines.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1544 if (!InnerPipeline.empty()) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1545 if (Name == "function") {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1546 FunctionPassManager NestedFPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1547 if (!parseFunctionPassPipeline(NestedFPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1548 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1549 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1550 // Add the nested pass manager with the appropriate adaptor.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1551 FPM.addPass(std::move(NestedFPM));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1552 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1553 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1554 if (Name == "loop") {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1555 LoopPassManager LPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1556 if (!parseLoopPassPipeline(LPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1557 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1558 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1559 // Add the nested pass manager with the appropriate adaptor.
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
1560 FPM.addPass(
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
1561 createFunctionToLoopPassAdaptor(std::move(LPM), DebugLogging));
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1562 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1563 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1564 if (auto Count = parseRepeatPassName(Name)) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1565 FunctionPassManager NestedFPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1566 if (!parseFunctionPassPipeline(NestedFPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1567 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1568 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1569 FPM.addPass(createRepeatedPass(*Count, std::move(NestedFPM)));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1570 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1571 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1572
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1573 for (auto &C : FunctionPipelineParsingCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1574 if (C(Name, FPM, InnerPipeline))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1575 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1576
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1577 // Normal passes can't have pipelines.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1578 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1579 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1580
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1581 // Now expand the basic registered passes from the .inc file.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1582 #define FUNCTION_PASS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1583 if (Name == NAME) { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1584 FPM.addPass(CREATE_PASS); \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1585 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1586 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1587 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1588 if (Name == "require<" NAME ">") { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1589 FPM.addPass( \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1590 RequireAnalysisPass< \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1591 std::remove_reference<decltype(CREATE_PASS)>::type, Function>()); \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1592 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1593 } \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1594 if (Name == "invalidate<" NAME ">") { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1595 FPM.addPass(InvalidateAnalysisPass< \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1596 std::remove_reference<decltype(CREATE_PASS)>::type>()); \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1597 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1598 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1599 #include "PassRegistry.def"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1600
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1601 for (auto &C : FunctionPipelineParsingCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1602 if (C(Name, FPM, InnerPipeline))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1603 return true;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1604 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1605 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1606
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1607 bool PassBuilder::parseLoopPass(LoopPassManager &LPM, const PipelineElement &E,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1608 bool VerifyEachPass, bool DebugLogging) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1609 StringRef Name = E.Name;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1610 auto &InnerPipeline = E.InnerPipeline;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1611
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1612 // First handle complex passes like the pass managers which carry pipelines.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1613 if (!InnerPipeline.empty()) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1614 if (Name == "loop") {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1615 LoopPassManager NestedLPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1616 if (!parseLoopPassPipeline(NestedLPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1617 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1618 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1619 // Add the nested pass manager with the appropriate adaptor.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1620 LPM.addPass(std::move(NestedLPM));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1621 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1622 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1623 if (auto Count = parseRepeatPassName(Name)) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1624 LoopPassManager NestedLPM(DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1625 if (!parseLoopPassPipeline(NestedLPM, InnerPipeline, VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1626 DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1627 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1628 LPM.addPass(createRepeatedPass(*Count, std::move(NestedLPM)));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1629 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1630 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1631
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1632 for (auto &C : LoopPipelineParsingCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1633 if (C(Name, LPM, InnerPipeline))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1634 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1635
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1636 // Normal passes can't have pipelines.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1637 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1638 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1639
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1640 // Now expand the basic registered passes from the .inc file.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1641 #define LOOP_PASS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1642 if (Name == NAME) { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1643 LPM.addPass(CREATE_PASS); \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1644 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1645 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1646 #define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1647 if (Name == "require<" NAME ">") { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1648 LPM.addPass(RequireAnalysisPass< \
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1649 std::remove_reference<decltype(CREATE_PASS)>::type, Loop, \
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1650 LoopAnalysisManager, LoopStandardAnalysisResults &, \
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1651 LPMUpdater &>()); \
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1652 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1653 } \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1654 if (Name == "invalidate<" NAME ">") { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1655 LPM.addPass(InvalidateAnalysisPass< \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1656 std::remove_reference<decltype(CREATE_PASS)>::type>()); \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1657 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1658 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1659 #include "PassRegistry.def"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1660
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1661 for (auto &C : LoopPipelineParsingCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1662 if (C(Name, LPM, InnerPipeline))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1663 return true;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1664 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1665 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1666
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1667 bool PassBuilder::parseAAPassName(AAManager &AA, StringRef Name) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1668 #define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1669 if (Name == NAME) { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1670 AA.registerModuleAnalysis< \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1671 std::remove_reference<decltype(CREATE_PASS)>::type>(); \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1672 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1673 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1674 #define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1675 if (Name == NAME) { \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1676 AA.registerFunctionAnalysis< \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1677 std::remove_reference<decltype(CREATE_PASS)>::type>(); \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1678 return true; \
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1679 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1680 #include "PassRegistry.def"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1681
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1682 for (auto &C : AAParsingCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1683 if (C(Name, AA))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1684 return true;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1685 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1686 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1687
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1688 bool PassBuilder::parseLoopPassPipeline(LoopPassManager &LPM,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1689 ArrayRef<PipelineElement> Pipeline,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1690 bool VerifyEachPass,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1691 bool DebugLogging) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1692 for (const auto &Element : Pipeline) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1693 if (!parseLoopPass(LPM, Element, VerifyEachPass, DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1694 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1695 // FIXME: No verifier support for Loop passes!
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1696 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1697 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1698 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1699
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1700 bool PassBuilder::parseFunctionPassPipeline(FunctionPassManager &FPM,
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1701 ArrayRef<PipelineElement> Pipeline,
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1702 bool VerifyEachPass,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1703 bool DebugLogging) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1704 for (const auto &Element : Pipeline) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1705 if (!parseFunctionPass(FPM, Element, VerifyEachPass, DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1706 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1707 if (VerifyEachPass)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1708 FPM.addPass(VerifierPass());
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1709 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1710 return true;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1711 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1712
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1713 bool PassBuilder::parseCGSCCPassPipeline(CGSCCPassManager &CGPM,
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1714 ArrayRef<PipelineElement> Pipeline,
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1715 bool VerifyEachPass,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1716 bool DebugLogging) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1717 for (const auto &Element : Pipeline) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1718 if (!parseCGSCCPass(CGPM, Element, VerifyEachPass, DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1719 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1720 // FIXME: No verifier support for CGSCC passes!
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1721 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1722 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1723 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1724
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1725 void PassBuilder::crossRegisterProxies(LoopAnalysisManager &LAM,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1726 FunctionAnalysisManager &FAM,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1727 CGSCCAnalysisManager &CGAM,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1728 ModuleAnalysisManager &MAM) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1729 MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); });
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1730 MAM.registerPass([&] { return CGSCCAnalysisManagerModuleProxy(CGAM); });
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1731 CGAM.registerPass([&] { return ModuleAnalysisManagerCGSCCProxy(MAM); });
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1732 FAM.registerPass([&] { return CGSCCAnalysisManagerFunctionProxy(CGAM); });
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1733 FAM.registerPass([&] { return ModuleAnalysisManagerFunctionProxy(MAM); });
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1734 FAM.registerPass([&] { return LoopAnalysisManagerFunctionProxy(LAM); });
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1735 LAM.registerPass([&] { return FunctionAnalysisManagerLoopProxy(FAM); });
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1736 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1737
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1738 bool PassBuilder::parseModulePassPipeline(ModulePassManager &MPM,
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1739 ArrayRef<PipelineElement> Pipeline,
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1740 bool VerifyEachPass,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1741 bool DebugLogging) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1742 for (const auto &Element : Pipeline) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1743 if (!parseModulePass(MPM, Element, VerifyEachPass, DebugLogging))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1744 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1745 if (VerifyEachPass)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1746 MPM.addPass(VerifierPass());
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1747 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1748 return true;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1749 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1750
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1751 // Primary pass pipeline description parsing routine for a \c ModulePassManager
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1752 // FIXME: Should this routine accept a TargetMachine or require the caller to
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1753 // pre-populate the analysis managers with target-specific stuff?
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1754 bool PassBuilder::parsePassPipeline(ModulePassManager &MPM,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1755 StringRef PipelineText, bool VerifyEachPass,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1756 bool DebugLogging) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1757 auto Pipeline = parsePipelineText(PipelineText);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1758 if (!Pipeline || Pipeline->empty())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1759 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1760
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1761 // If the first name isn't at the module layer, wrap the pipeline up
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1762 // automatically.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1763 StringRef FirstName = Pipeline->front().Name;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1764
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1765 if (!isModulePassName(FirstName, ModulePipelineParsingCallbacks)) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1766 if (isCGSCCPassName(FirstName, CGSCCPipelineParsingCallbacks)) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1767 Pipeline = {{"cgscc", std::move(*Pipeline)}};
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1768 } else if (isFunctionPassName(FirstName,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1769 FunctionPipelineParsingCallbacks)) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1770 Pipeline = {{"function", std::move(*Pipeline)}};
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1771 } else if (isLoopPassName(FirstName, LoopPipelineParsingCallbacks)) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1772 Pipeline = {{"function", {{"loop", std::move(*Pipeline)}}}};
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1773 } else {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1774 for (auto &C : TopLevelPipelineParsingCallbacks)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1775 if (C(MPM, *Pipeline, VerifyEachPass, DebugLogging))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1776 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1777
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1778 // Unknown pass name!
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1779 return false;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1780 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1781 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1782
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1783 return parseModulePassPipeline(MPM, *Pipeline, VerifyEachPass, DebugLogging);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1784 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1785
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1786 // Primary pass pipeline description parsing routine for a \c CGSCCPassManager
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1787 bool PassBuilder::parsePassPipeline(CGSCCPassManager &CGPM,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1788 StringRef PipelineText, bool VerifyEachPass,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1789 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1790 auto Pipeline = parsePipelineText(PipelineText);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1791 if (!Pipeline || Pipeline->empty())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1792 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1793
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1794 StringRef FirstName = Pipeline->front().Name;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1795 if (!isCGSCCPassName(FirstName, CGSCCPipelineParsingCallbacks))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1796 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1797
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1798 return parseCGSCCPassPipeline(CGPM, *Pipeline, VerifyEachPass, DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1799 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1800
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1801 // Primary pass pipeline description parsing routine for a \c
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1802 // FunctionPassManager
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1803 bool PassBuilder::parsePassPipeline(FunctionPassManager &FPM,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1804 StringRef PipelineText, bool VerifyEachPass,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1805 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1806 auto Pipeline = parsePipelineText(PipelineText);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1807 if (!Pipeline || Pipeline->empty())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1808 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1809
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1810 StringRef FirstName = Pipeline->front().Name;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1811 if (!isFunctionPassName(FirstName, FunctionPipelineParsingCallbacks))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1812 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1813
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1814 return parseFunctionPassPipeline(FPM, *Pipeline, VerifyEachPass,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1815 DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1816 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1817
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1818 // Primary pass pipeline description parsing routine for a \c LoopPassManager
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1819 bool PassBuilder::parsePassPipeline(LoopPassManager &CGPM,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1820 StringRef PipelineText, bool VerifyEachPass,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1821 bool DebugLogging) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1822 auto Pipeline = parsePipelineText(PipelineText);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1823 if (!Pipeline || Pipeline->empty())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1824 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1825
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1826 return parseLoopPassPipeline(CGPM, *Pipeline, VerifyEachPass, DebugLogging);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1827 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1828
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1829 bool PassBuilder::parseAAPipeline(AAManager &AA, StringRef PipelineText) {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1830 // If the pipeline just consists of the word 'default' just replace the AA
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1831 // manager with our default one.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1832 if (PipelineText == "default") {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1833 AA = buildDefaultAAPipeline();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1834 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1835 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1836
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1837 while (!PipelineText.empty()) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1838 StringRef Name;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1839 std::tie(Name, PipelineText) = PipelineText.split(',');
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1840 if (!parseAAPassName(AA, Name))
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1841 return false;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1842 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1843
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
1844 return true;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1845 }