LLVM  8.0.1
X86TargetMachine.cpp
Go to the documentation of this file.
1 //===-- X86TargetMachine.cpp - Define TargetMachine for the X86 -----------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the X86 specific subclass of TargetMachine.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "X86TargetMachine.h"
16 #include "X86.h"
17 #include "X86CallLowering.h"
18 #include "X86LegalizerInfo.h"
19 #include "X86MacroFusion.h"
20 #include "X86Subtarget.h"
21 #include "X86TargetObjectFile.h"
22 #include "X86TargetTransformInfo.h"
23 #include "llvm/ADT/Optional.h"
24 #include "llvm/ADT/STLExtras.h"
25 #include "llvm/ADT/SmallString.h"
26 #include "llvm/ADT/StringRef.h"
27 #include "llvm/ADT/Triple.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"
42 #include "llvm/Pass.h"
43 #include "llvm/Support/CodeGen.h"
49 #include <memory>
50 #include <string>
51 
52 using namespace llvm;
53 
54 static cl::opt<bool> EnableMachineCombinerPass("x86-machine-combiner",
55  cl::desc("Enable the machine combiner pass"),
56  cl::init(true), cl::Hidden);
57 
58 static cl::opt<bool> EnableCondBrFoldingPass("x86-condbr-folding",
59  cl::desc("Enable the conditional branch "
60  "folding pass"),
61  cl::init(false), cl::Hidden);
62 
63 extern "C" void LLVMInitializeX86Target() {
64  // Register the target.
67 
83 }
84 
85 static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
86  if (TT.isOSBinFormatMachO()) {
87  if (TT.getArch() == Triple::x86_64)
88  return llvm::make_unique<X86_64MachoTargetObjectFile>();
89  return llvm::make_unique<TargetLoweringObjectFileMachO>();
90  }
91 
92  if (TT.isOSFreeBSD())
93  return llvm::make_unique<X86FreeBSDTargetObjectFile>();
94  if (TT.isOSLinux() || TT.isOSNaCl() || TT.isOSIAMCU())
95  return llvm::make_unique<X86LinuxNaClTargetObjectFile>();
96  if (TT.isOSSolaris())
97  return llvm::make_unique<X86SolarisTargetObjectFile>();
98  if (TT.isOSFuchsia())
99  return llvm::make_unique<X86FuchsiaTargetObjectFile>();
100  if (TT.isOSBinFormatELF())
101  return llvm::make_unique<X86ELFTargetObjectFile>();
102  if (TT.isOSBinFormatCOFF())
103  return llvm::make_unique<TargetLoweringObjectFileCOFF>();
104  llvm_unreachable("unknown subtarget type");
105 }
106 
107 static std::string computeDataLayout(const Triple &TT) {
108  // X86 is little endian
109  std::string Ret = "e";
110 
112  // X86 and x32 have 32 bit pointers.
113  if ((TT.isArch64Bit() &&
114  (TT.getEnvironment() == Triple::GNUX32 || TT.isOSNaCl())) ||
115  !TT.isArch64Bit())
116  Ret += "-p:32:32";
117 
118  // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32.
119  if (TT.isArch64Bit() || TT.isOSWindows() || TT.isOSNaCl())
120  Ret += "-i64:64";
121  else if (TT.isOSIAMCU())
122  Ret += "-i64:32-f64:32";
123  else
124  Ret += "-f64:32:64";
125 
126  // Some ABIs align long double to 128 bits, others to 32.
127  if (TT.isOSNaCl() || TT.isOSIAMCU())
128  ; // No f80
129  else if (TT.isArch64Bit() || TT.isOSDarwin())
130  Ret += "-f80:128";
131  else
132  Ret += "-f80:32";
133 
134  if (TT.isOSIAMCU())
135  Ret += "-f128:32";
136 
137  // The registers can hold 8, 16, 32 or, in x86-64, 64 bits.
138  if (TT.isArch64Bit())
139  Ret += "-n8:16:32:64";
140  else
141  Ret += "-n8:16:32";
142 
143  // The stack is aligned to 32 bits on some ABIs and 128 bits on others.
144  if ((!TT.isArch64Bit() && TT.isOSWindows()) || TT.isOSIAMCU())
145  Ret += "-a:0:32-S32";
146  else
147  Ret += "-S128";
148 
149  return Ret;
150 }
151 
153  bool JIT,
155  bool is64Bit = TT.getArch() == Triple::x86_64;
156  if (!RM.hasValue()) {
157  // JIT codegen should use static relocations by default, since it's
158  // typically executed in process and not relocatable.
159  if (JIT)
160  return Reloc::Static;
161 
162  // Darwin defaults to PIC in 64 bit mode and dynamic-no-pic in 32 bit mode.
163  // Win64 requires rip-rel addressing, thus we force it to PIC. Otherwise we
164  // use static relocation model by default.
165  if (TT.isOSDarwin()) {
166  if (is64Bit)
167  return Reloc::PIC_;
168  return Reloc::DynamicNoPIC;
169  }
170  if (TT.isOSWindows() && is64Bit)
171  return Reloc::PIC_;
172  return Reloc::Static;
173  }
174 
175  // ELF and X86-64 don't have a distinct DynamicNoPIC model. DynamicNoPIC
176  // is defined as a model for code which may be used in static or dynamic
177  // executables but not necessarily a shared library. On X86-32 we just
178  // compile in -static mode, in x86-64 we use PIC.
179  if (*RM == Reloc::DynamicNoPIC) {
180  if (is64Bit)
181  return Reloc::PIC_;
182  if (!TT.isOSDarwin())
183  return Reloc::Static;
184  }
185 
186  // If we are on Darwin, disallow static relocation model in X86-64 mode, since
187  // the Mach-O file format doesn't support it.
188  if (*RM == Reloc::Static && TT.isOSDarwin() && is64Bit)
189  return Reloc::PIC_;
190 
191  return *RM;
192 }
193 
195  bool JIT, bool Is64Bit) {
196  if (CM) {
197  if (*CM == CodeModel::Tiny)
198  report_fatal_error("Target does not support the tiny CodeModel");
199  return *CM;
200  }
201  if (JIT)
202  return Is64Bit ? CodeModel::Large : CodeModel::Small;
203  return CodeModel::Small;
204 }
205 
206 /// Create an X86 target.
207 ///
209  StringRef CPU, StringRef FS,
210  const TargetOptions &Options,
213  CodeGenOpt::Level OL, bool JIT)
215  T, computeDataLayout(TT), TT, CPU, FS, Options,
216  getEffectiveRelocModel(TT, JIT, RM),
217  getEffectiveX86CodeModel(CM, JIT, TT.getArch() == Triple::x86_64),
218  OL),
219  TLOF(createTLOF(getTargetTriple())) {
220  // Windows stack unwinder gets confused when execution flow "falls through"
221  // after a call to 'noreturn' function.
222  // To prevent that, we emit a trap for 'unreachable' IR instructions.
223  // (which on X86, happens to be the 'ud2' instruction)
224  // On PS4, the "return address" of a 'noreturn' call must still be within
225  // the calling function, and TrapUnreachable is an easy way to get that.
226  // The check here for 64-bit windows is a bit icky, but as we're unlikely
227  // to ever want to mix 32 and 64-bit windows code in a single module
228  // this should be fine.
229  if ((TT.isOSWindows() && TT.getArch() == Triple::x86_64) || TT.isPS4() ||
230  TT.isOSBinFormatMachO()) {
231  this->Options.TrapUnreachable = true;
232  this->Options.NoTrapAfterNoreturn = TT.isOSBinFormatMachO();
233  }
234 
235  // Outlining is available for x86-64.
236  if (TT.getArch() == Triple::x86_64)
237  setMachineOutliner(true);
238 
239  initAsmInfo();
240 }
241 
243 
244 const X86Subtarget *
246  Attribute CPUAttr = F.getFnAttribute("target-cpu");
247  Attribute FSAttr = F.getFnAttribute("target-features");
248 
249  StringRef CPU = !CPUAttr.hasAttribute(Attribute::None)
250  ? CPUAttr.getValueAsString()
251  : (StringRef)TargetCPU;
253  ? FSAttr.getValueAsString()
254  : (StringRef)TargetFS;
255 
257  Key.reserve(CPU.size() + FS.size());
258  Key += CPU;
259  Key += FS;
260 
261  // FIXME: This is related to the code below to reset the target options,
262  // we need to know whether or not the soft float flag is set on the
263  // function before we can generate a subtarget. We also need to use
264  // it as a key for the subtarget since that can be the only difference
265  // between two functions.
266  bool SoftFloat =
267  F.getFnAttribute("use-soft-float").getValueAsString() == "true";
268  // If the soft float attribute is set on the function turn on the soft float
269  // subtarget feature.
270  if (SoftFloat)
271  Key += FS.empty() ? "+soft-float" : ",+soft-float";
272 
273  // Keep track of the key width after all features are added so we can extract
274  // the feature string out later.
275  unsigned CPUFSWidth = Key.size();
276 
277  // Extract prefer-vector-width attribute.
278  unsigned PreferVectorWidthOverride = 0;
279  if (F.hasFnAttribute("prefer-vector-width")) {
280  StringRef Val = F.getFnAttribute("prefer-vector-width").getValueAsString();
281  unsigned Width;
282  if (!Val.getAsInteger(0, Width)) {
283  Key += ",prefer-vector-width=";
284  Key += Val;
285  PreferVectorWidthOverride = Width;
286  }
287  }
288 
289  // Extract min-legal-vector-width attribute.
290  unsigned RequiredVectorWidth = UINT32_MAX;
291  if (F.hasFnAttribute("min-legal-vector-width")) {
292  StringRef Val =
293  F.getFnAttribute("min-legal-vector-width").getValueAsString();
294  unsigned Width;
295  if (!Val.getAsInteger(0, Width)) {
296  Key += ",min-legal-vector-width=";
297  Key += Val;
298  RequiredVectorWidth = Width;
299  }
300  }
301 
302  // Extracted here so that we make sure there is backing for the StringRef. If
303  // we assigned earlier, its possible the SmallString reallocated leaving a
304  // dangling StringRef.
305  FS = Key.slice(CPU.size(), CPUFSWidth);
306 
307  auto &I = SubtargetMap[Key];
308  if (!I) {
309  // This needs to be done before we create a new subtarget since any
310  // creation will depend on the TM and the code generation flags on the
311  // function that reside in TargetOptions.
313  I = llvm::make_unique<X86Subtarget>(TargetTriple, CPU, FS, *this,
315  PreferVectorWidthOverride,
316  RequiredVectorWidth);
317  }
318  return I.get();
319 }
320 
321 //===----------------------------------------------------------------------===//
322 // Command line options for x86
323 //===----------------------------------------------------------------------===//
324 static cl::opt<bool>
325 UseVZeroUpper("x86-use-vzeroupper", cl::Hidden,
326  cl::desc("Minimize AVX to SSE transition penalty"),
327  cl::init(true));
328 
329 //===----------------------------------------------------------------------===//
330 // X86 TTI query.
331 //===----------------------------------------------------------------------===//
332 
335  return TargetTransformInfo(X86TTIImpl(this, F));
336 }
337 
338 //===----------------------------------------------------------------------===//
339 // Pass Pipeline Configuration
340 //===----------------------------------------------------------------------===//
341 
342 namespace {
343 
344 /// X86 Code Generator Pass Configuration Options.
345 class X86PassConfig : public TargetPassConfig {
346 public:
347  X86PassConfig(X86TargetMachine &TM, PassManagerBase &PM)
348  : TargetPassConfig(TM, PM) {}
349 
350  X86TargetMachine &getX86TargetMachine() const {
351  return getTM<X86TargetMachine>();
352  }
353 
355  createMachineScheduler(MachineSchedContext *C) const override {
358  return DAG;
359  }
360 
361  void addIRPasses() override;
362  bool addInstSelector() override;
363  bool addIRTranslator() override;
364  bool addLegalizeMachineIR() override;
365  bool addRegBankSelect() override;
366  bool addGlobalInstructionSelect() override;
367  bool addILPOpts() override;
368  bool addPreISel() override;
369  void addMachineSSAOptimization() override;
370  void addPreRegAlloc() override;
371  void addPostRegAlloc() override;
372  void addPreEmitPass() override;
373  void addPreEmitPass2() override;
374  void addPreSched2() override;
375 };
376 
377 class X86ExecutionDomainFix : public ExecutionDomainFix {
378 public:
379  static char ID;
380  X86ExecutionDomainFix() : ExecutionDomainFix(ID, X86::VR128XRegClass) {}
381  StringRef getPassName() const override {
382  return "X86 Execution Dependency Fix";
383  }
384 };
386 
387 } // end anonymous namespace
388 
389 INITIALIZE_PASS_BEGIN(X86ExecutionDomainFix, "x86-execution-domain-fix",
390  "X86 Execution Domain Fix", false, false)
392 INITIALIZE_PASS_END(X86ExecutionDomainFix, "x86-execution-domain-fix",
393  "X86 Execution Domain Fix", false, false)
394 
396  return new X86PassConfig(*this, PM);
397 }
398 
399 void X86PassConfig::addIRPasses() {
400  addPass(createAtomicExpandPass());
401 
403 
404  if (TM->getOptLevel() != CodeGenOpt::None)
405  addPass(createInterleavedAccessPass());
406 
407  // Add passes that handle indirect branch removal and insertion of a retpoline
408  // thunk. These will be a no-op unless a function subtarget has the retpoline
409  // feature enabled.
410  addPass(createIndirectBrExpandPass());
411 }
412 
413 bool X86PassConfig::addInstSelector() {
414  // Install an instruction selector.
415  addPass(createX86ISelDag(getX86TargetMachine(), getOptLevel()));
416 
417  // For ELF, cleanup any local-dynamic TLS accesses.
418  if (TM->getTargetTriple().isOSBinFormatELF() &&
421 
422  addPass(createX86GlobalBaseRegPass());
423  return false;
424 }
425 
426 bool X86PassConfig::addIRTranslator() {
427  addPass(new IRTranslator());
428  return false;
429 }
430 
431 bool X86PassConfig::addLegalizeMachineIR() {
432  addPass(new Legalizer());
433  return false;
434 }
435 
436 bool X86PassConfig::addRegBankSelect() {
437  addPass(new RegBankSelect());
438  return false;
439 }
440 
441 bool X86PassConfig::addGlobalInstructionSelect() {
442  addPass(new InstructionSelect());
443  return false;
444 }
445 
446 bool X86PassConfig::addILPOpts() {
448  addPass(createX86CondBrFolding());
449  addPass(&EarlyIfConverterID);
451  addPass(&MachineCombinerID);
452  addPass(createX86CmovConverterPass());
453  return true;
454 }
455 
456 bool X86PassConfig::addPreISel() {
457  // Only add this pass for 32-bit x86 Windows.
458  const Triple &TT = TM->getTargetTriple();
459  if (TT.isOSWindows() && TT.getArch() == Triple::x86)
460  addPass(createX86WinEHStatePass());
461  return true;
462 }
463 
464 void X86PassConfig::addPreRegAlloc() {
465  if (getOptLevel() != CodeGenOpt::None) {
466  addPass(&LiveRangeShrinkID);
467  addPass(createX86FixupSetCC());
468  addPass(createX86OptimizeLEAs());
471  }
472 
475  addPass(createX86WinAllocaExpander());
476 }
477 void X86PassConfig::addMachineSSAOptimization() {
480 }
481 
482 void X86PassConfig::addPostRegAlloc() {
484 }
485 
486 void X86PassConfig::addPreSched2() { addPass(createX86ExpandPseudoPass()); }
487 
488 void X86PassConfig::addPreEmitPass() {
489  if (getOptLevel() != CodeGenOpt::None) {
490  addPass(new X86ExecutionDomainFix());
491  addPass(createBreakFalseDeps());
492  }
493 
494  addPass(createShadowCallStackPass());
496 
497  if (UseVZeroUpper)
498  addPass(createX86IssueVZeroUpperPass());
499 
500  if (getOptLevel() != CodeGenOpt::None) {
501  addPass(createX86FixupBWInsts());
502  addPass(createX86PadShortFunctions());
503  addPass(createX86FixupLEAs());
504  addPass(createX86EvexToVexInsts());
505  }
507  addPass(createX86InsertPrefetchPass());
508 }
509 
510 void X86PassConfig::addPreEmitPass2() {
511  addPass(createX86RetpolineThunksPass());
512  // Verify basic block incoming and outgoing cfa offset and register values and
513  // correct CFA calculation rule where needed by inserting appropriate CFI
514  // instructions.
515  const Triple &TT = TM->getTargetTriple();
516  const MCAsmInfo *MAI = TM->getMCAsmInfo();
517  if (!TT.isOSDarwin() &&
518  (!TT.isOSWindows() ||
520  addPass(createCFIInstrInserter());
521 }
uint64_t CallInst * C
bool isOSDarwin() const
isOSDarwin - Is this a "Darwin" OS (OS X, iOS, or watchOS).
Definition: Triple.h:475
char & MachineCombinerID
This pass performs instruction combining using trace metrics to estimate critical-path and resource d...
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
static std::unique_ptr< TargetLoweringObjectFile > createTLOF(const Triple &TT)
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
void LLVMInitializeX86Target()
static cl::opt< bool > EnableMachineCombinerPass("x86-machine-combiner", cl::desc("Enable the machine combiner pass"), cl::init(true), cl::Hidden)
FunctionPass * createX86OptimizeLEAs()
Return a pass that removes redundant LEA instructions and redundant address recalculations.
FunctionPass * createX86FixupBWInsts()
Return a Machine IR pass that selectively replaces certain byte and word instructions by equivalent 3...
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:140
This class represents lattice values for constants.
Definition: AllocatorList.h:24
virtual void addIRPasses()
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
void initializeFixupBWInstPassPass(PassRegistry &)
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition: Triple.h:604
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with...
Definition: TargetMachine.h:78
FunctionPass * createX86FixupSetCC()
Return a pass that transforms setcc + movzx pairs into xor + setcc.
This file a TargetTransformInfo::Concept conforming object specific to the X86 target machine...
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE size_t size() const
size - Get the string size.
Definition: StringRef.h:138
static std::string computeDataLayout(const Triple &TT)
bool isOSNaCl() const
Tests whether the OS is NaCl (Native Client)
Definition: Triple.h:572
char & EarlyIfConverterID
EarlyIfConverter - This pass performs if-conversion on SSA form by inserting cmov instructions...
std::unique_ptr< ScheduleDAGMutation > createX86MacroFusionDAGMutation()
Note that you have to add: DAG.addMutation(createX86MacroFusionDAGMutation()); to X86PassConfig::crea...
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition: Function.h:321
FunctionPass * createX86CallFrameOptimization()
Return a pass that optimizes the code-size of x86 call sequences.
void initializeX86CallFrameOptimizationPass(PassRegistry &)
F(f)
FunctionPass * createX86IssueVZeroUpperPass()
This pass inserts AVX vzeroupper instructions before each call to avoid transition penalty between fu...
bool isOSFuchsia() const
Definition: Triple.h:495
FunctionPass * createX86EvexToVexInsts()
This pass replaces EVEX encoded of AVX-512 instructiosn by VEX encoding when possible in order to red...
void reserve(size_type N)
Definition: SmallVector.h:376
virtual void addMachineSSAOptimization()
addMachineSSAOptimization - Add standard passes that optimize machine instructions in SSA form...
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for &#39;unreachable&#39; IR instructions behind noreturn calls, even if TrapUnreachable is true.
FunctionPass * createShadowCallStackPass()
This pass instruments the function prolog to save the return address to a &#39;shadow call stack&#39; and the...
static const char * getManglingComponent(const Triple &T)
Definition: DataLayout.cpp:157
FunctionPass * createX86DomainReassignmentPass()
Return a Machine IR pass that reassigns instruction chains from one domain to another, when profitable.
void initializeX86CmovConverterPassPass(PassRegistry &)
ScheduleDAGMILive is an implementation of ScheduleDAGInstrs that schedules machine instructions while...
This class provides the reaching def analysis.
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:51
void resetTargetOptions(const Function &F) const
Reset the target options based on the function&#39;s attributes.
FunctionPass * createX86PadShortFunctions()
Return a pass that pads short functions with NOOPs.
This file contains the simple types necessary to represent the attributes associated with functions a...
No attributes have been set.
Definition: Attributes.h:72
bool isOSSolaris() const
Definition: Triple.h:501
Target-Independent Code Generator Pass Configuration Options.
void initializeX86AvoidSFBPassPass(PassRegistry &)
Key
PAL metadata keys.
static cl::opt< bool > EnableCondBrFoldingPass("x86-condbr-folding", cl::desc("Enable the conditional branch " "folding pass"), cl::init(false), cl::Hidden)
StringRef slice(size_t Start, size_t End) const
Return a reference to the substring from [Start, End).
Definition: SmallString.h:260
RegisterTargetMachine - Helper template for registering a target machine implementation, for use in the target machine initialization function.
void initializeX86CondBrFoldingPassPass(PassRegistry &)
ArchType getArch() const
getArch - Get the parsed architecture type of this triple.
Definition: Triple.h:290
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
void initializeEvexToVexInstPassPass(PassRegistry &)
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:133
FunctionPass * createX86FixupLEAs()
Return a pass that selectively replaces certain instructions (like add, sub, inc, dec...
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
INITIALIZE_PASS_BEGIN(X86ExecutionDomainFix, "x86-execution-domain-fix", "X86 Execution Domain Fix", false, false) INITIALIZE_PASS_END(X86ExecutionDomainFix
ScheduleDAGMILive * createGenericSchedLive(MachineSchedContext *C)
Create the standard converging machine scheduler.
bool isPS4() const
Tests whether the target is the PS4 platform.
Definition: Triple.h:631
speculative execution
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
bool isOSWindows() const
Tests whether the OS is Windows.
Definition: Triple.h:567
char & LiveRangeShrinkID
LiveRangeShrink pass.
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:423
bool hasAttribute(AttrKind Val) const
Return true if the attribute is present.
Definition: Attributes.cpp:202
CodeGenOpt::Level getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
void initializeX86ExecutionDomainFixPass(PassRegistry &)
static Reloc::Model getEffectiveRelocModel(Optional< Reloc::Model > RM)
This pass implements the reg bank selector pass used in the GlobalISel pipeline.
Definition: RegBankSelect.h:91
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition: Triple.h:609
FunctionPass * createX86ExpandPseudoPass()
Return a Machine IR pass that expands X86-specific pseudo instructions into a sequence of actual inst...
FunctionPass * createX86GlobalBaseRegPass()
This pass initializes a global base register for PIC on x86-32.
static bool is64Bit(const char *name)
FunctionPass * createInterleavedAccessPass()
InterleavedAccess Pass - This pass identifies and matches interleaved memory accesses to target speci...
FunctionPass * createBreakFalseDeps()
Creates Break False Dependencies pass.
const X86Subtarget * getSubtargetImpl() const =delete
void initializeFixupLEAPassPass(PassRegistry &)
This class describes a target machine that is implemented with the LLVM target-independent code gener...
void setMachineOutliner(bool Enable)
x86 execution domain fix
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
Definition: Triple.h:614
static CodeModel::Model getEffectiveX86CodeModel(Optional< CodeModel::Model > CM, bool JIT, bool Is64Bit)
size_t size() const
Definition: SmallVector.h:53
INITIALIZE_PASS_END(RegBankSelect, DEBUG_TYPE, "Assign register bank of generic virtual registers", false, false) RegBankSelect
~X86TargetMachine() override
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
TargetTransformInfo getTargetTransformInfo(const Function &F) override
Get a TargetTransformInfo implementation for the target.
void initializeX86DomainReassignmentPass(PassRegistry &)
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
FunctionPass * createIndirectBrExpandPass()
std::enable_if< std::numeric_limits< T >::is_signed, bool >::type getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition: StringRef.h:497
bool isOSIAMCU() const
Definition: Triple.h:505
FunctionPass * createX86CmovConverterPass()
This pass converts X86 cmov instructions into branch when profitable.
FunctionPass * createX86IndirectBranchTrackingPass()
This pass inserts ENDBR instructions before indirect jump/call destinations as part of CET IBT mechan...
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
void initializeX86SpeculativeLoadHardeningPassPass(PassRegistry &)
bool isOSLinux() const
Tests whether the OS is Linux.
Definition: Triple.h:577
EnvironmentType getEnvironment() const
getEnvironment - Get the parsed environment type of this triple.
Definition: Triple.h:308
FunctionPass * createX86FlagsCopyLoweringPass()
Return a pass that lowers EFLAGS copy pseudo instructions.
x86 execution domain X86 Execution Domain Fix
unsigned StackAlignmentOverride
StackAlignmentOverride - Override default stack alignment for target.
FunctionPass * createX86SpeculativeLoadHardeningPass()
bool isOSFreeBSD() const
Definition: Triple.h:491
This pass is responsible for selecting generic machine instructions to target-specific instructions...
FunctionPass * createX86FloatingPointStackifierPass()
This function returns a pass which converts floating-point register references and pseudo instruction...
Target - Wrapper for Target specific information.
This file describes how to lower LLVM calls to machine code calls.
std::string TargetCPU
Definition: TargetMachine.h:79
static cl::opt< bool > UseVZeroUpper("x86-use-vzeroupper", cl::Hidden, cl::desc("Minimize AVX to SSE transition penalty"), cl::init(true))
FunctionPass * createX86WinAllocaExpander()
Return a pass that expands WinAlloca pseudo-instructions.
A ScheduleDAG for scheduling lists of MachineInstr.
bool hasValue() const
Definition: Optional.h:165
X86TargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Optional< Reloc::Model > RM, Optional< CodeModel::Model > CM, CodeGenOpt::Level OL, bool JIT)
Create an X86 target.
FunctionPass * createX86InsertPrefetchPass()
This pass applies profiling information to insert cache prefetches.
StringRef getValueAsString() const
Return the attribute&#39;s value as a string.
Definition: Attributes.cpp:195
void initializeX86FlagsCopyLoweringPassPass(PassRegistry &)
bool isArch64Bit() const
Test whether the architecture is 64-bit.
Definition: Triple.cpp:1269
FunctionPass * createX86ISelDag(X86TargetMachine &TM, CodeGenOpt::Level OptLevel)
This pass converts a legalized DAG into a X86-specific DAG, ready for instruction scheduling...
TargetOptions Options
Definition: TargetMachine.h:97
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...
#define I(x, y, z)
Definition: MD5.cpp:58
void initializeShadowCallStackPass(PassRegistry &)
Target & getTheX86_32Target()
FunctionPass * createX86CondBrFolding()
Return a pass that folds conditional branch jumps.
std::string TargetFS
Definition: TargetMachine.h:80
FunctionPass * createX86RetpolineThunksPass()
This pass creates the thunks for the retpoline feature.
void initializeWinEHStatePassPass(PassRegistry &)
This file declares the IRTranslator pass.
FunctionPass * createX86AvoidStoreForwardingBlocks()
Return a pass that avoids creating store forward block issues in the hardware.
This file describes how to lower LLVM calls to machine code calls.
This file declares the targeting of the Machinelegalizer class for X86.
ExceptionHandling getExceptionHandlingType() const
Definition: MCAsmInfo.h:570
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
Definition: Function.h:331
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
Definition: PassRegistry.h:39
unsigned TrapUnreachable
Emit target-specific trap instruction for &#39;unreachable&#39; IR instructions.
FunctionPass * createX86DiscriminateMemOpsPass()
This pass ensures instructions featuring a memory operand have distinctive <LineNumber, Discriminator> (with respect to eachother)
This pass exposes codegen information to IR-level passes.
No exception support.
FunctionPass * createX86WinEHStatePass()
Return an IR pass that inserts EH registration stack objects and explicit EH state updates...
FunctionPass * createAtomicExpandPass()
Target & getTheX86_64Target()
FunctionPass * createCleanupLocalDynamicTLSPass()
This pass combines multiple accesses to local-dynamic TLS variables so that the TLS base address for ...
FunctionPass * createCFIInstrInserter()
Creates CFI Instruction Inserter pass.
void initializeGlobalISel(PassRegistry &)
Initialize all passes linked into the GlobalISel library.
Definition: GlobalISel.cpp:19
void addMutation(std::unique_ptr< ScheduleDAGMutation > Mutation)
Add a postprocessing step to the DAG builder.