1b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner//===-- X86TargetMachine.cpp - Define TargetMachine for the X86 -----------===//
20e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
70e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
90e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman//
10b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner// This file defines the X86 specific subclass of TargetMachine.
11b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner//
12b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner//===----------------------------------------------------------------------===//
13b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner
14b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner#include "X86TargetMachine.h"
155bcd95c57feb92b9036636d98157f1f11e432b6dChris Lattner#include "X86.h"
16d91d86f3a6d0c809d6ef1a4a75a3ed82a402af9cChris Lattner#include "llvm/CodeGen/Passes.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/PassManager.h"
183bde6fe0df05558b89e7edfe48ac05da59beb81aBruno Cardoso Lopes#include "llvm/Support/CommandLine.h"
1971847813bc419f7a0667468136a07429c6d9f164David Greene#include "llvm/Support/FormattedStream.h"
203e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h"
221e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattnerusing namespace llvm;
23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
24e310b3a2a32d356f3f890fb138b1694b53d15f4eNAKAMURA Takumiextern "C" void LLVMInitializeX86Target() {
250c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  // Register the target.
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  RegisterTargetMachine<X86TargetMachine> X(TheX86_32Target);
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  RegisterTargetMachine<X86TargetMachine> Y(TheX86_64Target);
28fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey}
2925ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid X86TargetMachine::anchor() { }
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3211348ee263c37feed8f7695f631598ee112d2b44Chris Lattner/// X86TargetMachine ctor - Create an X86 target.
33b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner///
34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesX86TargetMachine::X86TargetMachine(const Target &T, StringRef TT, StringRef CPU,
35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                   StringRef FS, const TargetOptions &Options,
3634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                   Reloc::Model RM, CodeModel::Model CM,
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                   CodeGenOpt::Level OL)
38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
39cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Subtarget(TT, CPU, FS, *this, Options.StackAlignmentOverride) {
4011348ee263c37feed8f7695f631598ee112d2b44Chris Lattner  // Determine the PICStyle based on the target selected.
4111348ee263c37feed8f7695f631598ee112d2b44Chris Lattner  if (getRelocationModel() == Reloc::Static) {
4211348ee263c37feed8f7695f631598ee112d2b44Chris Lattner    // Unless we're in PIC or DynamicNoPIC mode, set the PIC style to None.
4311348ee263c37feed8f7695f631598ee112d2b44Chris Lattner    Subtarget.setPICStyle(PICStyles::None);
44699647cabcd98efd10b3bfb7cedc4d4b54f9b93dAnton Korobeynikov  } else if (Subtarget.is64Bit()) {
45699647cabcd98efd10b3bfb7cedc4d4b54f9b93dAnton Korobeynikov    // PIC in 64 bit mode is always rip-rel.
46699647cabcd98efd10b3bfb7cedc4d4b54f9b93dAnton Korobeynikov    Subtarget.setPICStyle(PICStyles::RIPRel);
47d5a2eb092580397dbf0b791a4e4530ad12acb795NAKAMURA Takumi  } else if (Subtarget.isTargetCOFF()) {
48e4df756289b6d80dcfd67b9f97fd464f62fd4902Chris Lattner    Subtarget.setPICStyle(PICStyles::None);
49e4df756289b6d80dcfd67b9f97fd464f62fd4902Chris Lattner  } else if (Subtarget.isTargetDarwin()) {
50699647cabcd98efd10b3bfb7cedc4d4b54f9b93dAnton Korobeynikov    if (getRelocationModel() == Reloc::PIC_)
518097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner      Subtarget.setPICStyle(PICStyles::StubPIC);
528097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner    else {
538097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner      assert(getRelocationModel() == Reloc::DynamicNoPIC);
548097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner      Subtarget.setPICStyle(PICStyles::StubDynamicNoPIC);
558097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner    }
567c1c261272b43f2a9397c3052819b92c53918075Anton Korobeynikov  } else if (Subtarget.isTargetELF()) {
57699647cabcd98efd10b3bfb7cedc4d4b54f9b93dAnton Korobeynikov    Subtarget.setPICStyle(PICStyles::GOT);
587c1c261272b43f2a9397c3052819b92c53918075Anton Korobeynikov  }
59699647cabcd98efd10b3bfb7cedc4d4b54f9b93dAnton Korobeynikov
60ef41ff618f2537539b538e6c7bf471c753391f92Evan Cheng  // default to hard float ABI
618a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  if (Options.FloatABIType == FloatABI::Default)
628247e0dca6759d9a22ac4c5cf305fac052b285acAndrew Trick    this->Options.FloatABIType = FloatABI::Hard;
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Windows stack unwinder gets confused when execution flow "falls through"
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // after a call to 'noreturn' function.
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // To prevent that, we emit a trap for 'unreachable' IR instructions.
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // (which on X86, happens to be the 'ud2' instruction)
68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (Subtarget.isTargetWin64())
69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    this->Options.TrapUnreachable = true;
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  initAsmInfo();
724efab056e16595b4062e85ee2619b7f6e0430964Chris Lattner}
73b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner
741911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner//===----------------------------------------------------------------------===//
753bde6fe0df05558b89e7edfe48ac05da59beb81aBruno Cardoso Lopes// Command line options for x86
763bde6fe0df05558b89e7edfe48ac05da59beb81aBruno Cardoso Lopes//===----------------------------------------------------------------------===//
77c53479d9c243e3331f8153840a5d1cc72b62f649Benjamin Kramerstatic cl::opt<bool>
78fe16848601bdde6e3a5e0860199169dd171222a4Nadav RotemUseVZeroUpper("x86-use-vzeroupper", cl::Hidden,
793bde6fe0df05558b89e7edfe48ac05da59beb81aBruno Cardoso Lopes  cl::desc("Minimize AVX to SSE transition penalty"),
80d224c7879ae71979e8b9675b38e9a16310560dc3Eli Friedman  cl::init(true));
813bde6fe0df05558b89e7edfe48ac05da59beb81aBruno Cardoso Lopes
823bde6fe0df05558b89e7edfe48ac05da59beb81aBruno Cardoso Lopes//===----------------------------------------------------------------------===//
83aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth// X86 Analysis Pass Setup
84aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth//===----------------------------------------------------------------------===//
85aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth
86aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruthvoid X86TargetMachine::addAnalysisPasses(PassManagerBase &PM) {
87aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth  // Add first the target-independent BasicTTI pass, then our X86 pass. This
88aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth  // allows the X86 pass to delegate to the target independent layer when
89aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth  // appropriate.
90ea44281d5da5096de50ce1cb358ff0c6f20e1a2aBill Wendling  PM.add(createBasicTargetTransformInfoPass(this));
91aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth  PM.add(createX86TargetTransformInfoPass(this));
92aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth}
93aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth
94aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth
95aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth//===----------------------------------------------------------------------===//
961911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner// Pass Pipeline Configuration
971911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner//===----------------------------------------------------------------------===//
98c9bbfbc04e6e8c946851565c2c686c39297ced76Chris Lattner
99843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Tricknamespace {
100843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick/// X86 Code Generator Pass Configuration Options.
101843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickclass X86PassConfig : public TargetPassConfig {
102843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickpublic:
103061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  X86PassConfig(X86TargetMachine *TM, PassManagerBase &PM)
104061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick    : TargetPassConfig(TM, PM) {}
105843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick
106843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick  X86TargetMachine &getX86TargetMachine() const {
107843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick    return getTM<X86TargetMachine>();
108843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick  }
109843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick
110843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick  const X86Subtarget &getX86Subtarget() const {
111843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick    return *getX86TargetMachine().getSubtargetImpl();
112843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick  }
113843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick
114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  void addIRPasses() override;
11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool addInstSelector() override;
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool addILPOpts() override;
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool addPreRegAlloc() override;
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool addPostRegAlloc() override;
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool addPreEmitPass() override;
120843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick};
121843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick} // namespace
122843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick
123061efcfb3e79899493d857f49e50d09f29037e0aAndrew TrickTargetPassConfig *X86TargetMachine::createPassConfig(PassManagerBase &PM) {
12402c6325a4592fefebc837b677eaf87dc532ecb7cJakob Stoklund Olesen  return new X86PassConfig(this, PM);
125843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick}
126843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick
127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid X86PassConfig::addIRPasses() {
128cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  addPass(createX86AtomicExpandPass(&getX86TargetMachine()));
129cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
130cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  TargetPassConfig::addIRPasses();
131cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
132cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
133843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickbool X86PassConfig::addInstSelector() {
13473bfa7152481620d60bf63d5397dfe35bbc9c098Nate Begeman  // Install an instruction selector.
135564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson  addPass(createX86ISelDag(getX86TargetMachine(), getOptLevel()));
13671b7f646de0d9e74198534d4a7b6059e6031ed59Dan Gohman
137f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg  // For ELF, cleanup any local-dynamic TLS accesses.
138f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg  if (getX86Subtarget().isTargetELF() && getOptLevel() != CodeGenOpt::None)
139564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson    addPass(createCleanupLocalDynamicTLSPass());
140f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg
141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addPass(createX86GlobalBaseRegPass());
14284023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
1431911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  return false;
14402c6325a4592fefebc837b677eaf87dc532ecb7cJakob Stoklund Olesen}
14502c6325a4592fefebc837b677eaf87dc532ecb7cJakob Stoklund Olesen
14602c6325a4592fefebc837b677eaf87dc532ecb7cJakob Stoklund Olesenbool X86PassConfig::addILPOpts() {
147dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addPass(&EarlyIfConverterID);
148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return true;
149de3aa4f77f511ace5b9fc1e3a777b0c3ec5ffa27Brian Gaeke}
150de3aa4f77f511ace5b9fc1e3a777b0c3ec5ffa27Brian Gaeke
151843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickbool X86PassConfig::addPreRegAlloc() {
152856914fe0084278d11edec79c8b707a6276b8857Anton Korobeynikov  return false;  // -print-machineinstr shouldn't print after this.
153856914fe0084278d11edec79c8b707a6276b8857Anton Korobeynikov}
154856914fe0084278d11edec79c8b707a6276b8857Anton Korobeynikov
155843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickbool X86PassConfig::addPostRegAlloc() {
156564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson  addPass(createX86FloatingPointStackifierPass());
1571911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  return true;  // -print-machineinstr should print after this.
1581911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner}
159d91d86f3a6d0c809d6ef1a4a75a3ed82a402af9cChris Lattner
160843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickbool X86PassConfig::addPreEmitPass() {
16141a9635292a069934f0674faca744118d4d25c5aBruno Cardoso Lopes  bool ShouldPrint = false;
162843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick  if (getOptLevel() != CodeGenOpt::None && getX86Subtarget().hasSSE2()) {
163564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson    addPass(createExecutionDependencyFixPass(&X86::VR128RegClass));
1642713d045e3df9d4602f020088001cbc96ca680c3Craig Topper    ShouldPrint = true;
165352aa503faee6c58e9cdb5054cc5ec1d90c696b4Jakob Stoklund Olesen  }
1663bde6fe0df05558b89e7edfe48ac05da59beb81aBruno Cardoso Lopes
167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (UseVZeroUpper) {
168564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson    addPass(createX86IssueVZeroUpperPass());
16941a9635292a069934f0674faca744118d4d25c5aBruno Cardoso Lopes    ShouldPrint = true;
1703bde6fe0df05558b89e7edfe48ac05da59beb81aBruno Cardoso Lopes  }
17141a9635292a069934f0674faca744118d4d25c5aBruno Cardoso Lopes
172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (getOptLevel() != CodeGenOpt::None) {
173c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd    addPass(createX86PadShortFunctions());
174d6ac8e9a03d8fa7115079d86192bc4529e8281aaPreston Gurd    addPass(createX86FixupLEAs());
175d6ac8e9a03d8fa7115079d86192bc4529e8281aaPreston Gurd    ShouldPrint = true;
176d6ac8e9a03d8fa7115079d86192bc4529e8281aaPreston Gurd  }
177c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd
17841a9635292a069934f0674faca744118d4d25c5aBruno Cardoso Lopes  return ShouldPrint;
179352aa503faee6c58e9cdb5054cc5ec1d90c696b4Jakob Stoklund Olesen}
180352aa503faee6c58e9cdb5054cc5ec1d90c696b4Jakob Stoklund Olesen
18198a366d547772010e94609e4584489b3e5ce0043Bill Wendlingbool X86TargetMachine::addCodeEmitter(PassManagerBase &PM,
182434dd4fd94f5f248492c675e4285e7d67342d4c4Bruno Cardoso Lopes                                      JITCodeEmitter &JCE) {
183a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  PM.add(createX86JITCodeEmitterPass(*this, JCE));
184a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes
185a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  return false;
186a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes}
187