X86TargetMachine.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  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. #include "X86TargetMachine.h"
  13. #include "MCTargetDesc/X86MCTargetDesc.h"
  14. #include "TargetInfo/X86TargetInfo.h"
  15. #include "X86.h"
  16. #include "X86CallLowering.h"
  17. #include "X86LegalizerInfo.h"
  18. #include "X86MacroFusion.h"
  19. #include "X86Subtarget.h"
  20. #include "X86TargetObjectFile.h"
  21. #include "X86TargetTransformInfo.h"
  22. #include "llvm/ADT/Optional.h"
  23. #include "llvm/ADT/STLExtras.h"
  24. #include "llvm/ADT/SmallString.h"
  25. #include "llvm/ADT/StringRef.h"
  26. #include "llvm/ADT/Triple.h"
  27. #include "llvm/Analysis/TargetTransformInfo.h"
  28. #include "llvm/CodeGen/ExecutionDomainFix.h"
  29. #include "llvm/CodeGen/GlobalISel/CallLowering.h"
  30. #include "llvm/CodeGen/GlobalISel/IRTranslator.h"
  31. #include "llvm/CodeGen/GlobalISel/InstructionSelect.h"
  32. #include "llvm/CodeGen/GlobalISel/Legalizer.h"
  33. #include "llvm/CodeGen/GlobalISel/RegBankSelect.h"
  34. #include "llvm/CodeGen/MachineScheduler.h"
  35. #include "llvm/CodeGen/Passes.h"
  36. #include "llvm/CodeGen/TargetPassConfig.h"
  37. #include "llvm/IR/Attributes.h"
  38. #include "llvm/IR/DataLayout.h"
  39. #include "llvm/IR/Function.h"
  40. #include "llvm/MC/MCAsmInfo.h"
  41. #include "llvm/Pass.h"
  42. #include "llvm/Support/CodeGen.h"
  43. #include "llvm/Support/CommandLine.h"
  44. #include "llvm/Support/ErrorHandling.h"
  45. #include "llvm/Support/TargetRegistry.h"
  46. #include "llvm/Target/TargetLoweringObjectFile.h"
  47. #include "llvm/Target/TargetOptions.h"
  48. #include <memory>
  49. #include <string>
  50. using namespace llvm;
  51. static cl::opt<bool> EnableMachineCombinerPass("x86-machine-combiner",
  52. cl::desc("Enable the machine combiner pass"),
  53. cl::init(true), cl::Hidden);
  54. static cl::opt<bool> EnableCondBrFoldingPass("x86-condbr-folding",
  55. cl::desc("Enable the conditional branch "
  56. "folding pass"),
  57. cl::init(false), cl::Hidden);
  58. extern "C" void LLVMInitializeX86Target() {
  59. // Register the target.
  60. RegisterTargetMachine<X86TargetMachine> X(getTheX86_32Target());
  61. RegisterTargetMachine<X86TargetMachine> Y(getTheX86_64Target());
  62. PassRegistry &PR = *PassRegistry::getPassRegistry();
  63. initializeGlobalISel(PR);
  64. initializeWinEHStatePassPass(PR);
  65. initializeFixupBWInstPassPass(PR);
  66. initializeEvexToVexInstPassPass(PR);
  67. initializeFixupLEAPassPass(PR);
  68. initializeFPSPass(PR);
  69. initializeX86CallFrameOptimizationPass(PR);
  70. initializeX86CmovConverterPassPass(PR);
  71. initializeX86ExpandPseudoPass(PR);
  72. initializeX86ExecutionDomainFixPass(PR);
  73. initializeX86DomainReassignmentPass(PR);
  74. initializeX86AvoidSFBPassPass(PR);
  75. initializeX86SpeculativeLoadHardeningPassPass(PR);
  76. initializeX86FlagsCopyLoweringPassPass(PR);
  77. initializeX86CondBrFoldingPassPass(PR);
  78. initializeX86OptimizeLEAPassPass(PR);
  79. }
  80. static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
  81. if (TT.isOSBinFormatMachO()) {
  82. if (TT.getArch() == Triple::x86_64)
  83. return std::make_unique<X86_64MachoTargetObjectFile>();
  84. return std::make_unique<TargetLoweringObjectFileMachO>();
  85. }
  86. if (TT.isOSFreeBSD())
  87. return std::make_unique<X86FreeBSDTargetObjectFile>();
  88. if (TT.isOSLinux() || TT.isOSNaCl() || TT.isOSIAMCU())
  89. return std::make_unique<X86LinuxNaClTargetObjectFile>();
  90. if (TT.isOSSolaris())
  91. return std::make_unique<X86SolarisTargetObjectFile>();
  92. if (TT.isOSFuchsia())
  93. return std::make_unique<X86FuchsiaTargetObjectFile>();
  94. if (TT.isOSBinFormatELF())
  95. return std::make_unique<X86ELFTargetObjectFile>();
  96. if (TT.isOSBinFormatCOFF())
  97. return std::make_unique<TargetLoweringObjectFileCOFF>();
  98. llvm_unreachable("unknown subtarget type");
  99. }
  100. static std::string computeDataLayout(const Triple &TT) {
  101. // X86 is little endian
  102. std::string Ret = "e";
  103. Ret += DataLayout::getManglingComponent(TT);
  104. // X86 and x32 have 32 bit pointers.
  105. if ((TT.isArch64Bit() &&
  106. (TT.getEnvironment() == Triple::GNUX32 || TT.isOSNaCl())) ||
  107. !TT.isArch64Bit())
  108. Ret += "-p:32:32";
  109. // Address spaces for 32 bit signed, 32 bit unsigned, and 64 bit pointers.
  110. Ret += "-p270:32:32-p271:32:32-p272:64:64";
  111. // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32.
  112. if (TT.isArch64Bit() || TT.isOSWindows() || TT.isOSNaCl())
  113. Ret += "-i64:64";
  114. else if (TT.isOSIAMCU())
  115. Ret += "-i64:32-f64:32";
  116. else
  117. Ret += "-f64:32:64";
  118. // Some ABIs align long double to 128 bits, others to 32.
  119. if (TT.isOSNaCl() || TT.isOSIAMCU())
  120. ; // No f80
  121. else if (TT.isArch64Bit() || TT.isOSDarwin())
  122. Ret += "-f80:128";
  123. else
  124. Ret += "-f80:32";
  125. if (TT.isOSIAMCU())
  126. Ret += "-f128:32";
  127. // The registers can hold 8, 16, 32 or, in x86-64, 64 bits.
  128. if (TT.isArch64Bit())
  129. Ret += "-n8:16:32:64";
  130. else
  131. Ret += "-n8:16:32";
  132. // The stack is aligned to 32 bits on some ABIs and 128 bits on others.
  133. if ((!TT.isArch64Bit() && TT.isOSWindows()) || TT.isOSIAMCU())
  134. Ret += "-a:0:32-S32";
  135. else
  136. Ret += "-S128";
  137. return Ret;
  138. }
  139. static Reloc::Model getEffectiveRelocModel(const Triple &TT,
  140. bool JIT,
  141. Optional<Reloc::Model> RM) {
  142. bool is64Bit = TT.getArch() == Triple::x86_64;
  143. if (!RM.hasValue()) {
  144. // JIT codegen should use static relocations by default, since it's
  145. // typically executed in process and not relocatable.
  146. if (JIT)
  147. return Reloc::Static;
  148. // Darwin defaults to PIC in 64 bit mode and dynamic-no-pic in 32 bit mode.
  149. // Win64 requires rip-rel addressing, thus we force it to PIC. Otherwise we
  150. // use static relocation model by default.
  151. if (TT.isOSDarwin()) {
  152. if (is64Bit)
  153. return Reloc::PIC_;
  154. return Reloc::DynamicNoPIC;
  155. }
  156. if (TT.isOSWindows() && is64Bit)
  157. return Reloc::PIC_;
  158. return Reloc::Static;
  159. }
  160. // ELF and X86-64 don't have a distinct DynamicNoPIC model. DynamicNoPIC
  161. // is defined as a model for code which may be used in static or dynamic
  162. // executables but not necessarily a shared library. On X86-32 we just
  163. // compile in -static mode, in x86-64 we use PIC.
  164. if (*RM == Reloc::DynamicNoPIC) {
  165. if (is64Bit)
  166. return Reloc::PIC_;
  167. if (!TT.isOSDarwin())
  168. return Reloc::Static;
  169. }
  170. // If we are on Darwin, disallow static relocation model in X86-64 mode, since
  171. // the Mach-O file format doesn't support it.
  172. if (*RM == Reloc::Static && TT.isOSDarwin() && is64Bit)
  173. return Reloc::PIC_;
  174. return *RM;
  175. }
  176. static CodeModel::Model getEffectiveX86CodeModel(Optional<CodeModel::Model> CM,
  177. bool JIT, bool Is64Bit) {
  178. if (CM) {
  179. if (*CM == CodeModel::Tiny)
  180. report_fatal_error("Target does not support the tiny CodeModel", false);
  181. return *CM;
  182. }
  183. if (JIT)
  184. return Is64Bit ? CodeModel::Large : CodeModel::Small;
  185. return CodeModel::Small;
  186. }
  187. /// Create an X86 target.
  188. ///
  189. X86TargetMachine::X86TargetMachine(const Target &T, const Triple &TT,
  190. StringRef CPU, StringRef FS,
  191. const TargetOptions &Options,
  192. Optional<Reloc::Model> RM,
  193. Optional<CodeModel::Model> CM,
  194. CodeGenOpt::Level OL, bool JIT)
  195. : LLVMTargetMachine(
  196. T, computeDataLayout(TT), TT, CPU, FS, Options,
  197. getEffectiveRelocModel(TT, JIT, RM),
  198. getEffectiveX86CodeModel(CM, JIT, TT.getArch() == Triple::x86_64),
  199. OL),
  200. TLOF(createTLOF(getTargetTriple())) {
  201. // On PS4, the "return address" of a 'noreturn' call must still be within
  202. // the calling function, and TrapUnreachable is an easy way to get that.
  203. if (TT.isPS4() || TT.isOSBinFormatMachO()) {
  204. this->Options.TrapUnreachable = true;
  205. this->Options.NoTrapAfterNoreturn = TT.isOSBinFormatMachO();
  206. }
  207. // Outlining is available for x86-64.
  208. if (TT.getArch() == Triple::x86_64)
  209. setMachineOutliner(true);
  210. initAsmInfo();
  211. }
  212. X86TargetMachine::~X86TargetMachine() = default;
  213. const X86Subtarget *
  214. X86TargetMachine::getSubtargetImpl(const Function &F) const {
  215. Attribute CPUAttr = F.getFnAttribute("target-cpu");
  216. Attribute FSAttr = F.getFnAttribute("target-features");
  217. StringRef CPU = !CPUAttr.hasAttribute(Attribute::None)
  218. ? CPUAttr.getValueAsString()
  219. : (StringRef)TargetCPU;
  220. StringRef FS = !FSAttr.hasAttribute(Attribute::None)
  221. ? FSAttr.getValueAsString()
  222. : (StringRef)TargetFS;
  223. SmallString<512> Key;
  224. Key.reserve(CPU.size() + FS.size());
  225. Key += CPU;
  226. Key += FS;
  227. // FIXME: This is related to the code below to reset the target options,
  228. // we need to know whether or not the soft float flag is set on the
  229. // function before we can generate a subtarget. We also need to use
  230. // it as a key for the subtarget since that can be the only difference
  231. // between two functions.
  232. bool SoftFloat =
  233. F.getFnAttribute("use-soft-float").getValueAsString() == "true";
  234. // If the soft float attribute is set on the function turn on the soft float
  235. // subtarget feature.
  236. if (SoftFloat)
  237. Key += FS.empty() ? "+soft-float" : ",+soft-float";
  238. // Keep track of the key width after all features are added so we can extract
  239. // the feature string out later.
  240. unsigned CPUFSWidth = Key.size();
  241. // Extract prefer-vector-width attribute.
  242. unsigned PreferVectorWidthOverride = 0;
  243. if (F.hasFnAttribute("prefer-vector-width")) {
  244. StringRef Val = F.getFnAttribute("prefer-vector-width").getValueAsString();
  245. unsigned Width;
  246. if (!Val.getAsInteger(0, Width)) {
  247. Key += ",prefer-vector-width=";
  248. Key += Val;
  249. PreferVectorWidthOverride = Width;
  250. }
  251. }
  252. // Extract min-legal-vector-width attribute.
  253. unsigned RequiredVectorWidth = UINT32_MAX;
  254. if (F.hasFnAttribute("min-legal-vector-width")) {
  255. StringRef Val =
  256. F.getFnAttribute("min-legal-vector-width").getValueAsString();
  257. unsigned Width;
  258. if (!Val.getAsInteger(0, Width)) {
  259. Key += ",min-legal-vector-width=";
  260. Key += Val;
  261. RequiredVectorWidth = Width;
  262. }
  263. }
  264. // Extracted here so that we make sure there is backing for the StringRef. If
  265. // we assigned earlier, its possible the SmallString reallocated leaving a
  266. // dangling StringRef.
  267. FS = Key.slice(CPU.size(), CPUFSWidth);
  268. auto &I = SubtargetMap[Key];
  269. if (!I) {
  270. // This needs to be done before we create a new subtarget since any
  271. // creation will depend on the TM and the code generation flags on the
  272. // function that reside in TargetOptions.
  273. resetTargetOptions(F);
  274. I = std::make_unique<X86Subtarget>(TargetTriple, CPU, FS, *this,
  275. Options.StackAlignmentOverride,
  276. PreferVectorWidthOverride,
  277. RequiredVectorWidth);
  278. }
  279. return I.get();
  280. }
  281. //===----------------------------------------------------------------------===//
  282. // Command line options for x86
  283. //===----------------------------------------------------------------------===//
  284. static cl::opt<bool>
  285. UseVZeroUpper("x86-use-vzeroupper", cl::Hidden,
  286. cl::desc("Minimize AVX to SSE transition penalty"),
  287. cl::init(true));
  288. //===----------------------------------------------------------------------===//
  289. // X86 TTI query.
  290. //===----------------------------------------------------------------------===//
  291. TargetTransformInfo
  292. X86TargetMachine::getTargetTransformInfo(const Function &F) {
  293. return TargetTransformInfo(X86TTIImpl(this, F));
  294. }
  295. //===----------------------------------------------------------------------===//
  296. // Pass Pipeline Configuration
  297. //===----------------------------------------------------------------------===//
  298. namespace {
  299. /// X86 Code Generator Pass Configuration Options.
  300. class X86PassConfig : public TargetPassConfig {
  301. public:
  302. X86PassConfig(X86TargetMachine &TM, PassManagerBase &PM)
  303. : TargetPassConfig(TM, PM) {}
  304. X86TargetMachine &getX86TargetMachine() const {
  305. return getTM<X86TargetMachine>();
  306. }
  307. ScheduleDAGInstrs *
  308. createMachineScheduler(MachineSchedContext *C) const override {
  309. ScheduleDAGMILive *DAG = createGenericSchedLive(C);
  310. DAG->addMutation(createX86MacroFusionDAGMutation());
  311. return DAG;
  312. }
  313. ScheduleDAGInstrs *
  314. createPostMachineScheduler(MachineSchedContext *C) const override {
  315. ScheduleDAGMI *DAG = createGenericSchedPostRA(C);
  316. DAG->addMutation(createX86MacroFusionDAGMutation());
  317. return DAG;
  318. }
  319. void addIRPasses() override;
  320. bool addInstSelector() override;
  321. bool addIRTranslator() override;
  322. bool addLegalizeMachineIR() override;
  323. bool addRegBankSelect() override;
  324. bool addGlobalInstructionSelect() override;
  325. bool addILPOpts() override;
  326. bool addPreISel() override;
  327. void addMachineSSAOptimization() override;
  328. void addPreRegAlloc() override;
  329. void addPostRegAlloc() override;
  330. void addPreEmitPass() override;
  331. void addPreEmitPass2() override;
  332. void addPreSched2() override;
  333. std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
  334. };
  335. class X86ExecutionDomainFix : public ExecutionDomainFix {
  336. public:
  337. static char ID;
  338. X86ExecutionDomainFix() : ExecutionDomainFix(ID, X86::VR128XRegClass) {}
  339. StringRef getPassName() const override {
  340. return "X86 Execution Dependency Fix";
  341. }
  342. };
  343. char X86ExecutionDomainFix::ID;
  344. } // end anonymous namespace
  345. INITIALIZE_PASS_BEGIN(X86ExecutionDomainFix, "x86-execution-domain-fix",
  346. "X86 Execution Domain Fix", false, false)
  347. INITIALIZE_PASS_DEPENDENCY(ReachingDefAnalysis)
  348. INITIALIZE_PASS_END(X86ExecutionDomainFix, "x86-execution-domain-fix",
  349. "X86 Execution Domain Fix", false, false)
  350. TargetPassConfig *X86TargetMachine::createPassConfig(PassManagerBase &PM) {
  351. return new X86PassConfig(*this, PM);
  352. }
  353. void X86PassConfig::addIRPasses() {
  354. addPass(createAtomicExpandPass());
  355. TargetPassConfig::addIRPasses();
  356. if (TM->getOptLevel() != CodeGenOpt::None)
  357. addPass(createInterleavedAccessPass());
  358. // Add passes that handle indirect branch removal and insertion of a retpoline
  359. // thunk. These will be a no-op unless a function subtarget has the retpoline
  360. // feature enabled.
  361. addPass(createIndirectBrExpandPass());
  362. }
  363. bool X86PassConfig::addInstSelector() {
  364. // Install an instruction selector.
  365. addPass(createX86ISelDag(getX86TargetMachine(), getOptLevel()));
  366. // For ELF, cleanup any local-dynamic TLS accesses.
  367. if (TM->getTargetTriple().isOSBinFormatELF() &&
  368. getOptLevel() != CodeGenOpt::None)
  369. addPass(createCleanupLocalDynamicTLSPass());
  370. addPass(createX86GlobalBaseRegPass());
  371. return false;
  372. }
  373. bool X86PassConfig::addIRTranslator() {
  374. addPass(new IRTranslator());
  375. return false;
  376. }
  377. bool X86PassConfig::addLegalizeMachineIR() {
  378. addPass(new Legalizer());
  379. return false;
  380. }
  381. bool X86PassConfig::addRegBankSelect() {
  382. addPass(new RegBankSelect());
  383. return false;
  384. }
  385. bool X86PassConfig::addGlobalInstructionSelect() {
  386. addPass(new InstructionSelect());
  387. return false;
  388. }
  389. bool X86PassConfig::addILPOpts() {
  390. if (EnableCondBrFoldingPass)
  391. addPass(createX86CondBrFolding());
  392. addPass(&EarlyIfConverterID);
  393. if (EnableMachineCombinerPass)
  394. addPass(&MachineCombinerID);
  395. addPass(createX86CmovConverterPass());
  396. return true;
  397. }
  398. bool X86PassConfig::addPreISel() {
  399. // Only add this pass for 32-bit x86 Windows.
  400. const Triple &TT = TM->getTargetTriple();
  401. if (TT.isOSWindows() && TT.getArch() == Triple::x86)
  402. addPass(createX86WinEHStatePass());
  403. return true;
  404. }
  405. void X86PassConfig::addPreRegAlloc() {
  406. if (getOptLevel() != CodeGenOpt::None) {
  407. addPass(&LiveRangeShrinkID);
  408. addPass(createX86FixupSetCC());
  409. addPass(createX86OptimizeLEAs());
  410. addPass(createX86CallFrameOptimization());
  411. addPass(createX86AvoidStoreForwardingBlocks());
  412. }
  413. addPass(createX86SpeculativeLoadHardeningPass());
  414. addPass(createX86FlagsCopyLoweringPass());
  415. addPass(createX86WinAllocaExpander());
  416. }
  417. void X86PassConfig::addMachineSSAOptimization() {
  418. addPass(createX86DomainReassignmentPass());
  419. TargetPassConfig::addMachineSSAOptimization();
  420. }
  421. void X86PassConfig::addPostRegAlloc() {
  422. addPass(createX86FloatingPointStackifierPass());
  423. }
  424. void X86PassConfig::addPreSched2() { addPass(createX86ExpandPseudoPass()); }
  425. void X86PassConfig::addPreEmitPass() {
  426. if (getOptLevel() != CodeGenOpt::None) {
  427. addPass(new X86ExecutionDomainFix());
  428. addPass(createBreakFalseDeps());
  429. }
  430. addPass(createX86IndirectBranchTrackingPass());
  431. if (UseVZeroUpper)
  432. addPass(createX86IssueVZeroUpperPass());
  433. if (getOptLevel() != CodeGenOpt::None) {
  434. addPass(createX86FixupBWInsts());
  435. addPass(createX86PadShortFunctions());
  436. addPass(createX86FixupLEAs());
  437. addPass(createX86EvexToVexInsts());
  438. }
  439. addPass(createX86DiscriminateMemOpsPass());
  440. addPass(createX86InsertPrefetchPass());
  441. }
  442. void X86PassConfig::addPreEmitPass2() {
  443. const Triple &TT = TM->getTargetTriple();
  444. const MCAsmInfo *MAI = TM->getMCAsmInfo();
  445. addPass(createX86RetpolineThunksPass());
  446. // Insert extra int3 instructions after trailing call instructions to avoid
  447. // issues in the unwinder.
  448. if (TT.isOSWindows() && TT.getArch() == Triple::x86_64)
  449. addPass(createX86AvoidTrailingCallPass());
  450. // Verify basic block incoming and outgoing cfa offset and register values and
  451. // correct CFA calculation rule where needed by inserting appropriate CFI
  452. // instructions.
  453. if (!TT.isOSDarwin() &&
  454. (!TT.isOSWindows() ||
  455. MAI->getExceptionHandlingType() == ExceptionHandling::DwarfCFI))
  456. addPass(createCFIInstrInserter());
  457. }
  458. std::unique_ptr<CSEConfigBase> X86PassConfig::getCSEConfig() const {
  459. return getStandardCSEConfigForOpt(TM->getOptLevel());
  460. }