LLVM 24.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"
44#include "llvm/Pass.h"
51#include <memory>
52#include <optional>
53
54using namespace llvm;
55
57 // Register the target.
61
104}
105
106static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
107 if (TT.isOSBinFormatMachO()) {
108 if (TT.isX86_64())
109 return std::make_unique<X86_64MachoTargetObjectFile>();
110 return std::make_unique<TargetLoweringObjectFileMachO>();
111 }
112
113 if (TT.isOSBinFormatCOFF())
114 return std::make_unique<TargetLoweringObjectFileCOFF>();
115
116 if (TT.isX86_64())
117 return std::make_unique<X86_64ELFTargetObjectFile>();
118 return std::make_unique<X86ELFTargetObjectFile>();
119}
120
121static Reloc::Model getEffectiveRelocModel(const Triple &TT, bool JIT,
122 std::optional<Reloc::Model> RM) {
123 bool is64Bit = TT.isX86_64();
124 if (!RM) {
125 // JIT codegen should use static relocations by default, since it's
126 // typically executed in process and not relocatable.
127 if (JIT)
128 return Reloc::Static;
129
130 // Darwin defaults to PIC in 64 bit mode and dynamic-no-pic in 32 bit mode.
131 // Win64 requires rip-rel addressing, thus we force it to PIC. Otherwise we
132 // use static relocation model by default.
133 if (TT.isOSDarwin()) {
134 if (is64Bit)
135 return Reloc::PIC_;
136 return Reloc::DynamicNoPIC;
137 }
138 if (TT.isOSWindows() && is64Bit)
139 return Reloc::PIC_;
140 return Reloc::Static;
141 }
142
143 // ELF and X86-64 don't have a distinct DynamicNoPIC model. DynamicNoPIC
144 // is defined as a model for code which may be used in static or dynamic
145 // executables but not necessarily a shared library. On X86-32 we just
146 // compile in -static mode, in x86-64 we use PIC.
147 if (*RM == Reloc::DynamicNoPIC) {
148 if (is64Bit)
149 return Reloc::PIC_;
150 if (!TT.isOSDarwin())
151 return Reloc::Static;
152 }
153
154 // If we are on Darwin, disallow static relocation model in X86-64 mode, since
155 // the Mach-O file format doesn't support it.
156 if (*RM == Reloc::Static && TT.isOSDarwin() && is64Bit)
157 return Reloc::PIC_;
158
159 return *RM;
160}
161
162static CodeModel::Model
163getEffectiveX86CodeModel(const Triple &TT, std::optional<CodeModel::Model> CM,
164 bool JIT) {
165 bool Is64Bit = TT.isX86_64();
166 if (CM) {
167 if (*CM == CodeModel::Tiny)
168 reportFatalUsageError("target does not support the tiny CodeModel");
169 return *CM;
170 }
171 if (JIT)
172 return Is64Bit ? CodeModel::Large : CodeModel::Small;
173 return CodeModel::Small;
174}
175
176/// Create an X86 target.
177///
179 StringRef CPU, StringRef FS,
180 const TargetOptions &Options,
181 std::optional<Reloc::Model> RM,
182 std::optional<CodeModel::Model> CM,
183 CodeGenOptLevel OL, bool JIT)
184 : CodeGenTargetMachineImpl(T, TT, CPU, FS, Options,
185 getEffectiveRelocModel(TT, JIT, RM),
186 getEffectiveX86CodeModel(TT, CM, JIT), OL),
187 CLOpts(cl::LibraryOptionsContext::get<X86Options>(
188 Options.MCOptions.LibraryOptions)),
189 TLOF(createTLOF(getTargetTriple())), IsJIT(JIT) {
190 // On PS4/PS5, the "return address" of a 'noreturn' call must still be within
191 // the calling function. Note that this also includes __stack_chk_fail,
192 // so there was some target-specific logic in the instruction selectors
193 // to handle that. That code has since been generalized, so the only thing
194 // needed is to set TrapUnreachable here.
195 if (TT.isPS() || TT.isOSBinFormatMachO()) {
196 this->Options.TrapUnreachable = true;
197 this->Options.NoTrapAfterNoreturn = TT.isOSBinFormatMachO();
198 }
199
200 setMachineOutliner(true);
201
202 // x86 supports the debug entry values.
204
205 initAsmInfo();
206}
207
209
210const X86Subtarget *
212 Attribute CPUAttr = F.getFnAttribute("target-cpu");
213 Attribute TuneAttr = F.getFnAttribute("tune-cpu");
214 Attribute FSAttr = F.getFnAttribute("target-features");
215
216 StringRef CPU =
217 CPUAttr.isValid() ? CPUAttr.getValueAsString() : (StringRef)TargetCPU;
218 // "x86-64" is a default target setting for many front ends. In these cases,
219 // they actually request for "generic" tuning unless the "tune-cpu" was
220 // specified.
221 StringRef TuneCPU = TuneAttr.isValid() ? TuneAttr.getValueAsString()
222 : CPU == "x86-64" ? "generic"
223 : (StringRef)CPU;
224 StringRef FS =
225 FSAttr.isValid() ? FSAttr.getValueAsString() : (StringRef)TargetFS;
226
228 // The additions here are ordered so that the definitely short strings are
229 // added first so we won't exceed the small size. We append the
230 // much longer FS string at the end so that we only heap allocate at most
231 // one time.
232
233 // Extract prefer-vector-width attribute.
234 unsigned PreferVectorWidthOverride = 0;
235 Attribute PreferVecWidthAttr = F.getFnAttribute("prefer-vector-width");
236 if (PreferVecWidthAttr.isValid()) {
237 StringRef Val = PreferVecWidthAttr.getValueAsString();
238 unsigned Width;
239 if (!Val.getAsInteger(0, Width)) {
240 Key += 'p';
241 Key += Val;
242 PreferVectorWidthOverride = Width;
243 }
244 }
245
246 // Extract min-legal-vector-width attribute.
247 unsigned RequiredVectorWidth = UINT32_MAX;
248 Attribute MinLegalVecWidthAttr = F.getFnAttribute("min-legal-vector-width");
249 if (MinLegalVecWidthAttr.isValid()) {
250 StringRef Val = MinLegalVecWidthAttr.getValueAsString();
251 unsigned Width;
252 if (!Val.getAsInteger(0, Width)) {
253 Key += 'm';
254 Key += Val;
255 RequiredVectorWidth = Width;
256 }
257 }
258
259 // Add CPU to the Key.
260 Key += CPU;
261
262 // Add tune CPU to the Key.
263 Key += TuneCPU;
264
265 // Keep track of the start of the feature portion of the string.
266 unsigned FSStart = Key.size();
267
268 // FIXME: This is related to the code below to reset the target options,
269 // we need to know whether or not the soft float flag is set on the
270 // function before we can generate a subtarget. We also need to use
271 // it as a key for the subtarget since that can be the only difference
272 // between two functions.
273 bool SoftFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
274 // If the soft float attribute is set on the function turn on the soft float
275 // subtarget feature.
276 if (SoftFloat)
277 Key += FS.empty() ? "+soft-float" : "+soft-float,";
278
279 Key += FS;
280
281 // We may have added +soft-float to the features so move the StringRef to
282 // point to the full string in the Key.
283 FS = Key.substr(FSStart);
284
285 auto &I = SubtargetMap[Key];
286 if (!I) {
287 I = std::make_unique<X86Subtarget>(
288 TargetTriple, CPU, TuneCPU, FS, *this,
289 MaybeAlign(F.getParent()->getOverrideStackAlignment()),
290 PreferVectorWidthOverride, RequiredVectorWidth);
291 }
292 return I.get();
293}
294
298
301 const auto *MFI = MF.getInfo<X86MachineFunctionInfo>();
302 return new yaml::X86MachineFunctionInfo(*MFI);
303}
304
307 SMDiagnostic &Error, SMRange &SourceRange) const {
308 const auto &YamlMFI = static_cast<const yaml::X86MachineFunctionInfo &>(MFI);
309 PFS.MF.getInfo<X86MachineFunctionInfo>()->initializeBaseYamlFields(YamlMFI);
310 return false;
311}
312
314 unsigned DestAS) const {
315 assert(SrcAS != DestAS && "Expected different address spaces!");
316 if (DL.getPointerSize(SrcAS) != DL.getPointerSize(DestAS))
317 return false;
318 return SrcAS < 256 && DestAS < 256;
319}
320
321void X86TargetMachine::reset() { SubtargetMap.clear(); }
322
329
336
337//===----------------------------------------------------------------------===//
338// X86 TTI query.
339//===----------------------------------------------------------------------===//
340
343 return TargetTransformInfo(std::make_unique<X86TTIImpl>(this, F));
344}
345
346//===----------------------------------------------------------------------===//
347// Pass Pipeline Configuration
348//===----------------------------------------------------------------------===//
349
350namespace {
351
352/// X86 Code Generator Pass Configuration Options.
353class X86PassConfig : public TargetPassConfig {
354public:
355 X86PassConfig(X86TargetMachine &TM, PassManagerBase &PM)
356 : TargetPassConfig(TM, PM) {}
357
358 X86TargetMachine &getX86TargetMachine() const {
360 }
361
362 void addIRPasses() override;
363 bool addInstSelector() override;
364 bool addIRTranslator() override;
365 bool addLegalizeMachineIR() override;
366 void addPreRegBankSelect() override;
367 bool addRegBankSelect() override;
368 bool addGlobalInstructionSelect() override;
369 void addPreLegalizeMachineIR() override;
370 bool addILPOpts() override;
371 bool addPreISel() override;
372 void addMachineSSAOptimization() override;
373 void addPreRegAlloc() override;
374 bool addPostFastRegAllocRewrite() override;
375 void addPostRegAlloc() override;
376 void addPreEmitPass() override;
377 void addPreEmitPass2() override;
378 void addPreSched2() override;
379 bool addRegAssignAndRewriteOptimized() override;
380
381 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
382};
383
384class X86ExecutionDomainFix : public ExecutionDomainFix {
385public:
386 static char ID;
387 X86ExecutionDomainFix() : ExecutionDomainFix(ID, X86::VR128XRegClass) {}
388 StringRef getPassName() const override {
389 return "X86 Execution Dependency Fix";
390 }
391};
392char X86ExecutionDomainFix::ID;
393
394} // end anonymous namespace
395
396INITIALIZE_PASS_BEGIN(X86ExecutionDomainFix, "x86-execution-domain-fix",
397 "X86 Execution Domain Fix", false, false)
399INITIALIZE_PASS_END(X86ExecutionDomainFix, "x86-execution-domain-fix",
400 "X86 Execution Domain Fix", false, false)
401
403 return new X86PassConfig(*this, PM);
404}
405
412
413void X86PassConfig::addIRPasses() {
415
416 // We add both pass anyway and when these two passes run, we skip the pass
417 // based on the option level and option attribute.
420
422
423 if (TM->getOptLevel() != CodeGenOptLevel::None) {
426 }
427
428 // Add passes that handle indirect branch removal and insertion of a retpoline
429 // thunk. These will be a no-op unless a function subtarget has the retpoline
430 // feature enabled.
431 addPass(createIndirectBrExpandPass(getOptLevel()));
432
433 // Add Control Flow Guard checks.
434 const Triple &TT = TM->getTargetTriple();
435 if (TT.isOSWindows()) {
436 addPass(createCFGuardPass());
437 }
438
439 if (TM->Options.JMCInstrument)
440 addPass(createJMCInstrumenterPass());
441}
442
443bool X86PassConfig::addInstSelector() {
444 // Install an instruction selector.
445 addPass(createX86ISelDag(getX86TargetMachine(), getOptLevel()));
446
447 // For ELF, cleanup any local-dynamic TLS accesses.
448 if (TM->getTargetTriple().isOSBinFormatELF() &&
449 getOptLevel() != CodeGenOptLevel::None)
451
454 return false;
455}
456
457bool X86PassConfig::addIRTranslator() {
458 addPass(new IRTranslatorLegacy(getOptLevel()));
459 return false;
460}
461
462void X86PassConfig::addPreRegBankSelect() {
463 bool IsOptNone = getOptLevel() == CodeGenOptLevel::None;
464 if (!IsOptNone) {
466 }
467}
468bool X86PassConfig::addLegalizeMachineIR() {
469 addPass(new LegalizerLegacy());
470 return false;
471}
472
473bool X86PassConfig::addRegBankSelect() {
474 addPass(new RegBankSelectLegacy());
475 return false;
476}
477
478bool X86PassConfig::addGlobalInstructionSelect() {
479 addPass(new InstructionSelectLegacy(getOptLevel()));
480 // Add GlobalBaseReg in case there is no SelectionDAG passes afterwards
481 if (isGlobalISelAbortEnabled())
483 return false;
484}
485
486void X86PassConfig::addPreLegalizeMachineIR() {
487 if (getOptLevel() != CodeGenOptLevel::None) {
489 }
490}
491
492bool X86PassConfig::addILPOpts() {
493 addPass(&EarlyIfConverterLegacyID);
494 if (getX86TargetMachine().getCLOpts().machine_combiner)
495 addPass(&MachineCombinerID);
497 return true;
498}
499
500bool X86PassConfig::addPreISel() {
501 // Only add this pass for 32-bit x86 Windows.
502 const Triple &TT = TM->getTargetTriple();
503 if (TT.isOSWindows() && TT.isX86_32())
505 return true;
506}
507
508void X86PassConfig::addPreRegAlloc() {
509 if (getOptLevel() != CodeGenOptLevel::None) {
510 addPass(&LiveRangeShrinkID);
515 }
516
518
522
523 if (getOptLevel() != CodeGenOptLevel::None)
525 else
527}
528
529void X86PassConfig::addMachineSSAOptimization() {
532}
533
534void X86PassConfig::addPostRegAlloc() {
537 // When -O0 is enabled, the Load Value Injection Hardening pass will fall back
538 // to using the Speculative Execution Side Effect Suppression pass for
539 // mitigation. This is to prevent slow downs due to
540 // analyses needed by the LVIHardening pass when compiling at -O0.
541 if (getOptLevel() != CodeGenOptLevel::None)
543}
544
545void X86PassConfig::addPreSched2() {
547 addPass(createKCFIPass());
548}
549
550void X86PassConfig::addPreEmitPass() {
551 if (getOptLevel() != CodeGenOptLevel::None) {
552 addPass(new X86ExecutionDomainFix());
554 }
555
557
559
560 if (getOptLevel() != CodeGenOptLevel::None) {
566 }
569
570 if (TM->getTargetTriple().isLFI())
571 addPass(createX86LFIRewritePass());
572}
573
574void X86PassConfig::addPreEmitPass2() {
575 const Triple &TT = TM->getTargetTriple();
576 const MCAsmInfo &MAI = TM->getMCAsmInfo();
577
578 // The X86 Speculative Execution Pass must run after all control
579 // flow graph modifying passes. As a result it was listed to run right before
580 // the X86 Retpoline Thunks pass. The reason it must run after control flow
581 // graph modifications is that the model of LFENCE in LLVM has to be updated
582 // (FIXME: https://bugs.llvm.org/show_bug.cgi?id=45167). Currently the
583 // placement of this pass was hand checked to ensure that the subsequent
584 // passes don't move the code around the LFENCEs in a way that will hurt the
585 // correctness of this pass. This placement has been shown to work based on
586 // hand inspection of the codegen output.
590
591 // Insert extra int3 instructions after trailing call instructions to avoid
592 // issues in the unwinder.
593 if (TT.isOSWindows() && TT.isX86_64())
595
596 // Verify basic block incoming and outgoing cfa offset and register values and
597 // correct CFA calculation rule where needed by inserting appropriate CFI
598 // instructions.
599 if (!TT.isOSDarwin() &&
600 (!TT.isOSWindows() ||
603
604 if (TT.isOSWindows()) {
605 // Identify valid longjmp targets for Windows Control Flow Guard.
606 addPass(createCFGuardLongjmpPass());
607 // Identify valid eh continuation targets for Windows EHCont Guard.
609 }
611
612 // Insert pseudo probe annotation for callsite profiling
613 addPass(createPseudoProbeInserter());
614
615 // KCFI indirect call checks are lowered to a bundle, and on Darwin platforms,
616 // also CALL_RVMARKER.
617 addPass(createUnpackMachineBundlesLegacy([&TT](const MachineFunction &MF) {
618 // Only run bundle expansion if the module uses kcfi, or there are relevant
619 // ObjC runtime functions present in the module.
620 const Function &F = MF.getFunction();
621 const Module *M = F.getParent();
622 return M->getModuleFlag("kcfi") ||
623 (TT.isOSDarwin() &&
624 (M->getFunction("objc_retainAutoreleasedReturnValue") ||
625 M->getFunction("objc_unsafeClaimAutoreleasedReturnValue")));
626 }));
627
628 // Analyzes and emits pseudos to support Win x64 Unwind V2. This pass must run
629 // after all real instructions have been added to the epilog.
630 if (TT.isOSWindows() && TT.isX86_64()) {
633 }
634}
635
636bool X86PassConfig::addPostFastRegAllocRewrite() {
638 return true;
639}
640
641std::unique_ptr<CSEConfigBase> X86PassConfig::getCSEConfig() const {
642 return getStandardCSEConfigForOpt(TM->getOptLevel());
643}
644
646 const MachineRegisterInfo &MRI,
647 const Register Reg) {
648 const TargetRegisterClass *RC = MRI.getRegClass(Reg);
649 return static_cast<const X86RegisterInfo &>(TRI).isTileRegisterClass(RC);
650}
651
652bool X86PassConfig::addRegAssignAndRewriteOptimized() {
653 // Don't support tile RA when RA is specified by command line "-regalloc".
654 if (!isCustomizedRegAlloc() && getX86TargetMachine().getCLOpts().tile_ra) {
655 // Allocate tile register first.
658 }
660}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static std::unique_ptr< TargetLoweringObjectFile > createTLOF(const Triple &TT)
static Reloc::Model getEffectiveRelocModel()
This file contains the simple types necessary to represent the attributes associated with functions a...
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
Provides analysis for continuously CSEing during GISel passes.
This file describes how to lower LLVM calls to machine code calls.
This file declares the IRTranslator pass.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
Register const TargetRegisterInfo * TRI
#define T
#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
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
This file defines the SmallString class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
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 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()
This file a TargetTransformInfoImplBase conforming object specific to the X86 target machine.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:266
CodeGenTargetMachineImpl(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOptLevel OL)
virtual void reset()
Reset internal state.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
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:67
ExceptionHandling getExceptionHandlingType() const
Definition MCAsmInfo.h:656
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,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
This pass implements the reg bank selector pass used in the GlobalISel pipeline.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition SourceMgr.h:305
Represents a range in source code.
Definition SMLoc.h:47
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
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition StringRef.h:490
void setSupportsDebugEntryValues(bool Enable)
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
const Triple & getTargetTriple() const
void setMachineOutliner(bool Enable)
const DataLayout DL
DataLayout for the target: keep ABI type size and alignment.
std::unique_ptr< const MCSubtargetInfo > STI
TargetOptions Options
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:48
X86MachineFunctionInfo - This class is derived from MachineFunction and contains private X86 target-s...
bool isNoopAddrSpaceCast(const DataLayout &DL, 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.
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
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 ...
Registers T::Global with cl::ParseCommandLineOptions.
const MipsMCOptions & getCLOpts(const MCTargetOptions &Options)
@ DynamicNoPIC
Definition CodeGen.h:26
@ X86
Windows x64, Windows Itanium (IA-64)
Definition MCAsmInfo.h:53
This namespace contains all of the command line option processing machinery.
Definition LLVMContext.h:35
This is an optimization pass for GlobalISel generic memory operations.
ScheduleDAGMILive * createSchedLive(MachineSchedContext *C)
Create the standard converging machine scheduler.
FunctionPass * createX86WinEHUnwindV3Pass()
Capacity check and sub-fragment splitting for Win x64 Unwind V3.
void initializeX86LoadValueInjectionLoadHardeningLegacyPass(PassRegistry &)
FunctionPass * createX86LowerAMXIntrinsicsLegacyPass()
FunctionPass * createX86CompressEVEXLegacyPass()
FunctionPass * createX86FastTileConfigLegacyPass()
void initializeX86PartialReductionLegacyPass(PassRegistry &)
FunctionPass * createX86DomainReassignmentLegacyPass()
FunctionPass * createX86ExpandPseudoLegacyPass()
Returns an instance of the pseudo instruction expansion pass.
LLVM_ABI ModulePass * createJMCInstrumenterPass()
JMC instrument pass.
FunctionPass * createX86OptimizeLEAsLegacyPass()
void initializeCompressEVEXLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createGreedyRegisterAllocator()
Greedy register allocation pass - This pass implements a global register allocator for optimized buil...
void initializeX86PostLegalizerCombinerLegacyPass(PassRegistry &)
FunctionPass * createX86DynAllocaExpanderLegacyPass()
void initializeX86DomainReassignmentLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createEHContGuardTargetsLegacy()
Creates Windows EH Continuation Guard target identification pass.
FunctionPass * createX86TileConfigLegacyPass()
LLVM_ABI FunctionPass * createPseudoProbeInserter()
This pass inserts pseudo probe annotation for callsite profiling.
Target & getTheX86_32Target()
FunctionPass * createX86AvoidStoreForwardingBlocksLegacyPass()
void initializeX86LowerAMXIntrinsicsLegacyPassPass(PassRegistry &)
FunctionPass * createX86InsertX87WaitLegacyPass()
FunctionPass * createX86PartialReductionLegacyPass()
void initializeX86CmovConversionLegacyPass(PassRegistry &)
void initializeX86DynAllocaExpanderLegacyPass(PassRegistry &)
FunctionPass * createX86FixupSetCCLegacyPass()
LLVM_ABI std::unique_ptr< CSEConfigBase > getStandardCSEConfigForOpt(CodeGenOptLevel Level)
Definition CSEInfo.cpp:85
void initializeX86FastPreTileConfigLegacyPass(PassRegistry &)
FunctionPass * createX86SpeculativeExecutionSideEffectSuppressionLegacyPass()
LLVM_ABI char & EarlyIfConverterLegacyID
EarlyIfConverter - This pass performs if-conversion on SSA form by inserting cmov instructions.
LLVM_ABI FunctionPass * createCFIInstrInserterLegacy()
Creates CFI Instruction Inserter pass.
FunctionPass * createX86LoadValueInjectionLoadHardeningLegacyPass()
FunctionPass * createX86PadShortFunctions()
Return a pass that pads short functions with NOOPs.
LLVM_ABI FunctionPass * createIndirectBrExpandPass(CodeGenOptLevel OptLevel)
std::unique_ptr< ScheduleDAGMutation > createX86MacroFusionDAGMutation()
Note that you have to add: DAG.addMutation(createX86MacroFusionDAGMutation()); to X86TargetMachine::c...
LLVM_ABI void initializeMachineKCFILegacyPass(PassRegistry &)
LLVM_ABI char & MachineCombinerID
This pass performs instruction combining using trace metrics to estimate critical-path and resource d...
LLVM_ABI FunctionPass * createUnpackMachineBundlesLegacy(std::function< bool(const MachineFunction &)> Ftor)
static Reloc::Model getEffectiveRelocModel(std::optional< Reloc::Model > RM)
void initializeX86FastTileConfigLegacyPass(PassRegistry &)
void initializeX86FixupVectorConstantsLegacyPass(PassRegistry &)
FunctionPass * createX86IndirectBranchTrackingLegacyPass()
void initializeX86AsmPrinterPass(PassRegistry &)
FunctionPass * createX86LowerTileCopyLegacyPass()
void initializeX86ExpandPseudoLegacyPass(PassRegistry &)
ScheduleDAGMI * createSchedPostRA(MachineSchedContext *C)
Create a generic scheduler with no vreg liveness or DAG mutation passes.
FunctionPass * createX86CmovConversionLegacyPass()
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
FunctionPass * createX86ArgumentStackSlotLegacyPass()
LLVM_ABI FunctionPass * createKCFIPass()
Lowers KCFI operand bundles for indirect calls.
Definition KCFI.cpp:75
void initializeX86SpeculativeExecutionSideEffectSuppressionLegacyPass(PassRegistry &)
void initializeX86FixupInstTuningLegacyPass(PassRegistry &)
LLVM_ABI char & LiveRangeShrinkID
LiveRangeShrink pass.
void initializeX86FlagsCopyLoweringLegacyPass(PassRegistry &)
FunctionPass * createX86PostLegalizerCombinerLegacy()
void initializeX86AvoidTrailingCallLegacyPassPass(PassRegistry &)
FunctionPass * createX86ISelDag(X86TargetMachine &TM, CodeGenOptLevel OptLevel)
This pass converts a legalized DAG into a X86-specific DAG, ready for instruction scheduling.
FunctionPass * createX86FixupLEAsLegacyPass()
FunctionPass * createX86LFIRewritePass()
FunctionPass * createX86CallFrameOptimizationLegacyPass()
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:227
void initializeX86CallFrameOptimizationLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createCFGuardLongjmpPass()
Creates CFGuard longjmp target identification pass.
FunctionPass * createX86FlagsCopyLoweringLegacyPass()
FunctionPass * createCleanupLocalDynamicTLSLegacyPass()
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
void initializeX86FixupBWInstLegacyPass(PassRegistry &)
void initializeX86LoadValueInjectionRetHardeningLegacyPass(PassRegistry &)
void initializeX86FPStackifierLegacyPass(PassRegistry &)
void initializeX86LowerTileCopyLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createInterleavedAccessPass()
InterleavedAccess Pass - This pass identifies and matches interleaved memory accesses to target speci...
void initializeX86SpeculativeLoadHardeningLegacyPass(PassRegistry &)
void initializeX86TileConfigLegacyPass(PassRegistry &)
LLVM_ABI void initializeGlobalISel(PassRegistry &)
Initialize all passes linked into the GlobalISel library.
void initializeFixupLEAsLegacyPass(PassRegistry &)
FunctionPass * createX86PreTileConfigLegacyPass()
FunctionPass * createX86InsertVZeroUpperLegacyPass()
FunctionPass * createX86SpeculativeLoadHardeningLegacyPass()
void initializeX86LowerAMXTypeLegacyPassPass(PassRegistry &)
FunctionPass * createX86ReturnThunksLegacyPass()
void initializeX86ArgumentStackSlotLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createCFGuardPass()
Insert Control Flow Guard checks on indirect function calls.
Definition CFGuard.cpp:315
FunctionPass * createX86FixupBWInstsLegacyPass()
FunctionPass * createX86PreLegalizerCombinerLegacy()
FunctionPass * createX86FPStackifierLegacyPass()
void initializeX86PreTileConfigLegacyPass(PassRegistry &)
FunctionPass * createX86SuppressAPXForRelocationLegacyPass()
FunctionPass * createX86FastPreTileConfigLegacyPass()
FunctionPass * createX86LoadValueInjectionRetHardeningLegacyPass()
FunctionPass * createX86LowerAMXTypeLegacyPass()
void initializeX86WinEHUnwindV3Pass(PassRegistry &)
@ DwarfCFI
DWARF-like instruction based exceptions.
Definition CodeGen.h:57
void initializeX86ReturnThunksLegacyPass(PassRegistry &)
void initializeX86PreLegalizerCombinerLegacyPass(PassRegistry &)
void initializeX86SuppressAPXForRelocationLegacyPass(PassRegistry &)
FunctionPass * createX86WinEHStateLegacyPass()
FunctionPass * createX86FixupVectorConstantsLegacyPass()
void initializeX86FixupSetCCLegacyPass(PassRegistry &)
void initializeWinEHStateLegacyPass(PassRegistry &)
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,...
FunctionPass * createX86WinEHUnwindV2LegacyPass()
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:391
Target & getTheX86_64Target()
FunctionPass * createX86FixupInstTuningLegacyPass()
void initializeX86ExecutionDomainFixPass(PassRegistry &)
LLVM_ABI FunctionPass * createBreakFalseDepsLegacyPass()
Creates Break False Dependencies pass.
void initializeX86DAGToDAGISelLegacyPass(PassRegistry &)
void initializeX86OptimizeLEAsLegacyPass(PassRegistry &)
void initializeX86AvoidSFBLegacyPass(PassRegistry &)
void initializeX86WinEHUnwindV2LegacyPass(PassRegistry &)
FunctionPass * createX86AvoidTrailingCallLegacyPass()
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
FunctionPass * createX86GlobalBaseRegLegacyPass()
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
static FuncInfoTy * create(BumpPtrAllocator &Allocator, const Function &F, const SubtargetTy *STI)
Factory function: default behavior is to call new using the supplied allocator.
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:111
RegisterTargetMachine - Helper template for registering a target machine implementation,...
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.