LLVM 22.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-c/Visibility.h"
24#include "llvm/ADT/StringRef.h"
36#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
111}
112
113static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
114 if (TT.isOSBinFormatMachO()) {
115 if (TT.getArch() == Triple::x86_64)
116 return std::make_unique<X86_64MachoTargetObjectFile>();
117 return std::make_unique<TargetLoweringObjectFileMachO>();
118 }
119
120 if (TT.isOSBinFormatCOFF())
121 return std::make_unique<TargetLoweringObjectFileCOFF>();
122
123 if (TT.getArch() == Triple::x86_64)
124 return std::make_unique<X86_64ELFTargetObjectFile>();
125 return std::make_unique<X86ELFTargetObjectFile>();
126}
127
128static std::string computeDataLayout(const Triple &TT) {
129 // X86 is little endian
130 std::string Ret = "e";
131
133 // X86 and x32 have 32 bit pointers.
134 if (!TT.isArch64Bit() || TT.isX32())
135 Ret += "-p:32:32";
136
137 // Address spaces for 32 bit signed, 32 bit unsigned, and 64 bit pointers.
138 Ret += "-p270:32:32-p271:32:32-p272:64:64";
139
140 // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32.
141 // 128 bit integers are not specified in the 32-bit ABIs but are used
142 // internally for lowering f128, so we match the alignment to that.
143 if (TT.isArch64Bit() || TT.isOSWindows())
144 Ret += "-i64:64-i128:128";
145 else if (TT.isOSIAMCU())
146 Ret += "-i64:32-f64:32";
147 else
148 Ret += "-i128:128-f64:32:64";
149
150 // Some ABIs align long double to 128 bits, others to 32.
151 if (TT.isOSIAMCU())
152 ; // No f80
153 else if (TT.isArch64Bit() || TT.isOSDarwin() || TT.isWindowsMSVCEnvironment())
154 Ret += "-f80:128";
155 else
156 Ret += "-f80:32";
157
158 if (TT.isOSIAMCU())
159 Ret += "-f128:32";
160
161 // The registers can hold 8, 16, 32 or, in x86-64, 64 bits.
162 if (TT.isArch64Bit())
163 Ret += "-n8:16:32:64";
164 else
165 Ret += "-n8:16:32";
166
167 // The stack is aligned to 32 bits on some ABIs and 128 bits on others.
168 if ((!TT.isArch64Bit() && TT.isOSWindows()) || TT.isOSIAMCU())
169 Ret += "-a:0:32-S32";
170 else
171 Ret += "-S128";
172
173 return Ret;
174}
175
176static Reloc::Model getEffectiveRelocModel(const Triple &TT, bool JIT,
177 std::optional<Reloc::Model> RM) {
178 bool is64Bit = TT.getArch() == Triple::x86_64;
179 if (!RM) {
180 // JIT codegen should use static relocations by default, since it's
181 // typically executed in process and not relocatable.
182 if (JIT)
183 return Reloc::Static;
184
185 // Darwin defaults to PIC in 64 bit mode and dynamic-no-pic in 32 bit mode.
186 // Win64 requires rip-rel addressing, thus we force it to PIC. Otherwise we
187 // use static relocation model by default.
188 if (TT.isOSDarwin()) {
189 if (is64Bit)
190 return Reloc::PIC_;
191 return Reloc::DynamicNoPIC;
192 }
193 if (TT.isOSWindows() && is64Bit)
194 return Reloc::PIC_;
195 return Reloc::Static;
196 }
197
198 // ELF and X86-64 don't have a distinct DynamicNoPIC model. DynamicNoPIC
199 // is defined as a model for code which may be used in static or dynamic
200 // executables but not necessarily a shared library. On X86-32 we just
201 // compile in -static mode, in x86-64 we use PIC.
202 if (*RM == Reloc::DynamicNoPIC) {
203 if (is64Bit)
204 return Reloc::PIC_;
205 if (!TT.isOSDarwin())
206 return Reloc::Static;
207 }
208
209 // If we are on Darwin, disallow static relocation model in X86-64 mode, since
210 // the Mach-O file format doesn't support it.
211 if (*RM == Reloc::Static && TT.isOSDarwin() && is64Bit)
212 return Reloc::PIC_;
213
214 return *RM;
215}
216
217static CodeModel::Model
218getEffectiveX86CodeModel(const Triple &TT, std::optional<CodeModel::Model> CM,
219 bool JIT) {
220 bool Is64Bit = TT.getArch() == Triple::x86_64;
221 if (CM) {
222 if (*CM == CodeModel::Tiny)
223 reportFatalUsageError("target does not support the tiny CodeModel");
224 return *CM;
225 }
226 if (JIT)
227 return Is64Bit ? CodeModel::Large : CodeModel::Small;
228 return CodeModel::Small;
229}
230
231/// Create an X86 target.
232///
234 StringRef CPU, StringRef FS,
235 const TargetOptions &Options,
236 std::optional<Reloc::Model> RM,
237 std::optional<CodeModel::Model> CM,
238 CodeGenOptLevel OL, bool JIT)
240 getEffectiveRelocModel(TT, JIT, RM),
241 getEffectiveX86CodeModel(TT, CM, JIT), OL),
242 TLOF(createTLOF(getTargetTriple())), IsJIT(JIT) {
243 // On PS4/PS5, the "return address" of a 'noreturn' call must still be within
244 // the calling function. Note that this also includes __stack_chk_fail,
245 // so there was some target-specific logic in the instruction selectors
246 // to handle that. That code has since been generalized, so the only thing
247 // needed is to set TrapUnreachable here.
248 if (TT.isPS() || TT.isOSBinFormatMachO()) {
249 this->Options.TrapUnreachable = true;
250 this->Options.NoTrapAfterNoreturn = TT.isOSBinFormatMachO();
251 }
252
253 setMachineOutliner(true);
254
255 // x86 supports the debug entry values.
257
258 initAsmInfo();
259}
260
262
263const X86Subtarget *
265 Attribute CPUAttr = F.getFnAttribute("target-cpu");
266 Attribute TuneAttr = F.getFnAttribute("tune-cpu");
267 Attribute FSAttr = F.getFnAttribute("target-features");
268
269 StringRef CPU =
270 CPUAttr.isValid() ? CPUAttr.getValueAsString() : (StringRef)TargetCPU;
271 // "x86-64" is a default target setting for many front ends. In these cases,
272 // they actually request for "generic" tuning unless the "tune-cpu" was
273 // specified.
274 StringRef TuneCPU = TuneAttr.isValid() ? TuneAttr.getValueAsString()
275 : CPU == "x86-64" ? "generic"
276 : (StringRef)CPU;
277 StringRef FS =
278 FSAttr.isValid() ? FSAttr.getValueAsString() : (StringRef)TargetFS;
279
281 // The additions here are ordered so that the definitely short strings are
282 // added first so we won't exceed the small size. We append the
283 // much longer FS string at the end so that we only heap allocate at most
284 // one time.
285
286 // Extract prefer-vector-width attribute.
287 unsigned PreferVectorWidthOverride = 0;
288 Attribute PreferVecWidthAttr = F.getFnAttribute("prefer-vector-width");
289 if (PreferVecWidthAttr.isValid()) {
290 StringRef Val = PreferVecWidthAttr.getValueAsString();
291 unsigned Width;
292 if (!Val.getAsInteger(0, Width)) {
293 Key += 'p';
294 Key += Val;
295 PreferVectorWidthOverride = Width;
296 }
297 }
298
299 // Extract min-legal-vector-width attribute.
300 unsigned RequiredVectorWidth = UINT32_MAX;
301 Attribute MinLegalVecWidthAttr = F.getFnAttribute("min-legal-vector-width");
302 if (MinLegalVecWidthAttr.isValid()) {
303 StringRef Val = MinLegalVecWidthAttr.getValueAsString();
304 unsigned Width;
305 if (!Val.getAsInteger(0, Width)) {
306 Key += 'm';
307 Key += Val;
308 RequiredVectorWidth = Width;
309 }
310 }
311
312 // Add CPU to the Key.
313 Key += CPU;
314
315 // Add tune CPU to the Key.
316 Key += TuneCPU;
317
318 // Keep track of the start of the feature portion of the string.
319 unsigned FSStart = Key.size();
320
321 // FIXME: This is related to the code below to reset the target options,
322 // we need to know whether or not the soft float flag is set on the
323 // function before we can generate a subtarget. We also need to use
324 // it as a key for the subtarget since that can be the only difference
325 // between two functions.
326 bool SoftFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
327 // If the soft float attribute is set on the function turn on the soft float
328 // subtarget feature.
329 if (SoftFloat)
330 Key += FS.empty() ? "+soft-float" : "+soft-float,";
331
332 Key += FS;
333
334 // We may have added +soft-float to the features so move the StringRef to
335 // point to the full string in the Key.
336 FS = Key.substr(FSStart);
337
338 auto &I = SubtargetMap[Key];
339 if (!I) {
340 // This needs to be done before we create a new subtarget since any
341 // creation will depend on the TM and the code generation flags on the
342 // function that reside in TargetOptions.
344 I = std::make_unique<X86Subtarget>(
345 TargetTriple, CPU, TuneCPU, FS, *this,
346 MaybeAlign(F.getParent()->getOverrideStackAlignment()),
347 PreferVectorWidthOverride, RequiredVectorWidth);
348 }
349 return I.get();
350}
351
353 return new yaml::X86MachineFunctionInfo();
354}
355
358 const auto *MFI = MF.getInfo<X86MachineFunctionInfo>();
359 return new yaml::X86MachineFunctionInfo(*MFI);
360}
361
364 SMDiagnostic &Error, SMRange &SourceRange) const {
365 const auto &YamlMFI = static_cast<const yaml::X86MachineFunctionInfo &>(MFI);
366 PFS.MF.getInfo<X86MachineFunctionInfo>()->initializeBaseYamlFields(YamlMFI);
367 return false;
368}
369
371 unsigned DestAS) const {
372 assert(SrcAS != DestAS && "Expected different address spaces!");
373 if (getPointerSize(SrcAS) != getPointerSize(DestAS))
374 return false;
375 return SrcAS < 256 && DestAS < 256;
376}
377
378void X86TargetMachine::reset() { SubtargetMap.clear(); }
379
384 return DAG;
385}
386
391 return DAG;
392}
393
394//===----------------------------------------------------------------------===//
395// X86 TTI query.
396//===----------------------------------------------------------------------===//
397
400 return TargetTransformInfo(std::make_unique<X86TTIImpl>(this, F));
401}
402
403//===----------------------------------------------------------------------===//
404// Pass Pipeline Configuration
405//===----------------------------------------------------------------------===//
406
407namespace {
408
409/// X86 Code Generator Pass Configuration Options.
410class X86PassConfig : public TargetPassConfig {
411public:
412 X86PassConfig(X86TargetMachine &TM, PassManagerBase &PM)
413 : TargetPassConfig(TM, PM) {}
414
415 X86TargetMachine &getX86TargetMachine() const {
416 return getTM<X86TargetMachine>();
417 }
418
419 void addIRPasses() override;
420 bool addInstSelector() override;
421 bool addIRTranslator() override;
422 bool addLegalizeMachineIR() override;
423 bool addRegBankSelect() override;
424 bool addGlobalInstructionSelect() override;
425 bool addILPOpts() override;
426 bool addPreISel() override;
427 void addMachineSSAOptimization() override;
428 void addPreRegAlloc() override;
429 bool addPostFastRegAllocRewrite() override;
430 void addPostRegAlloc() override;
431 void addPreEmitPass() override;
432 void addPreEmitPass2() override;
433 void addPreSched2() override;
434 bool addRegAssignAndRewriteOptimized() override;
435
436 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
437};
438
439class X86ExecutionDomainFix : public ExecutionDomainFix {
440public:
441 static char ID;
442 X86ExecutionDomainFix() : ExecutionDomainFix(ID, X86::VR128XRegClass) {}
443 StringRef getPassName() const override {
444 return "X86 Execution Dependency Fix";
445 }
446};
447char X86ExecutionDomainFix::ID;
448
449} // end anonymous namespace
450
451INITIALIZE_PASS_BEGIN(X86ExecutionDomainFix, "x86-execution-domain-fix",
452 "X86 Execution Domain Fix", false, false)
454INITIALIZE_PASS_END(X86ExecutionDomainFix, "x86-execution-domain-fix",
455 "X86 Execution Domain Fix", false, false)
456
458 return new X86PassConfig(*this, PM);
459}
460
462 BumpPtrAllocator &Allocator, const Function &F,
463 const TargetSubtargetInfo *STI) const {
464 return X86MachineFunctionInfo::create<X86MachineFunctionInfo>(Allocator, F,
465 STI);
466}
467
468void X86PassConfig::addIRPasses() {
470
471 // We add both pass anyway and when these two passes run, we skip the pass
472 // based on the option level and option attribute.
474 addPass(createX86LowerAMXTypePass());
475
477
478 if (TM->getOptLevel() != CodeGenOptLevel::None) {
481 }
482
483 // Add passes that handle indirect branch removal and insertion of a retpoline
484 // thunk. These will be a no-op unless a function subtarget has the retpoline
485 // feature enabled.
487
488 // Add Control Flow Guard checks.
489 const Triple &TT = TM->getTargetTriple();
490 if (TT.isOSWindows()) {
491 if (TT.getArch() == Triple::x86_64) {
492 addPass(createCFGuardDispatchPass());
493 } else {
494 addPass(createCFGuardCheckPass());
495 }
496 }
497
498 if (TM->Options.JMCInstrument)
499 addPass(createJMCInstrumenterPass());
500}
501
502bool X86PassConfig::addInstSelector() {
503 // Install an instruction selector.
504 addPass(createX86ISelDag(getX86TargetMachine(), getOptLevel()));
505
506 // For ELF, cleanup any local-dynamic TLS accesses.
507 if (TM->getTargetTriple().isOSBinFormatELF() &&
508 getOptLevel() != CodeGenOptLevel::None)
510
513 return false;
514}
515
516bool X86PassConfig::addIRTranslator() {
517 addPass(new IRTranslator(getOptLevel()));
518 return false;
519}
520
521bool X86PassConfig::addLegalizeMachineIR() {
522 addPass(new Legalizer());
523 return false;
524}
525
526bool X86PassConfig::addRegBankSelect() {
527 addPass(new RegBankSelect());
528 return false;
529}
530
531bool X86PassConfig::addGlobalInstructionSelect() {
532 addPass(new InstructionSelect(getOptLevel()));
533 // Add GlobalBaseReg in case there is no SelectionDAG passes afterwards
534 if (isGlobalISelAbortEnabled())
536 return false;
537}
538
539bool X86PassConfig::addILPOpts() {
540 addPass(&EarlyIfConverterLegacyID);
542 addPass(&MachineCombinerID);
544 return true;
545}
546
547bool X86PassConfig::addPreISel() {
548 // Only add this pass for 32-bit x86 Windows.
549 const Triple &TT = TM->getTargetTriple();
550 if (TT.isOSWindows() && TT.getArch() == Triple::x86)
551 addPass(createX86WinEHStatePass());
552 return true;
553}
554
555void X86PassConfig::addPreRegAlloc() {
556 if (getOptLevel() != CodeGenOptLevel::None) {
557 addPass(&LiveRangeShrinkID);
558 addPass(createX86FixupSetCC());
559 addPass(createX86OptimizeLEAs());
562 }
563
565
569
570 if (getOptLevel() != CodeGenOptLevel::None)
572 else
574}
575
576void X86PassConfig::addMachineSSAOptimization() {
579}
580
581void X86PassConfig::addPostRegAlloc() {
584 // When -O0 is enabled, the Load Value Injection Hardening pass will fall back
585 // to using the Speculative Execution Side Effect Suppression pass for
586 // mitigation. This is to prevent slow downs due to
587 // analyses needed by the LVIHardening pass when compiling at -O0.
588 if (getOptLevel() != CodeGenOptLevel::None)
590}
591
592void X86PassConfig::addPreSched2() {
593 addPass(createX86ExpandPseudoPass());
594 addPass(createKCFIPass());
595}
596
597void X86PassConfig::addPreEmitPass() {
598 if (getOptLevel() != CodeGenOptLevel::None) {
599 addPass(new X86ExecutionDomainFix());
600 addPass(createBreakFalseDeps());
601 }
602
604
606
607 if (getOptLevel() != CodeGenOptLevel::None) {
608 addPass(createX86FixupBWInsts());
610 addPass(createX86FixupLEAs());
611 addPass(createX86FixupInstTuning());
613 }
614 addPass(createX86CompressEVEXPass());
618}
619
620void X86PassConfig::addPreEmitPass2() {
621 const Triple &TT = TM->getTargetTriple();
622 const MCAsmInfo *MAI = TM->getMCAsmInfo();
623
624 // The X86 Speculative Execution Pass must run after all control
625 // flow graph modifying passes. As a result it was listed to run right before
626 // the X86 Retpoline Thunks pass. The reason it must run after control flow
627 // graph modifications is that the model of LFENCE in LLVM has to be updated
628 // (FIXME: https://bugs.llvm.org/show_bug.cgi?id=45167). Currently the
629 // placement of this pass was hand checked to ensure that the subsequent
630 // passes don't move the code around the LFENCEs in a way that will hurt the
631 // correctness of this pass. This placement has been shown to work based on
632 // hand inspection of the codegen output.
635 addPass(createX86ReturnThunksPass());
636
637 // Insert extra int3 instructions after trailing call instructions to avoid
638 // issues in the unwinder.
639 if (TT.isOSWindows() && TT.getArch() == Triple::x86_64)
641
642 // Verify basic block incoming and outgoing cfa offset and register values and
643 // correct CFA calculation rule where needed by inserting appropriate CFI
644 // instructions.
645 if (!TT.isOSDarwin() &&
646 (!TT.isOSWindows() ||
648 addPass(createCFIInstrInserter());
649
650 if (TT.isOSWindows()) {
651 // Identify valid longjmp targets for Windows Control Flow Guard.
652 addPass(createCFGuardLongjmpPass());
653 // Identify valid eh continuation targets for Windows EHCont Guard.
655 }
657
658 // Insert pseudo probe annotation for callsite profiling
659 addPass(createPseudoProbeInserter());
660
661 // KCFI indirect call checks are lowered to a bundle, and on Darwin platforms,
662 // also CALL_RVMARKER.
663 addPass(createUnpackMachineBundles([&TT](const MachineFunction &MF) {
664 // Only run bundle expansion if the module uses kcfi, or there are relevant
665 // ObjC runtime functions present in the module.
666 const Function &F = MF.getFunction();
667 const Module *M = F.getParent();
668 return M->getModuleFlag("kcfi") ||
669 (TT.isOSDarwin() &&
670 (M->getFunction("objc_retainAutoreleasedReturnValue") ||
671 M->getFunction("objc_unsafeClaimAutoreleasedReturnValue")));
672 }));
673
674 // Analyzes and emits pseudos to support Win x64 Unwind V2. This pass must run
675 // after all real instructions have been added to the epilog.
676 if (TT.isOSWindows() && (TT.getArch() == Triple::x86_64))
678}
679
680bool X86PassConfig::addPostFastRegAllocRewrite() {
682 return true;
683}
684
685std::unique_ptr<CSEConfigBase> X86PassConfig::getCSEConfig() const {
686 return getStandardCSEConfigForOpt(TM->getOptLevel());
687}
688
691 const Register Reg) {
692 const TargetRegisterClass *RC = MRI.getRegClass(Reg);
693 return static_cast<const X86RegisterInfo &>(TRI).isTileRegisterClass(RC);
694}
695
696bool X86PassConfig::addRegAssignAndRewriteOptimized() {
697 // Don't support tile RA when RA is specified by command line "-regalloc".
698 if (!isCustomizedRegAlloc() && EnableTileRAPass) {
699 // Allocate tile register first.
701 addPass(createX86TileConfigPass());
702 }
704}
unsigned const MachineRegisterInfo * MRI
Falkor HW Prefetch Fix
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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.
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
Register 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)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:39
Basic Register Allocator
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
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()
#define LLVM_C_ABI
LLVM_C_ABI is the export/visibility macro used to mark symbols declared in llvm-c as exported when bu...
Definition: Visibility.h:40
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 MachineRegisterInfo &MRI, const Register Reg)
LLVM_C_ABI void LLVMInitializeX86Target()
static Reloc::Model getEffectiveRelocModel(const Triple &TT, bool JIT, std::optional< Reloc::Model > RM)
This file a TargetTransformInfoImplBase conforming object specific to the X86 target machine.
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
Definition: Attributes.cpp:400
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition: Attributes.h:223
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition: Allocator.h:67
implements a set of functionality in the TargetMachine class for targets that make use of the indepen...
static LLVM_ABI const char * getManglingComponent(const Triple &T)
Definition: DataLayout.cpp:175
Lightweight error class with error context and mandatory checking.
Definition: Error.h:159
This pass is responsible for selecting generic machine instructions to target-specific instructions.
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:64
ExceptionHandling getExceptionHandlingType() const
Definition: MCAsmInfo.h:633
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
Definition: PassRegistry.h:38
static LLVM_ABI 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
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition: SourceMgr.h:282
Represents a range in source code.
Definition: SMLoc.h:48
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:55
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition: StringRef.h:480
void setSupportsDebugEntryValues(bool Enable)
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
void setMachineOutliner(bool Enable)
unsigned getPointerSize(unsigned AS) const
Get the pointer size for this target.
std::string TargetFS
std::string TargetCPU
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:47
X86MachineFunctionInfo - This class is derived from MachineFunction and contains private X86 target-s...
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.
yaml::MachineFunctionInfo * convertFuncInfoToYAML(const MachineFunction &MF) const override
Allocate and initialize an instance of the YAML representation of the MachineFunctionInfo.
const X86Subtarget * getSubtargetImpl() const =delete
ScheduleDAGInstrs * createMachineScheduler(MachineSchedContext *C) const override
Create an instance of ScheduleDAGInstrs to be run within the standard MachineScheduler pass for this ...
ScheduleDAGInstrs * createPostMachineScheduler(MachineSchedContext *C) const override
Similar to createMachineScheduler but used when postRA machine scheduling is enabled.
bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, PerFunctionMIParsingState &PFS, SMDiagnostic &Error, SMRange &SourceRange) const override
Parse out the target's MachineFunctionInfo from the YAML reprsentation.
~X86TargetMachine() override
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Get a TargetTransformInfo implementation for the target.
yaml::MachineFunctionInfo * createDefaultFuncInfoYAML() const override
Allocate and return a default initialized instance of the YAML representation for the MachineFunction...
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:444
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...
ScheduleDAGMILive * createSchedLive(MachineSchedContext *C)
Create the standard converging machine scheduler.
LLVM_ABI 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 &)
FunctionPass * createX86SuppressAPXForRelocationPass()
void initializeX86CallFrameOptimizationPass(PassRegistry &)
LLVM_ABI ModulePass * createJMCInstrumenterPass()
JMC instrument pass.
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...
LLVM_ABI 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.
LLVM_ABI FunctionPass * createPseudoProbeInserter()
This pass inserts pseudo probe annotation for callsite profiling.
LLVM_ABI 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:321
LLVM_ABI std::unique_ptr< CSEConfigBase > getStandardCSEConfigForOpt(CodeGenOptLevel Level)
Definition: CSEInfo.cpp:89
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 &)
FunctionPass * createX86ArgumentStackSlotPass()
void initializeX86PreTileConfigPass(PassRegistry &)
LLVM_ABI char & EarlyIfConverterLegacyID
EarlyIfConverter - This pass performs if-conversion on SSA form by inserting cmov instructions.
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 &)
void initializeX86SuppressAPXForRelocationPassPass(PassRegistry &)
FunctionPass * createX86FastPreTileConfigPass()
Return a pass that preconfig the tile registers before fast reg allocation.
std::unique_ptr< ScheduleDAGMutation > createX86MacroFusionDAGMutation()
Note that you have to add: DAG.addMutation(createX86MacroFusionDAGMutation()); to X86TargetMachine::c...
void initializeX86AvoidSFBPassPass(PassRegistry &)
FunctionPass * createX86LowerTileCopyPass()
Return a pass that lower the tile copy instruction.
LLVM_ABI 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...
void initializeX86AsmPrinterPass(PassRegistry &)
FunctionPass * createX86InsertX87waitPass()
This pass insert wait instruction after X87 instructions which could raise fp exceptions when strict-...
ScheduleDAGMI * createSchedPostRA(MachineSchedContext *C)
Create a generic scheduler with no vreg liveness or DAG mutation passes.
void initializeX86FixupSetCCPassPass(PassRegistry &)
LLVM_ABI FunctionPass * createKCFIPass()
Lowers KCFI operand bundles for indirect calls.
Definition: KCFI.cpp:61
LLVM_ABI char & LiveRangeShrinkID
LiveRangeShrink pass.
FunctionPass * createX86ExpandPseudoPass()
Return a Machine IR pass that expands X86-specific pseudo instructions into a sequence of actual inst...
FunctionPass * createX86FixupInstTuning()
Return a pass that replaces equivalent slower instructions with faster ones.
void initializeX86WinEHUnwindV2Pass(PassRegistry &)
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 &)
LLVM_ABI void initializePseudoProbeInserterPass(PassRegistry &)
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:82
LLVM_ABI FunctionPass * createCFGuardLongjmpPass()
Creates CFGuard longjmp target identification pass.
FunctionPass * createX86FastTileConfigPass()
Return a pass that config the tile registers after fast reg allocation.
FunctionPass * createX86PartialReductionPass()
This pass optimizes arithmetic based on knowledge that is only used by a reduction sequence and is th...
FunctionPass * createX86FixupLEAs()
Return a pass that selectively replaces certain instructions (like add, sub, inc, dec,...
LLVM_ABI FunctionPass * createInterleavedAccessPass()
InterleavedAccess Pass - This pass identifies and matches interleaved memory accesses to target speci...
LLVM_ABI void initializeGlobalISel(PassRegistry &)
Initialize all passes linked into the GlobalISel library.
Definition: GlobalISel.cpp:17
LLVM_ABI void initializeKCFIPass(PassRegistry &)
void initializeX86FixupInstTuningPassPass(PassRegistry &)
void initializeX86LowerAMXTypeLegacyPassPass(PassRegistry &)
void initializeX86CmovConverterPassPass(PassRegistry &)
LLVM_ABI 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 &)
LLVM_ABI FunctionPass * createUnpackMachineBundles(std::function< bool(const MachineFunction &)> Ftor)
FunctionPass * createX86WinEHUnwindV2Pass()
// Analyzes and emits pseudos to support Win x64 Unwind V2.
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 initializeX86SpeculativeExecutionSideEffectSuppressionPass(PassRegistry &)
void initializeCompressEVEXPassPass(PassRegistry &)
FunctionPass * createCFGuardCheckPass()
Insert Control FLow Guard checks on indirect function calls.
Definition: CFGuard.cpp:317
LLVM_ABI FunctionPass * createEHContGuardTargetsPass()
Creates Windows EH Continuation Guard target identification pass.
FunctionPass * createX86OptimizeLEAs()
Return a pass that removes redundant LEA instructions and redundant address recalculations.
void initializeX86FixupVectorConstantsPassPass(PassRegistry &)
LLVM_ABI FunctionPass * createX86LowerAMXTypePass()
The pass transforms load/store <256 x i32> to AMX load/store intrinsics or split the data to two <128...
FunctionPass * createX86IndirectThunksPass()
This pass creates the thunks for the retpoline feature.
LLVM_ABI FunctionPass * createAtomicExpandLegacyPass()
AtomicExpandPass - At IR level this pass replace atomic instructions with __atomic_* library calls,...
void initializeX86DynAllocaExpanderPass(PassRegistry &)
Target & getTheX86_64Target()
FunctionPass * createX86FixupVectorConstants()
Return a pass that reduces the size of vector constant pool loads.
LLVM_ABI FunctionPass * createCFIInstrInserter()
Creates CFI Instruction Inserter pass.
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 &)
void initializeX86DAGToDAGISelLegacyPass(PassRegistry &)
FunctionPass * createX86DiscriminateMemOpsPass()
This pass ensures instructions featuring a memory operand have distinctive <LineNumber,...
void initializeFixupLEAPassPass(PassRegistry &)
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition: Error.cpp:180
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,...
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.