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