LLVM 23.0.0git
X86CodeGenPassBuilder.cpp
Go to the documentation of this file.
1//===-- X86CodeGenPassBuilder.cpp ---------------------------------*- C++ -*-=//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8/// \file
9/// This file contains X86 CodeGen pipeline builder.
10/// TODO: Port CodeGen passes to new pass manager.
11//===----------------------------------------------------------------------===//
12
13#include "X86.h"
14#include "X86ISelDAGToDAG.h"
15#include "X86TargetMachine.h"
16
22#include "llvm/MC/MCStreamer.h"
27
28using namespace llvm;
29
31
32namespace {
33
34class X86CodeGenPassBuilder
35 : public CodeGenPassBuilder<X86CodeGenPassBuilder, X86TargetMachine> {
36 using Base = CodeGenPassBuilder<X86CodeGenPassBuilder, X86TargetMachine>;
37
38public:
39 explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
40 const CGPassBuilderOption &Opts,
41 PassInstrumentationCallbacks *PIC)
42 : CodeGenPassBuilder(TM, Opts, PIC) {}
43
44 void addIRPasses(PassManagerWrapper &PMW) const;
45 void addPreISel(PassManagerWrapper &PMW) const;
46 Error addInstSelector(PassManagerWrapper &PMW) const;
47 void addILPOpts(PassManagerWrapper &PMW) const;
48 void addMachineSSAOptimization(PassManagerWrapper &PMW) const;
49 void addPreRegAlloc(PassManagerWrapper &PMW) const;
50 // TODO(boomanaiden154): We need to add addPostFastRegAllocRewrite here once
51 // it is available to support AMX.
52 void addPostRegAlloc(PassManagerWrapper &PMW) const;
53 void addPreSched2(PassManagerWrapper &PMW) const;
54 void addPreEmitPass(PassManagerWrapper &PMW) const;
55 void addPreEmitPass2(PassManagerWrapper &PMW) const;
56 // TODO(boomanaiden154): We need to add addRegAssignAndRewriteOptimized here
57 // once it is available to support AMX.
58 void addAsmPrinter(PassManagerWrapper &PMW, CreateMCStreamer) const;
59};
60
61void X86CodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) const {
62 addFunctionPass(AtomicExpandPass(TM), PMW);
63
64 // We add both pass anyway and when these two passes run, one will be a
65 // no-op based on the optimization level/attributes.
66 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
67 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
68
69 Base::addIRPasses(PMW);
70
71 if (getOptLevel() != CodeGenOptLevel::None) {
72 addFunctionPass(InterleavedAccessPass(TM), PMW);
73 addFunctionPass(X86PartialReductionPass(&TM), PMW);
74 }
75
76 // Add passes that handle indirect branch removal and insertion of a retpoline
77 // thunk. These will be a no-op unless a function subtarget has the retpoline
78 // feature enabled.
79 addFunctionPass(IndirectBrExpandPass(TM), PMW);
80
81 // Add Control Flow Guard checks.
82 const Triple &TT = TM.getTargetTriple();
83 if (TT.isOSWindows())
84 addFunctionPass(CFGuardPass(TT.isX86_64() ? CFGuardPass::Mechanism::Dispatch
85 : CFGuardPass::Mechanism::Check),
86 PMW);
87
88 if (TM.Options.JMCInstrument) {
89 flushFPMsToMPM(PMW);
90 addModulePass(JMCInstrumenterPass(), PMW);
91 }
92}
93
94void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) const {
95 // Only add this pass for 32-bit x86 Windows.
96 const Triple &TT = TM.getTargetTriple();
97 if (TT.isOSWindows() && TT.isX86_32()) {
98 // TODO(boomanaiden154): Add X86WinEHStatePass here once it has been ported.
99 }
100}
101
102Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) const {
103 addMachineFunctionPass(X86ISelDAGToDAGPass(TM), PMW);
104
105 // For ELF, cleanup any local-dynamic TLS accesses
106 if (TM.getTargetTriple().isOSBinFormatELF() &&
107 getOptLevel() != CodeGenOptLevel::None) {
108 // TODO(boomanaiden154): Add CleanupLocalDynamicTLSPass here once it has
109 // been ported.
110 }
111
112 // TODO(boomanaiden154): Add X86GlobalPassRegPass here once it has been
113 // ported.
114 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
115 return Error::success();
116}
117
118void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW) const {
119 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
121 // TODO(boomanaiden154): Add the MachineCombinerPass here once it has been
122 // ported to the new pass manager.
123 }
124 addMachineFunctionPass(X86CmovConversionPass(), PMW);
125}
126
127void X86CodeGenPassBuilder::addMachineSSAOptimization(
128 PassManagerWrapper &PMW) const {
129 // TODO(boomanaiden154): Add X86DomainReassignmentPass here once it has been
130 // ported.
131 Base::addMachineSSAOptimization(PMW);
132}
133
134void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) const {
135 if (getOptLevel() != CodeGenOptLevel::None) {
136 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
137 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
138 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
139 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
140 }
141
142 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
143 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
144 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
145 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
146
147 if (getOptLevel() != CodeGenOptLevel::None)
148 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
149 else
150 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
151}
152
153void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) const {
154 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
155 addMachineFunctionPass(X86FPStackifierPass(), PMW);
156 // When -O0 is enabled, the Load Value Injection Hardening pass will fall back
157 // to using the Speculative Execution Side Effect Suppression pass for
158 // mitigation. This is to prevent slow downs due to
159 // analyses needed by the LVIHardening pass when compiling at -O0.
160 if (getOptLevel() != CodeGenOptLevel::None) {
161 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
162 }
163}
164
165void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW) const {
166 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
167 // TODO(boomanaiden154): Add KCFGPass here once it has been ported.
168}
169
170void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) const {
171 if (getOptLevel() != CodeGenOptLevel::None) {
172 // TODO(boomanaiden154): Add X86ExecutionDomainFixPass here once it has
173 // been ported.
174 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
175 }
176
177 // TODO(boomanaiden154): Add X86IndirectBranchTrackingPass here once it has
178 // been ported.
179 // TODO(boomanaiden154): Add X86IssueVZeroUpperPass here once it has been
180 // ported.
181
182 if (getOptLevel() != CodeGenOptLevel::None) {
183 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
184 // TODO(boomanaiden154): Add X86PadShortFunctionsPass here once it has been
185 // ported.
186 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
187 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
188 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
189 }
190 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
191 // TODO(boomanaiden154): Add InsertX86WaitPass here once it has been ported.
192}
193
194void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) const {
195 const Triple &TT = TM.getTargetTriple();
196 const MCAsmInfo *MAI = TM.getMCAsmInfo();
197
198 // The X86 Speculative Execution Pass must run after all control
199 // flow graph modifying passes. As a result it was listed to run right before
200 // the X86 Retpoline Thunks pass. The reason it must run after control flow
201 // graph modifications is that the model of LFENCE in LLVM has to be updated
202 // (FIXME: https://bugs.llvm.org/show_bug.cgi?id=45167). Currently the
203 // placement of this pass was hand checked to ensure that the subsequent
204 // passes don't move the code around the LFENCEs in a way that will hurt the
205 // correctness of this pass. This placement has been shown to work based on
206 // hand inspection of the codegen output.
207 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
208 PMW);
209 // TODO(boomanaiden154): Add X86IndirectThunksPass here
210 // once it has been ported.
211 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
212
213 // Insert extra int3 instructions after trailing call instructions to avoid
214 // issues in the unwinder.
215 if (TT.isOSWindows() && TT.isX86_64())
216 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
217
218 // Verify basic block incoming and outgoing cfa offset and register values and
219 // correct CFA calculation rule where needed by inserting appropriate CFI
220 // instructions.
221 if (!TT.isOSDarwin() &&
222 (!TT.isOSWindows() ||
223 MAI->getExceptionHandlingType() == ExceptionHandling::DwarfCFI)) {
224 // TODO(boomanaiden154): Add CFInstrInserterPass here when it has been
225 // ported.
226 }
227
228 if (TT.isOSWindows()) {
229 // Identify valid longjmp targets for Windows Control Flow Guard.
230 // TODO(boomanaiden154): Add CFGuardLongjmpPass here when it has been
231 // ported.
232 // Identify valid eh continuation targets for Windows EHCont Guard.
233 // TODO(boomanaiden154): Add EHContGuardTargetsPass when it has been
234 // ported.
235 }
236
237 // TODO(boomanaiden154): Add X86LoadValueInjectionRetHardeningPass here once
238 // it has been ported.
239
240 // Insert pseudo probe annotation for callsite profiling
241 // TODO(boomanaiden154): Add PseudoProberInserterPass here once it has been
242 // ported.
243
244 // KCFI indirect call checks are lowered to a bundle, and on Darwin platforms,
245 // also CALL_RVMARKER.
246 // TODO(boomanaiden154): Add UnpackMachineBundlesPass here once it has been
247 // ported.
248
249 // Analyzes and emits pseudos to support Win x64 Unwind V2. This pass must run
250 // after all real instructions have been added to the epilog.
251 if (TT.isOSWindows() && TT.isX86_64()) {
252 // TODO(boomanaiden154): Add X86WinEHUnwindV2Pass here once it has been
253 // ported.
254 }
255}
256
257void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW,
258 CreateMCStreamer) const {
259 // TODO: Add AsmPrinter.
260}
261
262} // namespace
263
265#define GET_PASS_REGISTRY "X86PassRegistry.def"
267}
268
271 CodeGenFileType FileType, const CGPassBuilderOption &Opt,
273 auto CGPB = X86CodeGenPassBuilder(*this, Opt, PIC);
274 return CGPB.buildPipeline(MPM, Out, DwoOut, FileType);
275}
Interfaces for producing common pass manager configurations.
This file contains the declaration of the InterleavedAccessPass class, its corresponding pass name is...
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
cl::opt< bool > X86EnableMachineCombinerPass
This class provides access to building LLVM's passes.
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
ExceptionHandling getExceptionHandlingType() const
Definition MCAsmInfo.h:633
This class provides access to building LLVM's passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
Error buildCodeGenPipeline(ModulePassManager &, raw_pwrite_stream &, raw_pwrite_stream *, CodeGenFileType, const CGPassBuilderOption &, PassInstrumentationCallbacks *) override
An abstract base class for streams implementations that also support a pwrite operation.
Interfaces for registering analysis passes, producing common pass manager configurations,...
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
Definition CodeGen.h:111
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.