149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===-- NVPTXTargetMachine.cpp - Define TargetMachine for NVPTX -----------===// 249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// The LLVM Compiler Infrastructure 449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file is distributed under the University of Illinois Open Source 649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// License. See LICENSE.TXT for details. 749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===// 949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 1049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// Top-level implementation for the NVPTX target. 1149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 1249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===// 1349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 1449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXTargetMachine.h" 1549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTX.h" 1649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXSplitBBatBar.h" 1749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXLowerAggrCopies.h" 1849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "MCTargetDesc/NVPTXMCAsmInfo.h" 1949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXAllocaHoisting.h" 2049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/PassManager.h" 2149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Analysis/Passes.h" 2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Analysis/Verifier.h" 2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Assembly/PrintModulePass.h" 2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/ADT/OwningPtr.h" 2549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/CodeGen/AsmPrinter.h" 2649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/CodeGen/MachineFunctionAnalysis.h" 2749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/CodeGen/MachineModuleInfo.h" 2849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/CodeGen/Passes.h" 2949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/MC/MCAsmInfo.h" 3049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/MC/MCInstrInfo.h" 3149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/MC/MCStreamer.h" 3249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/MC/MCSubtargetInfo.h" 3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/TargetRegistry.h" 3449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/raw_ostream.h" 3549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetData.h" 3649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetInstrInfo.h" 3749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetLowering.h" 3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetLoweringObjectFile.h" 3949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetMachine.h" 4049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetOptions.h" 4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetRegisterInfo.h" 4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetSubtargetInfo.h" 4349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Transforms/Scalar.h" 4449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/CommandLine.h" 4549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/Debug.h" 4649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/FormattedStream.h" 4749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/TargetRegistry.h" 4849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 4949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 5049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiusing namespace llvm; 5149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 5249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiextern "C" void LLVMInitializeNVPTXTarget() { 5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski // Register the target. 5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski RegisterTargetMachine<NVPTXTargetMachine32> X(TheNVPTXTarget32); 5649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski RegisterTargetMachine<NVPTXTargetMachine64> Y(TheNVPTXTarget64); 5749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 5849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski RegisterMCAsmInfo<NVPTXMCAsmInfo> A(TheNVPTXTarget32); 5949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski RegisterMCAsmInfo<NVPTXMCAsmInfo> B(TheNVPTXTarget64); 6049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 6149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 6249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 6349683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiNVPTXTargetMachine::NVPTXTargetMachine(const Target &T, 6449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski StringRef TT, 6549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski StringRef CPU, 6649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski StringRef FS, 6749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski const TargetOptions& Options, 6849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski Reloc::Model RM, 6949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CodeModel::Model CM, 7049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CodeGenOpt::Level OL, 7149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski bool is64bit) 7249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), 7349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski Subtarget(TT, CPU, FS, is64bit), 7449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski DataLayout(Subtarget.getDataLayout()), 7549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski InstrInfo(*this), TLInfo(*this), TSInfo(*this), FrameLowering(*this,is64bit) 7649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/*FrameInfo(TargetFrameInfo::StackGrowsUp, 8, 0)*/ { 7749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 7849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 7949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskivoid NVPTXTargetMachine32::anchor() {} 8249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8349683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiNVPTXTargetMachine32::NVPTXTargetMachine32(const Target &T, StringRef TT, 8449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski StringRef CPU, StringRef FS, 8549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski const TargetOptions &Options, 8649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski Reloc::Model RM, CodeModel::Model CM, 8749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CodeGenOpt::Level OL) 8849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski: NVPTXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) { 8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 9049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 9149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskivoid NVPTXTargetMachine64::anchor() {} 9249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 9349683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiNVPTXTargetMachine64::NVPTXTargetMachine64(const Target &T, StringRef TT, 9449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski StringRef CPU, StringRef FS, 9549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski const TargetOptions &Options, 9649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski Reloc::Model RM, CodeModel::Model CM, 9749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski CodeGenOpt::Level OL) 9849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski: NVPTXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) { 9949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 10049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace llvm { 10349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiclass NVPTXPassConfig : public TargetPassConfig { 10449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskipublic: 10549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski NVPTXPassConfig(NVPTXTargetMachine *TM, PassManagerBase &PM) 10649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski : TargetPassConfig(TM, PM) {} 10749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 10849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski NVPTXTargetMachine &getNVPTXTargetMachine() const { 10949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return getTM<NVPTXTargetMachine>(); 11049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } 11149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 11249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski virtual bool addInstSelector(); 11349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski virtual bool addPreRegAlloc(); 11449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}; 11549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 11649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 11749683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiTargetPassConfig *NVPTXTargetMachine::createPassConfig(PassManagerBase &PM) { 11849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski NVPTXPassConfig *PassConfig = new NVPTXPassConfig(this, PM); 11949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return PassConfig; 12049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 12149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 12249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXPassConfig::addInstSelector() { 123564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson addPass(createLowerAggrCopies()); 124564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson addPass(createSplitBBatBarPass()); 125564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson addPass(createAllocaHoisting()); 126564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson addPass(createNVPTXISelDag(getNVPTXTargetMachine(), getOptLevel())); 127564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson addPass(createVectorElementizePass(getNVPTXTargetMachine())); 12849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return false; 12949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 13049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 13149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool NVPTXPassConfig::addPreRegAlloc() { 13249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return false; 13349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 134