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