LLVM 20.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"
23#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
108}
109
110static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
111 if (TT.isOSBinFormatMachO()) {
112 if (TT.getArch() == Triple::x86_64)
113 return std::make_unique<X86_64MachoTargetObjectFile>();
114 return std::make_unique<TargetLoweringObjectFileMachO>();
115 }
116
117 if (TT.isOSBinFormatCOFF())
118 return std::make_unique<TargetLoweringObjectFileCOFF>();
119
120 if (TT.getArch() == Triple::x86_64)
121 return std::make_unique<X86_64ELFTargetObjectFile>();
122 return std::make_unique<X86ELFTargetObjectFile>();
123}
124
125static std::string computeDataLayout(const Triple &TT) {
126 // X86 is little endian
127 std::string Ret = "e";
128
130 // X86 and x32 have 32 bit pointers.
131 if (!TT.isArch64Bit() || TT.isX32() || TT.isOSNaCl())
132 Ret += "-p:32:32";
133
134 // Address spaces for 32 bit signed, 32 bit unsigned, and 64 bit pointers.
135 Ret += "-p270:32:32-p271:32:32-p272:64:64";
136
137 // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32.
138 // 128 bit integers are not specified in the 32-bit ABIs but are used
139 // internally for lowering f128, so we match the alignment to that.
140 if (TT.isArch64Bit() || TT.isOSWindows() || TT.isOSNaCl())
141 Ret += "-i64:64-i128:128";
142 else if (TT.isOSIAMCU())
143 Ret += "-i64:32-f64:32";
144 else
145 Ret += "-i128:128-f64:32:64";
146
147 // Some ABIs align long double to 128 bits, others to 32.
148 if (TT.isOSNaCl() || TT.isOSIAMCU())
149 ; // No f80
150 else if (TT.isArch64Bit() || TT.isOSDarwin() || TT.isWindowsMSVCEnvironment())
151 Ret += "-f80:128";
152 else
153 Ret += "-f80:32";
154
155 if (TT.isOSIAMCU())
156 Ret += "-f128:32";
157
158 // The registers can hold 8, 16, 32 or, in x86-64, 64 bits.
159 if (TT.isArch64Bit())
160 Ret += "-n8:16:32:64";
161 else
162 Ret += "-n8:16:32";
163
164 // The stack is aligned to 32 bits on some ABIs and 128 bits on others.
165 if ((!TT.isArch64Bit() && TT.isOSWindows()) || TT.isOSIAMCU())
166 Ret += "-a:0:32-S32";
167 else
168 Ret += "-S128";
169
170 return Ret;
171}
172
173static Reloc::Model getEffectiveRelocModel(const Triple &TT, bool JIT,
174 std::optional<Reloc::Model> RM) {
175 bool is64Bit = TT.getArch() == Triple::x86_64;
176 if (!RM) {
177 // JIT codegen should use static relocations by default, since it's
178 // typically executed in process and not relocatable.
179 if (JIT)
180 return Reloc::Static;
181
182 // Darwin defaults to PIC in 64 bit mode and dynamic-no-pic in 32 bit mode.
183 // Win64 requires rip-rel addressing, thus we force it to PIC. Otherwise we
184 // use static relocation model by default.
185 if (TT.isOSDarwin()) {
186 if (is64Bit)
187 return Reloc::PIC_;
188 return Reloc::DynamicNoPIC;
189 }
190 if (TT.isOSWindows() && is64Bit)
191 return Reloc::PIC_;
192 return Reloc::Static;
193 }
194
195 // ELF and X86-64 don't have a distinct DynamicNoPIC model. DynamicNoPIC
196 // is defined as a model for code which may be used in static or dynamic
197 // executables but not necessarily a shared library. On X86-32 we just
198 // compile in -static mode, in x86-64 we use PIC.
199 if (*RM == Reloc::DynamicNoPIC) {
200 if (is64Bit)
201 return Reloc::PIC_;
202 if (!TT.isOSDarwin())
203 return Reloc::Static;
204 }
205
206 // If we are on Darwin, disallow static relocation model in X86-64 mode, since
207 // the Mach-O file format doesn't support it.
208 if (*RM == Reloc::Static && TT.isOSDarwin() && is64Bit)
209 return Reloc::PIC_;
210
211 return *RM;
212}
213
214static CodeModel::Model
215getEffectiveX86CodeModel(const Triple &TT, std::optional<CodeModel::Model> CM,
216 bool JIT) {
217 bool Is64Bit = TT.getArch() == Triple::x86_64;
218 if (CM) {
219 if (*CM == CodeModel::Tiny)
220 report_fatal_error("Target does not support the tiny CodeModel", false);
221 return *CM;
222 }
223 if (JIT)
224 return Is64Bit ? CodeModel::Large : CodeModel::Small;
225 return CodeModel::Small;
226}
227
228/// Create an X86 target.
229///
231 StringRef CPU, StringRef FS,
232 const TargetOptions &Options,
233 std::optional<Reloc::Model> RM,
234 std::optional<CodeModel::Model> CM,
235 CodeGenOptLevel OL, bool JIT)
237 getEffectiveRelocModel(TT, JIT, RM),
238 getEffectiveX86CodeModel(TT, CM, JIT), OL),
239 TLOF(createTLOF(getTargetTriple())), IsJIT(JIT) {
240 // On PS4/PS5, the "return address" of a 'noreturn' call must still be within
241 // the calling function. Note that this also includes __stack_chk_fail,
242 // so there was some target-specific logic in the instruction selectors
243 // to handle that. That code has since been generalized, so the only thing
244 // needed is to set TrapUnreachable here.
245 if (TT.isPS() || TT.isOSBinFormatMachO()) {
246 this->Options.TrapUnreachable = true;
247 this->Options.NoTrapAfterNoreturn = TT.isOSBinFormatMachO();
248 }
249
250 setMachineOutliner(true);
251
252 // x86 supports the debug entry values.
254
255 initAsmInfo();
256}
257
259
260const X86Subtarget *
262 Attribute CPUAttr = F.getFnAttribute("target-cpu");
263 Attribute TuneAttr = F.getFnAttribute("tune-cpu");
264 Attribute FSAttr = F.getFnAttribute("target-features");
265
266 StringRef CPU =
267 CPUAttr.isValid() ? CPUAttr.getValueAsString() : (StringRef)TargetCPU;
268 // "x86-64" is a default target setting for many front ends. In these cases,
269 // they actually request for "generic" tuning unless the "tune-cpu" was
270 // specified.
271 StringRef TuneCPU = TuneAttr.isValid() ? TuneAttr.getValueAsString()
272 : CPU == "x86-64" ? "generic"
273 : (StringRef)CPU;
274 StringRef FS =
275 FSAttr.isValid() ? FSAttr.getValueAsString() : (StringRef)TargetFS;
276
278 // The additions here are ordered so that the definitely short strings are
279 // added first so we won't exceed the small size. We append the
280 // much longer FS string at the end so that we only heap allocate at most
281 // one time.
282
283 // Extract prefer-vector-width attribute.
284 unsigned PreferVectorWidthOverride = 0;
285 Attribute PreferVecWidthAttr = F.getFnAttribute("prefer-vector-width");
286 if (PreferVecWidthAttr.isValid()) {
287 StringRef Val = PreferVecWidthAttr.getValueAsString();
288 unsigned Width;
289 if (!Val.getAsInteger(0, Width)) {
290 Key += 'p';
291 Key += Val;
292 PreferVectorWidthOverride = Width;
293 }
294 }
295
296 // Extract min-legal-vector-width attribute.
297 unsigned RequiredVectorWidth = UINT32_MAX;
298 Attribute MinLegalVecWidthAttr = F.getFnAttribute("min-legal-vector-width");
299 if (MinLegalVecWidthAttr.isValid()) {
300 StringRef Val = MinLegalVecWidthAttr.getValueAsString();
301 unsigned Width;
302 if (!Val.getAsInteger(0, Width)) {
303 Key += 'm';
304 Key += Val;
305 RequiredVectorWidth = Width;
306 }
307 }
308
309 // Add CPU to the Key.
310 Key += CPU;
311
312 // Add tune CPU to the Key.
313 Key += TuneCPU;
314
315 // Keep track of the start of the feature portion of the string.
316 unsigned FSStart = Key.size();
317
318 // FIXME: This is related to the code below to reset the target options,
319 // we need to know whether or not the soft float flag is set on the
320 // function before we can generate a subtarget. We also need to use
321 // it as a key for the subtarget since that can be the only difference
322 // between two functions.
323 bool SoftFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
324 // If the soft float attribute is set on the function turn on the soft float
325 // subtarget feature.
326 if (SoftFloat)
327 Key += FS.empty() ? "+soft-float" : "+soft-float,";
328
329 Key += FS;
330
331 // We may have added +soft-float to the features so move the StringRef to
332 // point to the full string in the Key.
333 FS = Key.substr(FSStart);
334
335 auto &I = SubtargetMap[Key];
336 if (!I) {
337 // This needs to be done before we create a new subtarget since any
338 // creation will depend on the TM and the code generation flags on the
339 // function that reside in TargetOptions.
341 I = std::make_unique<X86Subtarget>(
342 TargetTriple, CPU, TuneCPU, FS, *this,
343 MaybeAlign(F.getParent()->getOverrideStackAlignment()),
344 PreferVectorWidthOverride, RequiredVectorWidth);
345 }
346 return I.get();
347}
348
350 return new yaml::X86MachineFunctionInfo();
351}
352
355 const auto *MFI = MF.getInfo<X86MachineFunctionInfo>();
356 return new yaml::X86MachineFunctionInfo(*MFI);
357}
358
361 SMDiagnostic &Error, SMRange &SourceRange) const {
362 const auto &YamlMFI = static_cast<const yaml::X86MachineFunctionInfo &>(MFI);
363 PFS.MF.getInfo<X86MachineFunctionInfo>()->initializeBaseYamlFields(YamlMFI);
364 return false;
365}
366
368 unsigned DestAS) const {
369 assert(SrcAS != DestAS && "Expected different address spaces!");
370 if (getPointerSize(SrcAS) != getPointerSize(DestAS))
371 return false;
372 return SrcAS < 256 && DestAS < 256;
373}
374
375void X86TargetMachine::reset() { SubtargetMap.clear(); }
376
377//===----------------------------------------------------------------------===//
378// X86 TTI query.
379//===----------------------------------------------------------------------===//
380
383 return TargetTransformInfo(X86TTIImpl(this, F));
384}
385
386//===----------------------------------------------------------------------===//
387// Pass Pipeline Configuration
388//===----------------------------------------------------------------------===//
389
390namespace {
391
392/// X86 Code Generator Pass Configuration Options.
393class X86PassConfig : public TargetPassConfig {
394public:
395 X86PassConfig(X86TargetMachine &TM, PassManagerBase &PM)
396 : TargetPassConfig(TM, PM) {}
397
398 X86TargetMachine &getX86TargetMachine() const {
399 return getTM<X86TargetMachine>();
400 }
401
403 createMachineScheduler(MachineSchedContext *C) const override {
406 return DAG;
407 }
408
410 createPostMachineScheduler(MachineSchedContext *C) const override {
413 return DAG;
414 }
415
416 void addIRPasses() override;
417 bool addInstSelector() override;
418 bool addIRTranslator() override;
419 bool addLegalizeMachineIR() override;
420 bool addRegBankSelect() override;
421 bool addGlobalInstructionSelect() override;
422 bool addILPOpts() override;
423 bool addPreISel() override;
424 void addMachineSSAOptimization() override;
425 void addPreRegAlloc() override;
426 bool addPostFastRegAllocRewrite() override;
427 void addPostRegAlloc() override;
428 void addPreEmitPass() override;
429 void addPreEmitPass2() override;
430 void addPreSched2() override;
431 bool addRegAssignAndRewriteOptimized() override;
432
433 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
434};
435
436class X86ExecutionDomainFix : public ExecutionDomainFix {
437public:
438 static char ID;
439 X86ExecutionDomainFix() : ExecutionDomainFix(ID, X86::VR128XRegClass) {}
440 StringRef getPassName() const override {
441 return "X86 Execution Dependency Fix";
442 }
443};
444char X86ExecutionDomainFix::ID;
445
446} // end anonymous namespace
447
448INITIALIZE_PASS_BEGIN(X86ExecutionDomainFix, "x86-execution-domain-fix",
449 "X86 Execution Domain Fix", false, false)
451INITIALIZE_PASS_END(X86ExecutionDomainFix, "x86-execution-domain-fix",
452 "X86 Execution Domain Fix", false, false)
453
455 return new X86PassConfig(*this, PM);
456}
457
459 BumpPtrAllocator &Allocator, const Function &F,
460 const TargetSubtargetInfo *STI) const {
461 return X86MachineFunctionInfo::create<X86MachineFunctionInfo>(Allocator, F,
462 STI);
463}
464
465void X86PassConfig::addIRPasses() {
467
468 // We add both pass anyway and when these two passes run, we skip the pass
469 // based on the option level and option attribute.
471 addPass(createX86LowerAMXTypePass());
472
474
475 if (TM->getOptLevel() != CodeGenOptLevel::None) {
478 }
479
480 // Add passes that handle indirect branch removal and insertion of a retpoline
481 // thunk. These will be a no-op unless a function subtarget has the retpoline
482 // feature enabled.
484
485 // Add Control Flow Guard checks.
486 const Triple &TT = TM->getTargetTriple();
487 if (TT.isOSWindows()) {
488 if (TT.getArch() == Triple::x86_64) {
489 addPass(createCFGuardDispatchPass());
490 } else {
491 addPass(createCFGuardCheckPass());
492 }
493 }
494
495 if (TM->Options.JMCInstrument)
496 addPass(createJMCInstrumenterPass());
497}
498
499bool X86PassConfig::addInstSelector() {
500 // Install an instruction selector.
501 addPass(createX86ISelDag(getX86TargetMachine(), getOptLevel()));
502
503 // For ELF, cleanup any local-dynamic TLS accesses.
504 if (TM->getTargetTriple().isOSBinFormatELF() &&
505 getOptLevel() != CodeGenOptLevel::None)
507
510 return false;
511}
512
513bool X86PassConfig::addIRTranslator() {
514 addPass(new IRTranslator(getOptLevel()));
515 return false;
516}
517
518bool X86PassConfig::addLegalizeMachineIR() {
519 addPass(new Legalizer());
520 return false;
521}
522
523bool X86PassConfig::addRegBankSelect() {
524 addPass(new RegBankSelect());
525 return false;
526}
527
528bool X86PassConfig::addGlobalInstructionSelect() {
529 addPass(new InstructionSelect(getOptLevel()));
530 // Add GlobalBaseReg in case there is no SelectionDAG passes afterwards
531 if (isGlobalISelAbortEnabled())
533 return false;
534}
535
536bool X86PassConfig::addILPOpts() {
537 addPass(&EarlyIfConverterLegacyID);
539 addPass(&MachineCombinerID);
541 return true;
542}
543
544bool X86PassConfig::addPreISel() {
545 // Only add this pass for 32-bit x86 Windows.
546 const Triple &TT = TM->getTargetTriple();
547 if (TT.isOSWindows() && TT.getArch() == Triple::x86)
548 addPass(createX86WinEHStatePass());
549 return true;
550}
551
552void X86PassConfig::addPreRegAlloc() {
553 if (getOptLevel() != CodeGenOptLevel::None) {
554 addPass(&LiveRangeShrinkID);
556 addPass(createX86FixupSetCC());
557 addPass(createX86OptimizeLEAs());
560 }
561
565
566 if (getOptLevel() != CodeGenOptLevel::None)
568 else
570}
571
572void X86PassConfig::addMachineSSAOptimization() {
575}
576
577void X86PassConfig::addPostRegAlloc() {
580 // When -O0 is enabled, the Load Value Injection Hardening pass will fall back
581 // to using the Speculative Execution Side Effect Suppression pass for
582 // mitigation. This is to prevent slow downs due to
583 // analyses needed by the LVIHardening pass when compiling at -O0.
584 if (getOptLevel() != CodeGenOptLevel::None)
586}
587
588void X86PassConfig::addPreSched2() {
589 addPass(createX86ExpandPseudoPass());
590 addPass(createKCFIPass());
591}
592
593void X86PassConfig::addPreEmitPass() {
594 if (getOptLevel() != CodeGenOptLevel::None) {
595 addPass(new X86ExecutionDomainFix());
596 addPass(createBreakFalseDeps());
597 }
598
600
602
603 if (getOptLevel() != CodeGenOptLevel::None) {
604 addPass(createX86FixupBWInsts());
606 addPass(createX86FixupLEAs());
607 addPass(createX86FixupInstTuning());
609 }
610 addPass(createX86CompressEVEXPass());
614}
615
616void X86PassConfig::addPreEmitPass2() {
617 const Triple &TT = TM->getTargetTriple();
618 const MCAsmInfo *MAI = TM->getMCAsmInfo();
619
620 // The X86 Speculative Execution Pass must run after all control
621 // flow graph modifying passes. As a result it was listed to run right before
622 // the X86 Retpoline Thunks pass. The reason it must run after control flow
623 // graph modifications is that the model of LFENCE in LLVM has to be updated
624 // (FIXME: https://bugs.llvm.org/show_bug.cgi?id=45167). Currently the
625 // placement of this pass was hand checked to ensure that the subsequent
626 // passes don't move the code around the LFENCEs in a way that will hurt the
627 // correctness of this pass. This placement has been shown to work based on
628 // hand inspection of the codegen output.
631 addPass(createX86ReturnThunksPass());
632
633 // Insert extra int3 instructions after trailing call instructions to avoid
634 // issues in the unwinder.
635 if (TT.isOSWindows() && TT.getArch() == Triple::x86_64)
637
638 // Verify basic block incoming and outgoing cfa offset and register values and
639 // correct CFA calculation rule where needed by inserting appropriate CFI
640 // instructions.
641 if (!TT.isOSDarwin() &&
642 (!TT.isOSWindows() ||
644 addPass(createCFIInstrInserter());
645
646 if (TT.isOSWindows()) {
647 // Identify valid longjmp targets for Windows Control Flow Guard.
648 addPass(createCFGuardLongjmpPass());
649 // Identify valid eh continuation targets for Windows EHCont Guard.
651 }
653
654 // Insert pseudo probe annotation for callsite profiling
655 addPass(createPseudoProbeInserter());
656
657 // KCFI indirect call checks are lowered to a bundle, and on Darwin platforms,
658 // also CALL_RVMARKER.
659 addPass(createUnpackMachineBundles([&TT](const MachineFunction &MF) {
660 // Only run bundle expansion if the module uses kcfi, or there are relevant
661 // ObjC runtime functions present in the module.
662 const Function &F = MF.getFunction();
663 const Module *M = F.getParent();
664 return M->getModuleFlag("kcfi") ||
665 (TT.isOSDarwin() &&
666 (M->getFunction("objc_retainAutoreleasedReturnValue") ||
667 M->getFunction("objc_unsafeClaimAutoreleasedReturnValue")));
668 }));
669}
670
671bool X86PassConfig::addPostFastRegAllocRewrite() {
673 return true;
674}
675
676std::unique_ptr<CSEConfigBase> X86PassConfig::getCSEConfig() const {
677 return getStandardCSEConfigForOpt(TM->getOptLevel());
678}
679
682 const Register Reg) {
683 const TargetRegisterClass *RC = MRI.getRegClass(Reg);
684 return static_cast<const X86RegisterInfo &>(TRI).isTileRegisterClass(RC);
685}
686
687bool X86PassConfig::addRegAssignAndRewriteOptimized() {
688 // Don't support tile RA when RA is specified by command line "-regalloc".
689 if (!isCustomizedRegAlloc() && EnableTileRAPass) {
690 // Allocate tile register first.
692 addPass(createX86TileConfigPass());
693 }
695}
unsigned const MachineRegisterInfo * MRI
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_C_ABI
Definition: Compiler.h:218
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)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:55
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:57
#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 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 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 TargetTransformInfo::Concept conforming object specific to the X86 target machine.
StringRef getValueAsString() const
Return the attribute's value as a string.
Definition: Attributes.cpp:392
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition: Attributes.h:208
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition: Allocator.h:66
implements a set of functionality in the TargetMachine class for targets that make use of the indepen...
static const char * getManglingComponent(const Triple &T)
Definition: DataLayout.cpp:176
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
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:56
ExceptionHandling getExceptionHandlingType() const
Definition: MCAsmInfo.h:740
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: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
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:281
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:51
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition: StringRef.h:470
void setSupportsDebugEntryValues(bool Enable)
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
Definition: TargetMachine.h:96
void setMachineOutliner(bool Enable)
unsigned getPointerSize(unsigned AS) const
Get the pointer size for this target.
std::string TargetFS
Definition: TargetMachine.h:98
std::string TargetCPU
Definition: TargetMachine.h:97
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
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
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 ...
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
@ DynamicNoPIC
Definition: CodeGen.h:25
@ X86
Windows x64, Windows Itanium (IA-64)
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
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:318
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 &)
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 &)
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:167
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...
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:314
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 * createX86WinFixupBufferSecurityCheckPass()
Return a pass that transform inline buffer security check into seperate bb.
FunctionPass * createX86IndirectThunksPass()
This pass creates the thunks for the retpoline feature.
FunctionPass * createAtomicExpandLegacyPass()
AtomicExpandPass - At IR level this pass replace atomic instructions with __atomic_* library calls,...
FunctionPass * createEHContGuardCatchretPass()
Creates EHContGuard catchret target identification pass.
void initializeX86DynAllocaExpanderPass(PassRegistry &)
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 &)
void initializeX86DAGToDAGISelLegacyPass(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,...
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.