1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===-- AMDGPUTargetMachine.cpp - TargetMachine for hw codegen targets-----===//
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//                     The LLVM Compiler Infrastructure
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// This file is distributed under the University of Illinois Open Source
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// License. See LICENSE.TXT for details.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===----------------------------------------------------------------------===//
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// The AMDGPU target machine contains all of the hardware specific information
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// needed to emit code for R600 and SI GPUs.
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===----------------------------------------------------------------------===//
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "AMDGPUTargetMachine.h"
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "AMDGPU.h"
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "R600ISelLowering.h"
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "R600InstrInfo.h"
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "SIISelLowering.h"
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "SIInstrInfo.h"
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/Analysis/Passes.h"
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/Analysis/Verifier.h"
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/CodeGen/MachineFunctionAnalysis.h"
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/CodeGen/MachineModuleInfo.h"
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/CodeGen/Passes.h"
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/MC/MCAsmInfo.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/PassManager.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/Support/TargetRegistry.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/Support/raw_os_ostream.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/Transforms/IPO.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/Transforms/Scalar.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <llvm/CodeGen/Passes.h>
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing namespace llvm;
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" void LLVMInitializeAMDGPUTarget() {
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // Register the target
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  RegisterTargetMachine<AMDGPUTargetMachine> X(TheAMDGPUTarget);
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAMDGPUTargetMachine::AMDGPUTargetMachine(const Target &T, StringRef TT,
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    StringRef CPU, StringRef FS,
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  TargetOptions Options,
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  Reloc::Model RM, CodeModel::Model CM,
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  CodeGenOpt::Level OptLevel
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org)
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org:
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OptLevel),
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  Subtarget(TT, CPU, FS),
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  DataLayout(Subtarget.getDataLayout()),
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  FrameLowering(TargetFrameLowering::StackGrowsUp,
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Subtarget.device()->getStackAlignment(), 0),
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  IntrinsicInfo(this),
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  InstrItins(&Subtarget.getInstrItineraryData()),
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  mDump(false)
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // TLInfo uses InstrInfo so it must be initialized after.
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (Subtarget.device()->getGeneration() <= AMDGPUDeviceInfo::HD6XXX) {
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    InstrInfo = new R600InstrInfo(*this);
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    TLInfo = new R600TargetLowering(*this);
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  } else {
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    InstrInfo = new SIInstrInfo(*this);
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    TLInfo = new SITargetLowering(*this);
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAMDGPUTargetMachine::~AMDGPUTargetMachine()
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace {
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass AMDGPUPassConfig : public TargetPassConfig {
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  AMDGPUPassConfig(AMDGPUTargetMachine *TM, PassManagerBase &PM)
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    : TargetPassConfig(TM, PM) {}
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  AMDGPUTargetMachine &getAMDGPUTargetMachine() const {
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return getTM<AMDGPUTargetMachine>();
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual bool addPreISel();
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual bool addInstSelector();
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual bool addPreRegAlloc();
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual bool addPostRegAlloc();
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual bool addPreSched2();
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual bool addPreEmitPass();
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // End of anonymous namespace
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTargetPassConfig *AMDGPUTargetMachine::createPassConfig(PassManagerBase &PM) {
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return new AMDGPUPassConfig(this, PM);
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAMDGPUPassConfig::addPreISel()
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (ST.device()->getGeneration() <= AMDGPUDeviceInfo::HD6XXX) {
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PM->add(createR600KernelParametersPass(
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     getAMDGPUTargetMachine().getTargetData()));
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return false;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool AMDGPUPassConfig::addInstSelector() {
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  PM->add(createAMDGPUPeepholeOpt(*TM));
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  PM->add(createAMDGPUISelDag(getAMDGPUTargetMachine()));
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return false;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool AMDGPUPassConfig::addPreRegAlloc() {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (ST.device()->getGeneration() > AMDGPUDeviceInfo::HD6XXX) {
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PM->add(createSIAssignInterpRegsPass(*TM));
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  PM->add(createAMDGPUConvertToISAPass(*TM));
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return false;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool AMDGPUPassConfig::addPostRegAlloc() {
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return false;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool AMDGPUPassConfig::addPreSched2() {
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  addPass(IfConverterID);
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return false;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool AMDGPUPassConfig::addPreEmitPass() {
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  PM->add(createAMDGPUCFGPreparationPass(*TM));
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  PM->add(createAMDGPUCFGStructurizerPass(*TM));
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (ST.device()->getGeneration() <= AMDGPUDeviceInfo::HD6XXX) {
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PM->add(createR600ExpandSpecialInstrsPass(*TM));
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    addPass(FinalizeMachineBundlesID);
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return false;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145