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