LLVM 19.0.0git
X86TargetMachine.cpp
Go to the documentation of this file.
1//===-- X86TargetMachine.cpp - Define TargetMachine for the X86 -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the X86 specific subclass of TargetMachine.
10//
11//===----------------------------------------------------------------------===//
12
13#include "X86TargetMachine.h"
16#include "X86.h"
18#include "X86MacroFusion.h"
19#include "X86Subtarget.h"
20#include "X86TargetObjectFile.h"
22#include "llvm/ADT/STLExtras.h"
24#include "llvm/ADT/StringRef.h"
35#include "llvm/CodeGen/Passes.h"
38#include "llvm/IR/Attributes.h"
39#include "llvm/IR/DataLayout.h"
40#include "llvm/IR/Function.h"
41#include "llvm/MC/MCAsmInfo.h"
43#include "llvm/Pass.h"
51#include <memory>
52#include <optional>
53#include <string>
54
55using namespace llvm;
56
57static cl::opt<bool> EnableMachineCombinerPass("x86-machine-combiner",
58 cl::desc("Enable the machine combiner pass"),
59 cl::init(true), cl::Hidden);
60
61static cl::opt<bool>
62 EnableTileRAPass("x86-tile-ra",
63 cl::desc("Enable the tile register allocation pass"),
64 cl::init(true), cl::Hidden);
65
67 // Register the target.
70
107}
108
109static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
110 if (TT.isOSBinFormatMachO()) {
111 if (TT.getArch() == Triple::x86_64)
112 return std::make_unique<X86_64MachoTargetObjectFile>();
113 return std::make_unique<TargetLoweringObjectFileMachO>();
114 }
115
116 if (TT.isOSBinFormatCOFF())
117 return std::make_unique<TargetLoweringObjectFileCOFF>();
118
119 if (TT.getArch() == Triple::x86_64)
120 return std::make_unique<X86_64ELFTargetObjectFile>();
121 return std::make_unique<X86ELFTargetObjectFile>();
122}
123
124static std::string computeDataLayout(const Triple &TT) {
125 // X86 is little endian
126 std::string Ret = "e";
127
129 // X86 and x32 have 32 bit pointers.
130 if (!TT.isArch64Bit() || TT.isX32() || TT.isOSNaCl())
131 Ret += "-p:32:32";
132
133 // Address spaces for 32 bit signed, 32 bit unsigned, and 64 bit pointers.
134 Ret += "-p270:32:32-p271:32:32-p272:64:64";
135
136 // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32.
137 // 128 bit integers are not specified in the 32-bit ABIs but are used
138 // internally for lowering f128, so we match the alignment to that.
139 if (TT.isArch64Bit() || TT.isOSWindows() || TT.isOSNaCl())
140 Ret += "-i64:64-i128:128";
141 else if (TT.isOSIAMCU())
142 Ret += "-i64:32-f64:32";
143 else
144 Ret += "-i128:128-f64:32:64";
145
146 // Some ABIs align long double to 128 bits, others to 32.
147 if (TT.isOSNaCl() || TT.isOSIAMCU())
148 ; // No f80
149 else if (TT.isArch64Bit() || TT.isOSDarwin() || TT.isWindowsMSVCEnvironment())
150 Ret += "-f80:128";
151 else
152 Ret += "-f80:32";
153
154 if (TT.isOSIAMCU())
155 Ret += "-f128:32";
156
157 // The registers can hold 8, 16, 32 or, in x86-64, 64 bits.
158 if (TT.isArch64Bit())
159 Ret += "-n8:16:32:64";
160 else
161 Ret += "-n8:16:32";
162
163 // The stack is aligned to 32 bits on some ABIs and 128 bits on others.
164 if ((!TT.isArch64Bit() && TT.isOSWindows()) || TT.isOSIAMCU())
165 Ret += "-a:0:32-S32";
166 else
167 Ret += "-S128";
168
169 return Ret;
170}
171
172static Reloc::Model getEffectiveRelocModel(const Triple &TT, bool JIT,
173 std::optional<Reloc::Model> RM) {
174 bool is64Bit = TT.getArch() == Triple::x86_64;
175 if (!RM) {
176 // JIT codegen should use static relocations by default, since it's
177 // typically executed in process and not relocatable.
178 if (JIT)
179 return Reloc::Static;
180
181 // Darwin defaults to PIC in 64 bit mode and dynamic-no-pic in 32 bit mode.
182 // Win64 requires rip-rel addressing, thus we force it to PIC. Otherwise we
183 // use static relocation model by default.
184 if (TT.isOSDarwin()) {
185 if (is64Bit)
186 return Reloc::PIC_;
187 return Reloc::DynamicNoPIC;
188 }
189 if (TT.isOSWindows() && is64Bit)
190 return Reloc::PIC_;
191 return Reloc::Static;
192 }
193
194 // ELF and X86-64 don't have a distinct DynamicNoPIC model. DynamicNoPIC
195 // is defined as a model for code which may be used in static or dynamic
196 // executables but not necessarily a shared library. On X86-32 we just
197 // compile in -static mode, in x86-64 we use PIC.
198 if (*RM == Reloc::DynamicNoPIC) {
199 if (is64Bit)
200 return Reloc::PIC_;
201 if (!TT.isOSDarwin())
202 return Reloc::Static;
203 }
204
205 // If we are on Darwin, disallow static relocation model in X86-64 mode, since
206 // the Mach-O file format doesn't support it.
207 if (*RM == Reloc::Static && TT.isOSDarwin() && is64Bit)
208 return Reloc::PIC_;
209
210 return *RM;
211}
212
213static CodeModel::Model
214getEffectiveX86CodeModel(const Triple &TT, std::optional<CodeModel::Model> CM,
215 bool JIT) {
216 bool Is64Bit = TT.getArch() == Triple::x86_64;
217 if (CM) {
218 if (*CM == CodeModel::Tiny)
219 report_fatal_error("Target does not support the tiny CodeModel", false);
220 return *CM;
221 }
222 if (JIT)
223 return Is64Bit ? CodeModel::Large : CodeModel::Small;
224 return CodeModel::Small;
225}
226
227/// Create an X86 target.
228///
230 StringRef CPU, StringRef FS,
231 const TargetOptions &Options,
232 std::optional<Reloc::Model> RM,
233 std::optional<CodeModel::Model> CM,
234 CodeGenOptLevel OL, bool JIT)
236 T, computeDataLayout(TT), TT, CPU, FS, Options,
237 getEffectiveRelocModel(TT, JIT, RM),
238 getEffectiveX86CodeModel(TT, CM, JIT),
239 OL),
240 TLOF(createTLOF(getTargetTriple())), IsJIT(JIT) {
241 // On PS4/PS5, the "return address" of a 'noreturn' call must still be within
242 // the calling function, and TrapUnreachable is an easy way to get that.
243 if (TT.isPS() || TT.isOSBinFormatMachO()) {
244 this->Options.TrapUnreachable = true;
245 this->Options.NoTrapAfterNoreturn = TT.isOSBinFormatMachO();
246 }
247
248 setMachineOutliner(true);
249
250 // x86 supports the debug entry values.
252
253 initAsmInfo();
254}
255
257
258const X86Subtarget *
260 Attribute CPUAttr = F.getFnAttribute("target-cpu");
261 Attribute TuneAttr = F.getFnAttribute("tune-cpu");
262 Attribute FSAttr = F.getFnAttribute("target-features");
263
264 StringRef CPU =
265 CPUAttr.isValid() ? CPUAttr.getValueAsString() : (StringRef)TargetCPU;
266 // "x86-64" is a default target setting for many front ends. In these cases,
267 // they actually request for "generic" tuning unless the "tune-cpu" was
268 // specified.
269 StringRef TuneCPU = TuneAttr.isValid() ? TuneAttr.getValueAsString()
270 : CPU == "x86-64" ? "generic"
271 : (StringRef)CPU;
272 StringRef FS =
273 FSAttr.isValid() ? FSAttr.getValueAsString() : (StringRef)TargetFS;
274
276 // The additions here are ordered so that the definitely short strings are
277 // added first so we won't exceed the small size. We append the
278 // much longer FS string at the end so that we only heap allocate at most
279 // one time.
280
281 // Extract prefer-vector-width attribute.
282 unsigned PreferVectorWidthOverride = 0;
283 Attribute PreferVecWidthAttr = F.getFnAttribute("prefer-vector-width");
284 if (PreferVecWidthAttr.isValid()) {
285 StringRef Val = PreferVecWidthAttr.getValueAsString();
286 unsigned Width;
287 if (!Val.getAsInteger(0, Width)) {
288 Key += 'p';
289 Key += Val;
290 PreferVectorWidthOverride = Width;
291 }
292 }
293
294 // Extract min-legal-vector-width attribute.
295 unsigned RequiredVectorWidth = UINT32_MAX;
296 Attribute MinLegalVecWidthAttr = F.getFnAttribute("min-legal-vector-width");
297 if (MinLegalVecWidthAttr.isValid()) {
298 StringRef Val = MinLegalVecWidthAttr.getValueAsString();
299 unsigned Width;
300 if (!Val.getAsInteger(0, Width)) {
301 Key += 'm';
302 Key += Val;
303 RequiredVectorWidth = Width;
304 }
305 }
306
307 // Add CPU to the Key.
308 Key += CPU;
309
310 // Add tune CPU to the Key.
311 Key += TuneCPU;
312
313 // Keep track of the start of the feature portion of the string.
314 unsigned FSStart = Key.size();
315
316 // FIXME: This is related to the code below to reset the target options,
317 // we need to know whether or not the soft float flag is set on the
318 // function before we can generate a subtarget. We also need to use
319 // it as a key for the subtarget since that can be the only difference
320 // between two functions.
321 bool SoftFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
322 // If the soft float attribute is set on the function turn on the soft float
323 // subtarget feature.
324 if (SoftFloat)
325 Key += FS.empty() ? "+soft-float" : "+soft-float,";
326
327 Key += FS;
328
329 // We may have added +soft-float to the features so move the StringRef to
330 // point to the full string in the Key.
331 FS = Key.substr(FSStart);
332
333 auto &I = SubtargetMap[Key];
334 if (!I) {
335 // This needs to be done before we create a new subtarget since any
336 // creation will depend on the TM and the code generation flags on the
337 // function that reside in TargetOptions.
339 I = std::make_unique<X86Subtarget>(
340 TargetTriple, CPU, TuneCPU, FS, *this,
341 MaybeAlign(F.getParent()->getOverrideStackAlignment()),
342 PreferVectorWidthOverride, RequiredVectorWidth);
343 }
344 return I.get();
345}
346
348 unsigned DestAS) const {
349 assert(SrcAS != DestAS && "Expected different address spaces!");
350 if (getPointerSize(SrcAS) != getPointerSize(DestAS))
351 return false;
352 return SrcAS < 256 && DestAS < 256;
353}
354
355//===----------------------------------------------------------------------===//
356// X86 TTI query.
357//===----------------------------------------------------------------------===//
358
361 return TargetTransformInfo(X86TTIImpl(this, F));
362}
363
364//===----------------------------------------------------------------------===//
365// Pass Pipeline Configuration
366//===----------------------------------------------------------------------===//
367
368namespace {
369
370/// X86 Code Generator Pass Configuration Options.
371class X86PassConfig : public TargetPassConfig {
372public:
373 X86PassConfig(X86TargetMachine &TM, PassManagerBase &PM)
374 : TargetPassConfig(TM, PM) {}
375
376 X86TargetMachine &getX86TargetMachine() const {
377 return getTM<X86TargetMachine>();
378 }
379
381 createMachineScheduler(MachineSchedContext *C) const override {
384 return DAG;
385 }
386
388 createPostMachineScheduler(MachineSchedContext *C) const override {
391 return DAG;
392 }
393
394 void addIRPasses() override;
395 bool addInstSelector() override;
396 bool addIRTranslator() override;
397 bool addLegalizeMachineIR() override;
398 bool addRegBankSelect() override;
399 bool addGlobalInstructionSelect() override;
400 bool addILPOpts() override;
401 bool addPreISel() override;
402 void addMachineSSAOptimization() override;
403 void addPreRegAlloc() override;
404 bool addPostFastRegAllocRewrite() override;
405 void addPostRegAlloc() override;
406 void addPreEmitPass() override;
407 void addPreEmitPass2() override;
408 void addPreSched2() override;
409 bool addRegAssignAndRewriteOptimized() override;
410
411 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
412};
413
414class X86ExecutionDomainFix : public ExecutionDomainFix {
415public:
416 static char ID;
417 X86ExecutionDomainFix() : ExecutionDomainFix(ID, X86::VR128XRegClass) {}
418 StringRef getPassName() const override {
419 return "X86 Execution Dependency Fix";
420 }
421};
422char X86ExecutionDomainFix::ID;
423
424} // end anonymous namespace
425
426INITIALIZE_PASS_BEGIN(X86ExecutionDomainFix, "x86-execution-domain-fix",
427 "X86 Execution Domain Fix", false, false)
429INITIALIZE_PASS_END(X86ExecutionDomainFix, "x86-execution-domain-fix",
430 "X86 Execution Domain Fix", false, false)
431
433 return new X86PassConfig(*this, PM);
434}
435
437 BumpPtrAllocator &Allocator, const Function &F,
438 const TargetSubtargetInfo *STI) const {
439 return X86MachineFunctionInfo::create<X86MachineFunctionInfo>(Allocator, F,
440 STI);
441}
442
443void X86PassConfig::addIRPasses() {
445
446 // We add both pass anyway and when these two passes run, we skip the pass
447 // based on the option level and option attribute.
449 addPass(createX86LowerAMXTypePass());
450
452
453 if (TM->getOptLevel() != CodeGenOptLevel::None) {
456 }
457
458 // Add passes that handle indirect branch removal and insertion of a retpoline
459 // thunk. These will be a no-op unless a function subtarget has the retpoline
460 // feature enabled.
462
463 // Add Control Flow Guard checks.
464 const Triple &TT = TM->getTargetTriple();
465 if (TT.isOSWindows()) {
466 if (TT.getArch() == Triple::x86_64) {
467 addPass(createCFGuardDispatchPass());
468 } else {
469 addPass(createCFGuardCheckPass());
470 }
471 }
472
473 if (TM->Options.JMCInstrument)
474 addPass(createJMCInstrumenterPass());
475}
476
477bool X86PassConfig::addInstSelector() {
478 // Install an instruction selector.
479 addPass(createX86ISelDag(getX86TargetMachine(), getOptLevel()));
480
481 // For ELF, cleanup any local-dynamic TLS accesses.
482 if (TM->getTargetTriple().isOSBinFormatELF() &&
483 getOptLevel() != CodeGenOptLevel::None)
485
488 return false;
489}
490
491bool X86PassConfig::addIRTranslator() {
492 addPass(new IRTranslator(getOptLevel()));
493 return false;
494}
495
496bool X86PassConfig::addLegalizeMachineIR() {
497 addPass(new Legalizer());
498 return false;
499}
500
501bool X86PassConfig::addRegBankSelect() {
502 addPass(new RegBankSelect());
503 return false;
504}
505
506bool X86PassConfig::addGlobalInstructionSelect() {
507 addPass(new InstructionSelect(getOptLevel()));
508 return false;
509}
510
511bool X86PassConfig::addILPOpts() {
512 addPass(&EarlyIfConverterID);
514 addPass(&MachineCombinerID);
516 return true;
517}
518
519bool X86PassConfig::addPreISel() {
520 // Only add this pass for 32-bit x86 Windows.
521 const Triple &TT = TM->getTargetTriple();
522 if (TT.isOSWindows() && TT.getArch() == Triple::x86)
523 addPass(createX86WinEHStatePass());
524 return true;
525}
526
527void X86PassConfig::addPreRegAlloc() {
528 if (getOptLevel() != CodeGenOptLevel::None) {
529 addPass(&LiveRangeShrinkID);
530 addPass(createX86FixupSetCC());
531 addPass(createX86OptimizeLEAs());
534 }
535
539
540 if (getOptLevel() != CodeGenOptLevel::None)
542 else
544}
545
546void X86PassConfig::addMachineSSAOptimization() {
549}
550
551void X86PassConfig::addPostRegAlloc() {
554 // When -O0 is enabled, the Load Value Injection Hardening pass will fall back
555 // to using the Speculative Execution Side Effect Suppression pass for
556 // mitigation. This is to prevent slow downs due to
557 // analyses needed by the LVIHardening pass when compiling at -O0.
558 if (getOptLevel() != CodeGenOptLevel::None)
560}
561
562void X86PassConfig::addPreSched2() {
563 addPass(createX86ExpandPseudoPass());
564 addPass(createKCFIPass());
565}
566
567void X86PassConfig::addPreEmitPass() {
568 if (getOptLevel() != CodeGenOptLevel::None) {
569 addPass(new X86ExecutionDomainFix());
570 addPass(createBreakFalseDeps());
571 }
572
574
576
577 if (getOptLevel() != CodeGenOptLevel::None) {
578 addPass(createX86FixupBWInsts());
580 addPass(createX86FixupLEAs());
581 addPass(createX86FixupInstTuning());
583 }
584 addPass(createX86CompressEVEXPass());
588}
589
590void X86PassConfig::addPreEmitPass2() {
591 const Triple &TT = TM->getTargetTriple();
592 const MCAsmInfo *MAI = TM->getMCAsmInfo();
593
594 // The X86 Speculative Execution Pass must run after all control
595 // flow graph modifying passes. As a result it was listed to run right before
596 // the X86 Retpoline Thunks pass. The reason it must run after control flow
597 // graph modifications is that the model of LFENCE in LLVM has to be updated
598 // (FIXME: https://bugs.llvm.org/show_bug.cgi?id=45167). Currently the
599 // placement of this pass was hand checked to ensure that the subsequent
600 // passes don't move the code around the LFENCEs in a way that will hurt the
601 // correctness of this pass. This placement has been shown to work based on
602 // hand inspection of the codegen output.
605 addPass(createX86ReturnThunksPass());
606
607 // Insert extra int3 instructions after trailing call instructions to avoid
608 // issues in the unwinder.
609 if (TT.isOSWindows() && TT.getArch() == Triple::x86_64)
611
612 // Verify basic block incoming and outgoing cfa offset and register values and
613 // correct CFA calculation rule where needed by inserting appropriate CFI
614 // instructions.
615 if (!TT.isOSDarwin() &&
616 (!TT.isOSWindows() ||
618 addPass(createCFIInstrInserter());
619
620 if (TT.isOSWindows()) {
621 // Identify valid longjmp targets for Windows Control Flow Guard.
622 addPass(createCFGuardLongjmpPass());
623 // Identify valid eh continuation targets for Windows EHCont Guard.
625 }
627
628 // Insert pseudo probe annotation for callsite profiling
629 addPass(createPseudoProbeInserter());
630
631 // KCFI indirect call checks are lowered to a bundle, and on Darwin platforms,
632 // also CALL_RVMARKER.
633 addPass(createUnpackMachineBundles([&TT](const MachineFunction &MF) {
634 // Only run bundle expansion if the module uses kcfi, or there are relevant
635 // ObjC runtime functions present in the module.
636 const Function &F = MF.getFunction();
637 const Module *M = F.getParent();
638 return M->getModuleFlag("kcfi") ||
639 (TT.isOSDarwin() &&
640 (M->getFunction("objc_retainAutoreleasedReturnValue") ||
641 M->getFunction("objc_unsafeClaimAutoreleasedReturnValue")));
642 }));
643}
644
645bool X86PassConfig::addPostFastRegAllocRewrite() {
647 return true;
648}
649
650std::unique_ptr<CSEConfigBase> X86PassConfig::getCSEConfig() const {
651 return getStandardCSEConfigForOpt(TM->getOptLevel());
652}
653
655 const TargetRegisterClass &RC) {
656 return static_cast<const X86RegisterInfo &>(TRI).isTileRegisterClass(&RC);
657}
658
659bool X86PassConfig::addRegAssignAndRewriteOptimized() {
660 // Don't support tile RA when RA is specified by command line "-regalloc".
661 if (!isCustomizedRegAlloc() && EnableTileRAPass) {
662 // Allocate tile register first.
664 addPass(createX86TileConfigPass());
665 }
667}
Falkor HW Prefetch Fix
arm execution domain fix
This file contains the simple types necessary to represent the attributes associated with functions a...
Provides analysis for continuously CSEing during GISel passes.
This file describes how to lower LLVM calls to machine code calls.
#define LLVM_EXTERNAL_VISIBILITY
Definition: Compiler.h:135
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
This file declares the IRTranslator pass.
static LVOptions Options
Definition: LVOptions.cpp:25
static std::string computeDataLayout()
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
unsigned const TargetRegisterInfo * TRI
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
static cl::opt< bool > EnableMachineCombinerPass("ppc-machine-combiner", cl::desc("Enable the machine combiner pass"), cl::init(true), cl::Hidden)
const char LLVMTargetMachineRef TM
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:55
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:59
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:52
Basic Register Allocator
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallString class.
speculative execution
Target-Independent Code Generator Pass Configuration Options pass.
This pass exposes codegen information to IR-level passes.
static std::unique_ptr< TargetLoweringObjectFile > createTLOF()
static bool is64Bit(const char *name)
static cl::opt< bool > EnableTileRAPass("x86-tile-ra", cl::desc("Enable the tile register allocation pass"), cl::init(true), cl::Hidden)
static cl::opt< bool > EnableMachineCombinerPass("x86-machine-combiner", cl::desc("Enable the machine combiner pass"), cl::init(true), cl::Hidden)
static CodeModel::Model getEffectiveX86CodeModel(const Triple &TT, std::optional< CodeModel::Model > CM, bool JIT)
static bool onlyAllocateTileRegisters(const TargetRegisterInfo &TRI, const TargetRegisterClass &RC)
LLVM_EXTERNAL_VISIBILITY void LLVMInitializeX86Target()
static Reloc::Model getEffectiveRelocModel(const Triple &TT, bool JIT, std::optional< Reloc::Model > RM)
This file a TargetTransformInfo::Concept conforming object specific to the X86 target machine.
StringRef getValueAsString() const
Return the attribute's value as a string.
Definition: Attributes.cpp:349
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition: Attributes.h:193
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition: Allocator.h:66
static const char * getManglingComponent(const Triple &T)
Definition: DataLayout.cpp:169
This pass is responsible for selecting generic machine instructions to target-specific instructions.
This class describes a target machine that is implemented with the LLVM target-independent code gener...
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
ExceptionHandling getExceptionHandlingType() const
Definition: MCAsmInfo.h:780
Function & getFunction()
Return the LLVM function that this machine code represents.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
Definition: PassRegistry.h:37
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
This class provides the reaching def analysis.
This pass implements the reg bank selector pass used in the GlobalISel pipeline.
Definition: RegBankSelect.h:91
A ScheduleDAG for scheduling lists of MachineInstr.
ScheduleDAGMILive is an implementation of ScheduleDAGInstrs that schedules machine instructions while...
ScheduleDAGMI is an implementation of ScheduleDAGInstrs that simply schedules machine instructions ac...
void addMutation(std::unique_ptr< ScheduleDAGMutation > Mutation)
Add a postprocessing step to the DAG builder.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition: StringRef.h:456
void setSupportsDebugEntryValues(bool Enable)
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
Definition: TargetMachine.h:95
void setMachineOutliner(bool Enable)
unsigned getPointerSize(unsigned AS) const
Get the pointer size for this target.
std::string TargetFS
Definition: TargetMachine.h:97
std::string TargetCPU
Definition: TargetMachine.h:96
std::unique_ptr< const MCSubtargetInfo > STI
void resetTargetOptions(const Function &F) const
Reset the target options based on the function's attributes.
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for 'unreachable' IR instructions behind noreturn calls,...
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
Target-Independent Code Generator Pass Configuration Options.
virtual void addIRPasses()
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
virtual void addMachineSSAOptimization()
addMachineSSAOptimization - Add standard passes that optimize machine instructions in SSA form.
virtual bool addRegAssignAndRewriteOptimized()
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override
Returns true if a cast between SrcAS and DestAS is a noop.
MachineFunctionInfo * createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, const TargetSubtargetInfo *STI) const override
Create the target's instance of MachineFunctionInfo.
const X86Subtarget * getSubtargetImpl() const =delete
~X86TargetMachine() override
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Get a TargetTransformInfo implementation for the target.
X86TargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
Create an X86 target.
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ DynamicNoPIC
Definition: CodeGen.h:25
@ X86
Windows x64, Windows Itanium (IA-64)
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:450
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
FunctionPass * createX86FloatingPointStackifierPass()
This function returns a pass which converts floating-point register references and pseudo instruction...
FunctionPass * createIndirectBrExpandPass()
FunctionPass * createX86WinEHStatePass()
Return an IR pass that inserts EH registration stack objects and explicit EH state updates.
void initializeX86TileConfigPass(PassRegistry &)
void initializeX86PartialReductionPass(PassRegistry &)
void initializeX86CallFrameOptimizationPass(PassRegistry &)
void initializeFixupBWInstPassPass(PassRegistry &)
void initializeX86LoadValueInjectionRetHardeningPassPass(PassRegistry &)
FunctionPass * createX86LoadValueInjectionLoadHardeningPass()
FunctionPass * createX86IssueVZeroUpperPass()
This pass inserts AVX vzeroupper instructions before each call to avoid transition penalty between fu...
FunctionPass * createGreedyRegisterAllocator()
Greedy register allocation pass - This pass implements a global register allocator for optimized buil...
void initializeX86ArgumentStackSlotPassPass(PassRegistry &)
void initializeX86SpeculativeLoadHardeningPassPass(PassRegistry &)
void initializeWinEHStatePassPass(PassRegistry &)
FunctionPass * createX86InsertPrefetchPass()
This pass applies profiling information to insert cache prefetches.
@ DwarfCFI
DWARF-like instruction based exceptions.
FunctionPass * createPseudoProbeInserter()
This pass inserts pseudo probe annotation for callsite profiling.
FunctionPass * createX86LowerAMXIntrinsicsPass()
The pass transforms amx intrinsics to scalar operation if the function has optnone attribute or it is...
Target & getTheX86_32Target()
FunctionPass * createX86GlobalBaseRegPass()
This pass initializes a global base register for PIC on x86-32.
FunctionPass * createX86FixupBWInsts()
Return a Machine IR pass that selectively replaces certain byte and word instructions by equivalent 3...
void initializeX86LowerAMXIntrinsicsLegacyPassPass(PassRegistry &)
FunctionPass * createX86DomainReassignmentPass()
Return a Machine IR pass that reassigns instruction chains from one domain to another,...
FunctionPass * createX86LoadValueInjectionRetHardeningPass()
FunctionPass * createX86SpeculativeExecutionSideEffectSuppression()
FunctionPass * createCleanupLocalDynamicTLSPass()
This pass combines multiple accesses to local-dynamic TLS variables so that the TLS base address for ...
FunctionPass * createX86FlagsCopyLoweringPass()
Return a pass that lowers EFLAGS copy pseudo instructions.
void initializeX86FastTileConfigPass(PassRegistry &)
FunctionPass * createCFGuardDispatchPass()
Insert Control FLow Guard dispatches on indirect function calls.
Definition: CFGuard.cpp:317
std::unique_ptr< CSEConfigBase > getStandardCSEConfigForOpt(CodeGenOptLevel Level)
Definition: CSEInfo.cpp:79
FunctionPass * createX86CompressEVEXPass()
This pass compress instructions from EVEX space to legacy/VEX/EVEX space when possible in order to re...
void initializeX86ExpandPseudoPass(PassRegistry &)
void initializeX86AvoidTrailingCallPassPass(PassRegistry &)
ScheduleDAGMILive * createGenericSchedLive(MachineSchedContext *C)
Create the standard converging machine scheduler.
FunctionPass * createX86ArgumentStackSlotPass()
void initializeX86PreTileConfigPass(PassRegistry &)
FunctionPass * createX86CmovConverterPass()
This pass converts X86 cmov instructions into branch when profitable.
FunctionPass * createX86TileConfigPass()
Return a pass that config the tile registers.
FunctionPass * createX86PadShortFunctions()
Return a pass that pads short functions with NOOPs.
void initializeX86DomainReassignmentPass(PassRegistry &)
void initializeX86LoadValueInjectionLoadHardeningPassPass(PassRegistry &)
FunctionPass * createX86FastPreTileConfigPass()
Return a pass that preconfig the tile registers before fast reg allocation.
ModulePass * createJMCInstrumenterPass()
JMC instrument pass.
std::unique_ptr< ScheduleDAGMutation > createX86MacroFusionDAGMutation()
Note that you have to add: DAG.addMutation(createX86MacroFusionDAGMutation()); to X86PassConfig::crea...
void initializeX86AvoidSFBPassPass(PassRegistry &)
FunctionPass * createX86LowerTileCopyPass()
Return a pass that lower the tile copy instruction.
char & MachineCombinerID
This pass performs instruction combining using trace metrics to estimate critical-path and resource d...
void initializeX86FastPreTileConfigPass(PassRegistry &)
FunctionPass * createX86SpeculativeLoadHardeningPass()
FunctionPass * createX86FixupSetCC()
Return a pass that transforms setcc + movzx pairs into xor + setcc.
FunctionPass * createX86IndirectBranchTrackingPass()
This pass inserts ENDBR instructions before indirect jump/call destinations as part of CET IBT mechan...
FunctionPass * createX86InsertX87waitPass()
This pass insert wait instruction after X87 instructions which could raise fp exceptions when strict-...
void initializeX86FixupSetCCPassPass(PassRegistry &)
FunctionPass * createKCFIPass()
Lowers KCFI operand bundles for indirect calls.
Definition: KCFI.cpp:61
char & LiveRangeShrinkID
LiveRangeShrink pass.
FunctionPass * createX86ExpandPseudoPass()
Return a Machine IR pass that expands X86-specific pseudo instructions into a sequence of actual inst...
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:156
FunctionPass * createX86FixupInstTuning()
Return a pass that replaces equivalent slower instructions with faster ones.
FunctionPass * createX86ISelDag(X86TargetMachine &TM, CodeGenOptLevel OptLevel)
This pass converts a legalized DAG into a X86-specific DAG, ready for instruction scheduling.
void initializeX86LowerTileCopyPass(PassRegistry &)
void initializeX86OptimizeLEAPassPass(PassRegistry &)
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:54
FunctionPass * createX86FastTileConfigPass()
Return a pass that config the tile registers after fast reg allocation.
FunctionPass * createCFGuardLongjmpPass()
Creates CFGuard longjmp target identification pass.
FunctionPass * createX86PartialReductionPass()
This pass optimizes arithmetic based on knowledge that is only used by a reduction sequence and is th...
char & EarlyIfConverterID
EarlyIfConverter - This pass performs if-conversion on SSA form by inserting cmov instructions.
FunctionPass * createX86FixupLEAs()
Return a pass that selectively replaces certain instructions (like add, sub, inc, dec,...
FunctionPass * createInterleavedAccessPass()
InterleavedAccess Pass - This pass identifies and matches interleaved memory accesses to target speci...
void initializeGlobalISel(PassRegistry &)
Initialize all passes linked into the GlobalISel library.
Definition: GlobalISel.cpp:17
ScheduleDAGMI * createGenericSchedPostRA(MachineSchedContext *C)
Create a generic scheduler with no vreg liveness or DAG mutation passes.
void initializeX86FixupInstTuningPassPass(PassRegistry &)
void initializeX86LowerAMXTypeLegacyPassPass(PassRegistry &)
void initializeX86CmovConverterPassPass(PassRegistry &)
FunctionPass * createBreakFalseDeps()
Creates Break False Dependencies pass.
FunctionPass * createX86CallFrameOptimization()
Return a pass that optimizes the code-size of x86 call sequences.
void initializeX86FlagsCopyLoweringPassPass(PassRegistry &)
void initializeFPSPass(PassRegistry &)
FunctionPass * createUnpackMachineBundles(std::function< bool(const MachineFunction &)> Ftor)
FunctionPass * createX86AvoidTrailingCallPass()
Return a pass that inserts int3 at the end of the function if it ends with a CALL instruction.
FunctionPass * createX86DynAllocaExpander()
Return a pass that expands DynAlloca pseudo-instructions.
void initializeKCFIPass(PassRegistry &)
void initializeX86SpeculativeExecutionSideEffectSuppressionPass(PassRegistry &)
void initializeCompressEVEXPassPass(PassRegistry &)
FunctionPass * createCFGuardCheckPass()
Insert Control FLow Guard checks on indirect function calls.
Definition: CFGuard.cpp:313
FunctionPass * createX86OptimizeLEAs()
Return a pass that removes redundant LEA instructions and redundant address recalculations.
void initializeX86FixupVectorConstantsPassPass(PassRegistry &)
FunctionPass * createX86LowerAMXTypePass()
The pass transforms load/store <256 x i32> to AMX load/store intrinsics or split the data to two <128...
FunctionPass * createCFIInstrInserter()
Creates CFI Instruction Inserter pass.
FunctionPass * createX86IndirectThunksPass()
This pass creates the thunks for the retpoline feature.
void initializeX86DAGToDAGISelPass(PassRegistry &)
FunctionPass * createAtomicExpandLegacyPass()
AtomicExpandPass - At IR level this pass replace atomic instructions with __atomic_* library calls,...
FunctionPass * createEHContGuardCatchretPass()
Creates EHContGuard catchret target identification pass.
Target & getTheX86_64Target()
void initializePseudoProbeInserterPass(PassRegistry &)
FunctionPass * createX86FixupVectorConstants()
Return a pass that reduces the size of vector constant pool loads.
void initializeX86ExecutionDomainFixPass(PassRegistry &)
FunctionPass * createX86PreTileConfigPass()
Return a pass that insert pseudo tile config instruction.
FunctionPass * createX86ReturnThunksPass()
This pass replaces ret instructions with jmp's to __x86_return thunk.
FunctionPass * createX86AvoidStoreForwardingBlocks()
Return a pass that avoids creating store forward block issues in the hardware.
void initializeX86ReturnThunksPass(PassRegistry &)
FunctionPass * createX86DiscriminateMemOpsPass()
This pass ensures instructions featuring a memory operand have distinctive <LineNumber,...
void initializeFixupLEAPassPass(PassRegistry &)
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition: Alignment.h:117
RegisterTargetMachine - Helper template for registering a target machine implementation,...