NVPTXTargetMachine.cpp revision 49683f3c961379fbc088871a5d6304950f1f1cbc
1a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey//===-- NVPTXTargetMachine.cpp - Define TargetMachine for NVPTX -----------===// 2a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey// 3a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey// The LLVM Compiler Infrastructure 4a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey// 5a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey// This file is distributed under the University of Illinois Open Source 6a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey// License. See LICENSE.TXT for details. 7a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey// 8a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey//===----------------------------------------------------------------------===// 9a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey// 10a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey// Top-level implementation for the NVPTX target. 11a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey// 12a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey//===----------------------------------------------------------------------===// 13a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 14a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "NVPTXTargetMachine.h" 15a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "NVPTX.h" 16a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "NVPTXSplitBBatBar.h" 17a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "NVPTXLowerAggrCopies.h" 18a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "MCTargetDesc/NVPTXMCAsmInfo.h" 19a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "NVPTXAllocaHoisting.h" 20a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/PassManager.h" 21a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Analysis/Passes.h" 221ad10ce731d1b54692d7d5ee32601e965f503fa4Jeff Sharkey#include "llvm/Analysis/Verifier.h" 23703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey#include "llvm/Assembly/PrintModulePass.h" 24a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/ADT/OwningPtr.h" 25a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/CodeGen/AsmPrinter.h" 26a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/CodeGen/MachineFunctionAnalysis.h" 27a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/CodeGen/MachineModuleInfo.h" 28a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/CodeGen/Passes.h" 29a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/MC/MCAsmInfo.h" 30a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/MC/MCInstrInfo.h" 31a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/MC/MCStreamer.h" 32a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/MC/MCSubtargetInfo.h" 33a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Support/TargetRegistry.h" 34703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey#include "llvm/Support/raw_ostream.h" 35a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Target/TargetData.h" 36a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Target/TargetInstrInfo.h" 3752b703c5d0c4cff72bafdec0e2229368d3cc20d0Jeff Sharkey#include "llvm/Target/TargetLowering.h" 38703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey#include "llvm/Target/TargetLoweringObjectFile.h" 3938648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey#include "llvm/Target/TargetMachine.h" 40a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Target/TargetOptions.h" 41a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Target/TargetRegisterInfo.h" 42a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Target/TargetSubtargetInfo.h" 43a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Transforms/Scalar.h" 44a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Support/CommandLine.h" 45250a1ebc4cf52edf4e55a594f05f4a351ee8e126Elliott Hughes#include "llvm/Support/Debug.h" 46a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Support/FormattedStream.h" 47a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey#include "llvm/Support/TargetRegistry.h" 48a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 49a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 50a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkeyusing namespace llvm; 51a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 52a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 53a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkeyextern "C" void LLVMInitializeNVPTXTarget() { 54a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey // Register the target. 55a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey RegisterTargetMachine<NVPTXTargetMachine32> X(TheNVPTXTarget32); 56a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey RegisterTargetMachine<NVPTXTargetMachine64> Y(TheNVPTXTarget64); 57a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 58a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey RegisterMCAsmInfo<NVPTXMCAsmInfo> A(TheNVPTXTarget32); 59a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey RegisterMCAsmInfo<NVPTXMCAsmInfo> B(TheNVPTXTarget64); 60a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 61a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey} 62a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 63a40a349c0107660bfb4004467550725a3ca3ec97Jeff SharkeyNVPTXTargetMachine::NVPTXTargetMachine(const Target &T, 64a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey StringRef TT, 65a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey StringRef CPU, 66a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey StringRef FS, 67a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey const TargetOptions& Options, 68a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey Reloc::Model RM, 69a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey CodeModel::Model CM, 70a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey CodeGenOpt::Level OL, 71a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey bool is64bit) 72a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), 73a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey Subtarget(TT, CPU, FS, is64bit), 74a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey DataLayout(Subtarget.getDataLayout()), 7538648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey InstrInfo(*this), TLInfo(*this), TSInfo(*this), FrameLowering(*this,is64bit) 7638648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey/*FrameInfo(TargetFrameInfo::StackGrowsUp, 8, 0)*/ { 7738648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey} 7838648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey 7938648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey 8038648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey 8138648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkeyvoid NVPTXTargetMachine32::anchor() {} 82703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey 83703bc3a83056a878a83e263b992fb5331b84535fJeff SharkeyNVPTXTargetMachine32::NVPTXTargetMachine32(const Target &T, StringRef TT, 84703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey StringRef CPU, StringRef FS, 85703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey const TargetOptions &Options, 86703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey Reloc::Model RM, CodeModel::Model CM, 87703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey CodeGenOpt::Level OL) 88703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey: NVPTXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) { 89a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey} 90a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 91a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkeyvoid NVPTXTargetMachine64::anchor() {} 92a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 93a40a349c0107660bfb4004467550725a3ca3ec97Jeff SharkeyNVPTXTargetMachine64::NVPTXTargetMachine64(const Target &T, StringRef TT, 94a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey StringRef CPU, StringRef FS, 95b0bb182a1b52b31ccf1ec5e0be82308ebb4857e2Jeff Sharkey const TargetOptions &Options, 96b0bb182a1b52b31ccf1ec5e0be82308ebb4857e2Jeff Sharkey Reloc::Model RM, CodeModel::Model CM, 97b0bb182a1b52b31ccf1ec5e0be82308ebb4857e2Jeff Sharkey CodeGenOpt::Level OL) 98b0bb182a1b52b31ccf1ec5e0be82308ebb4857e2Jeff Sharkey: NVPTXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) { 99a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey} 100703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey 10138648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey 10238648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkeynamespace llvm { 10338648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkeyclass NVPTXPassConfig : public TargetPassConfig { 10438648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkeypublic: 10538648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey NVPTXPassConfig(NVPTXTargetMachine *TM, PassManagerBase &PM) 10638648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey : TargetPassConfig(TM, PM) {} 107703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey 10838648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey NVPTXTargetMachine &getNVPTXTargetMachine() const { 10938648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey return getTM<NVPTXTargetMachine>(); 110703bc3a83056a878a83e263b992fb5331b84535fJeff Sharkey } 11138648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey 11238648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey virtual bool addInstSelector(); 11338648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey virtual bool addPreRegAlloc(); 11438648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey}; 11538648831a92295e9a11831e19e5a9dab4cbd939eJeff Sharkey} 116a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 117a40a349c0107660bfb4004467550725a3ca3ec97Jeff SharkeyTargetPassConfig *NVPTXTargetMachine::createPassConfig(PassManagerBase &PM) { 118a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey NVPTXPassConfig *PassConfig = new NVPTXPassConfig(this, PM); 119a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey return PassConfig; 120a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey} 121a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 122a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkeybool NVPTXPassConfig::addInstSelector() { 123a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey PM->add(createLowerAggrCopies()); 124a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey PM->add(createSplitBBatBarPass()); 125a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey PM->add(createAllocaHoisting()); 126a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey PM->add(createNVPTXISelDag(getNVPTXTargetMachine(), getOptLevel())); 127a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey PM->add(createVectorElementizePass(getNVPTXTargetMachine())); 128a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey return false; 129a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey} 130a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey 131a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkeybool NVPTXPassConfig::addPreRegAlloc() { 132a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey return false; 133a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey} 134a40a349c0107660bfb4004467550725a3ca3ec97Jeff Sharkey