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