Pārlūkot izejas kodu

radeon/llvm: Remove AMDILMachineFunctionInfo.cpp

tags/i965-primitive-restart-v2
Tom Stellard pirms 13 gadiem
vecāks
revīzija
30f2a38cef

+ 0
- 4
src/gallium/drivers/radeon/AMDGPUTargetMachine.cpp Parādīt failu

@@ -119,10 +119,6 @@ AMDGPUPassConfig::addPreISel()
}

bool AMDGPUPassConfig::addInstSelector() {
const AMDILSubtarget &ST = TM->getSubtarget<AMDILSubtarget>();
if (ST.device()->getGeneration() == AMDILDeviceInfo::HD7XXX) {
PM.add(createSIInitMachineFunctionInfoPass(*TM));
}
PM.add(createAMDILPeepholeOpt(*TM));
PM.add(createAMDILISelDag(getAMDGPUTargetMachine()));
return false;

+ 0
- 1
src/gallium/drivers/radeon/AMDGPUUtil.cpp Parādīt failu

@@ -14,7 +14,6 @@
#include "AMDGPUUtil.h"
#include "AMDGPURegisterInfo.h"
#include "AMDIL.h"
#include "AMDILMachineFunctionInfo.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/Support/ErrorHandling.h"

+ 1
- 8
src/gallium/drivers/radeon/AMDILCFGStructurizer.cpp Parādīt failu

@@ -14,8 +14,6 @@
#define DEBUGME 0
#endif

#include "AMDILCompilerErrors.h"
#include "AMDILMachineFunctionInfo.h"
#include "AMDILTargetMachine.h"
#include "AMDILUtilityFunctions.h"
#include "llvm/ADT/SCCIterator.h"
@@ -111,8 +109,6 @@ void ReverseVector(SmallVector<NodeT *, DEFAULT_VEC_SLOTS> &Src) {
//
//===----------------------------------------------------------------------===//

#include "AMDILCompilerErrors.h"
#include "AMDILMachineFunctionInfo.h"
#include "AMDILTargetMachine.h"
#include "AMDILUtilityFunctions.h"
#include "llvm/ADT/SCCIterator.h"
@@ -709,10 +705,7 @@ bool CFGStructurizer<PassT>::run(FuncT &func, PassT &pass) {
}

if (!finish) {
MachineFunction *MF = &func;
AMDILMachineFunctionInfo *mMFI =
MF->getInfo<AMDILMachineFunctionInfo>();
mMFI->addErrorMsg(amd::CompilerErrorMessage[IRREDUCIBLE_CF]);
assert(!"IRREDUCIBL_CF");
}

return true;

+ 0
- 75
src/gallium/drivers/radeon/AMDILCompilerErrors.h Parādīt failu

@@ -1,75 +0,0 @@
//===-- AMDILCompilerErrors.h - TODO: Add brief description -------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//==-----------------------------------------------------------------------===//
#ifndef _AMDIL_COMPILER_ERRORS_H_
#define _AMDIL_COMPILER_ERRORS_H_
// Compiler errors generated by the backend that will cause
// the runtime to abort compilation. These are mainly for
// device constraint violations or invalid code.
namespace amd {

#define INVALID_COMPUTE 0
#define GENERIC_ERROR 1
#define INTERNAL_ERROR 2
#define MISSING_FUNCTION_CALL 3
#define RESERVED_FUNCTION 4
#define BYTE_STORE_ERROR 5
#define UNKNOWN_TYPE_NAME 6
#define NO_IMAGE_SUPPORT 7
#define NO_ATOMIC_32 8
#define NO_ATOMIC_64 9
#define IRREDUCIBLE_CF 10
#define INSUFFICIENT_RESOURCES 11
#define INSUFFICIENT_LOCAL_RESOURCES 12
#define INSUFFICIENT_PRIVATE_RESOURCES 13
#define INSUFFICIENT_IMAGE_RESOURCES 14
#define DOUBLE_NOT_SUPPORTED 15
#define INVALID_CONSTANT_WRITE 16
#define INSUFFICIENT_CONSTANT_RESOURCES 17
#define INSUFFICIENT_COUNTER_RESOURCES 18
#define INSUFFICIENT_REGION_RESOURCES 19
#define REGION_MEMORY_ERROR 20
#define MEMOP_NO_ALLOCATION 21
#define RECURSIVE_FUNCTION 22
#define INCORRECT_COUNTER_USAGE 23
#define INVALID_INTRINSIC_USAGE 24
#define NUM_ERROR_MESSAGES 25


static const char *CompilerErrorMessage[NUM_ERROR_MESSAGES] =
{
"E000:Compute Shader Not Supported! ",
"E001:Generic Compiler Error Message! ",
"E002:Internal Compiler Error Message!",
"E003:Missing Function Call Detected! ",
"E004:Reserved Function Call Detected!",
"E005:Byte Addressable Stores Invalid!",
"E006:Kernel Arg Type Name Is Invalid!",
"E007:Image 1.0 Extension Unsupported!",
"E008:32bit Atomic Op are Unsupported!",
"E009:64bit Atomic Op are Unsupported!",
"E010:Irreducible ControlFlow Detected",
"E011:Insufficient Resources Detected!",
"E012:Insufficient Local Resources! ",
"E013:Insufficient Private Resources! ",
"E014:Images not currently supported! ",
"E015:Double precision not supported! ",
"E016:Invalid Constant Memory Write! ",
"E017:Max number Constant Ptr reached!",
"E018:Max number of Counters reached! ",
"E019:Insufficient Region Resources! ",
"E020:Region address space invalid! ",
"E021:MemOp with no memory allocated! ",
"E022:Recursive Function detected! ",
"E023:Illegal Inc+Dec to same counter!",
"E024:Illegal usage of intrinsic inst!"
};

}

#endif // _AMDIL_COMPILER_ERRORS_H_

+ 0
- 5
src/gallium/drivers/radeon/AMDILISelLowering.cpp Parādīt failu

@@ -15,7 +15,6 @@
#include "AMDILISelLowering.h"
#include "AMDILDevices.h"
#include "AMDILIntrinsicInfo.h"
#include "AMDILMachineFunctionInfo.h"
#include "AMDILSubtarget.h"
#include "AMDILTargetMachine.h"
#include "AMDILUtilityFunctions.h"
@@ -2206,8 +2205,6 @@ const
{

MachineFunction &MF = DAG.getMachineFunction();
AMDILMachineFunctionInfo *FuncInfo
= MF.getInfo<AMDILMachineFunctionInfo>();
MachineFrameInfo *MFI = MF.getFrameInfo();
//const Function *Fn = MF.getFunction();
//MachineRegisterInfo &RegInfo = MF.getRegInfo();
@@ -2284,14 +2281,12 @@ const
// See MipsISelLowering.cpp for ideas on how to implement
}*/

unsigned int StackSize = CCInfo.getNextStackOffset();
if (isVarArg) {
assert(0 && "Variable arguments are not yet supported");
// See X86/PPC/CellSPU ISelLowering.cpp for ideas on how to implement
}
// This needs to be changed to non-zero if the return function needs
// to pop bytes
FuncInfo->setBytesToPopOnReturn(StackSize);
return Chain;
}
/// CreateCopyOfByValArgument - Make a copy of an aggregate at address specified

+ 0
- 591
src/gallium/drivers/radeon/AMDILMachineFunctionInfo.cpp Parādīt failu

@@ -1,591 +0,0 @@
//===-- AMDILMachineFunctionInfo.cpp - TODO: Add brief description -------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//==-----------------------------------------------------------------------===//
#include "AMDILMachineFunctionInfo.h"
#include "AMDILCompilerErrors.h"
#include "AMDILSubtarget.h"
#include "AMDILTargetMachine.h"
#include "AMDILUtilityFunctions.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Function.h"
#include "llvm/Instructions.h"
#include "llvm/Support/FormattedStream.h"

using namespace llvm;

static const AMDILConstPtr *getConstPtr(const AMDILKernel *krnl, const std::string &arg) {
llvm::SmallVector<AMDILConstPtr, DEFAULT_VEC_SLOTS>::const_iterator begin, end;
for (begin = krnl->constPtr.begin(), end = krnl->constPtr.end();
begin != end; ++begin) {
if (!strcmp(begin->name.data(),arg.c_str())) {
return &(*begin);
}
}
return NULL;
}

void PrintfInfo::addOperand(size_t idx, uint32_t size) {
mOperands.resize((unsigned)(idx + 1));
mOperands[(unsigned)idx] = size;
}

uint32_t PrintfInfo::getPrintfID() {
return mPrintfID;
}

void PrintfInfo::setPrintfID(uint32_t id) {
mPrintfID = id;
}

size_t PrintfInfo::getNumOperands() {
return mOperands.size();
}

uint32_t PrintfInfo::getOperandID(uint32_t idx) {
return mOperands[idx];
}

AMDILMachineFunctionInfo::AMDILMachineFunctionInfo()
: CalleeSavedFrameSize(0), BytesToPopOnReturn(0),
DecorationStyle(None), ReturnAddrIndex(0),
TailCallReturnAddrDelta(0),
SRetReturnReg(0), UsesLDS(false), LDSArg(false),
UsesGDS(false), GDSArg(false),
mReservedLits(9)
{
for (uint32_t x = 0; x < AMDILDevice::MAX_IDS; ++x) {
mUsedMem[x] = false;
}
mMF = NULL;
mKernel = NULL;
mScratchSize = -1;
mArgSize = -1;
mStackSize = -1;
}

AMDILMachineFunctionInfo::AMDILMachineFunctionInfo(MachineFunction& MF)
: CalleeSavedFrameSize(0), BytesToPopOnReturn(0),
DecorationStyle(None), ReturnAddrIndex(0),
TailCallReturnAddrDelta(0),
SRetReturnReg(0), UsesLDS(false), LDSArg(false),
UsesGDS(false), GDSArg(false),
mReservedLits(9)
{
for (uint32_t x = 0; x < AMDILDevice::MAX_IDS; ++x) {
mUsedMem[x] = false;
}
mMF = &MF;
const AMDILTargetMachine *TM =
reinterpret_cast<const AMDILTargetMachine*>(&MF.getTarget());
mSTM = TM->getSubtargetImpl();

mScratchSize = -1;
mArgSize = -1;
mStackSize = -1;
}

AMDILMachineFunctionInfo::~AMDILMachineFunctionInfo()
{
for (std::map<std::string, PrintfInfo*>::iterator pfb = printf_begin(),
pfe = printf_end(); pfb != pfe; ++pfb) {
delete pfb->second;
}
}
unsigned int
AMDILMachineFunctionInfo::getCalleeSavedFrameSize() const
{
return CalleeSavedFrameSize;
}
void
AMDILMachineFunctionInfo::setCalleeSavedFrameSize(unsigned int bytes)
{
CalleeSavedFrameSize = bytes;
}
unsigned int
AMDILMachineFunctionInfo::getBytesToPopOnReturn() const
{
return BytesToPopOnReturn;
}
void
AMDILMachineFunctionInfo::setBytesToPopOnReturn(unsigned int bytes)
{
BytesToPopOnReturn = bytes;
}
NameDecorationStyle
AMDILMachineFunctionInfo::getDecorationStyle() const
{
return DecorationStyle;
}
void
AMDILMachineFunctionInfo::setDecorationStyle(NameDecorationStyle style)
{
DecorationStyle = style;
}
int
AMDILMachineFunctionInfo::getRAIndex() const
{
return ReturnAddrIndex;
}
void
AMDILMachineFunctionInfo::setRAIndex(int index)
{
ReturnAddrIndex = index;
}
int
AMDILMachineFunctionInfo::getTCReturnAddrDelta() const
{
return TailCallReturnAddrDelta;
}
void
AMDILMachineFunctionInfo::setTCReturnAddrDelta(int delta)
{
TailCallReturnAddrDelta = delta;
}
unsigned int
AMDILMachineFunctionInfo::getSRetReturnReg() const
{
return SRetReturnReg;
}
void
AMDILMachineFunctionInfo::setSRetReturnReg(unsigned int reg)
{
SRetReturnReg = reg;
}

void
AMDILMachineFunctionInfo::setUsesLocal()
{
UsesLDS = true;
}

bool
AMDILMachineFunctionInfo::usesLocal() const
{
return UsesLDS;
}

void
AMDILMachineFunctionInfo::setHasLocalArg()
{
LDSArg = true;
}

bool
AMDILMachineFunctionInfo::hasLocalArg() const
{
return LDSArg;
}



void
AMDILMachineFunctionInfo::setUsesRegion()
{
UsesGDS = true;
}

bool
AMDILMachineFunctionInfo::usesRegion() const
{
return UsesGDS;
}

void
AMDILMachineFunctionInfo::setHasRegionArg()
{
GDSArg = true;
}

bool
AMDILMachineFunctionInfo::hasRegionArg() const
{
return GDSArg;
}


bool
AMDILMachineFunctionInfo::usesHWConstant(std::string name) const
{
const AMDILConstPtr *curConst = getConstPtr(mKernel, name);
if (curConst) {
return curConst->usesHardware;
} else {
return false;
}
}

uint32_t
AMDILMachineFunctionInfo::getLocal(uint32_t dim)
{
if (mKernel && mKernel->sgv) {
AMDILKernelAttr *sgv = mKernel->sgv;
switch (dim) {
default: break;
case 0:
case 1:
case 2:
return sgv->reqGroupSize[dim];
break;
case 3:
return sgv->reqGroupSize[0] * sgv->reqGroupSize[1] * sgv->reqGroupSize[2];
};
}
switch (dim) {
default:
return 1;
case 3:
return mSTM->getDefaultSize(0) *
mSTM->getDefaultSize(1) *
mSTM->getDefaultSize(2);
case 2:
case 1:
case 0:
return mSTM->getDefaultSize(dim);
break;
};
return 1;
}
bool
AMDILMachineFunctionInfo::isKernel() const
{
return mKernel != NULL && mKernel->mKernel;
}

AMDILKernel*
AMDILMachineFunctionInfo::getKernel()
{
return mKernel;
}

std::string
AMDILMachineFunctionInfo::getName()
{
if (mMF) {
return mMF->getFunction()->getName();
} else {
return "";
}
}

uint32_t
AMDILMachineFunctionInfo::getArgSize()
{
if (mArgSize == -1) {
Function::const_arg_iterator I = mMF->getFunction()->arg_begin();
Function::const_arg_iterator Ie = mMF->getFunction()->arg_end();
uint32_t Counter = 0;
while (I != Ie) {
Type* curType = I->getType();
if (curType->isIntegerTy() || curType->isFloatingPointTy()) {
++Counter;
} else if (const VectorType *VT = dyn_cast<VectorType>(curType)) {
Type *ET = VT->getElementType();
int numEle = VT->getNumElements();
switch (ET->getPrimitiveSizeInBits()) {
default:
if (numEle == 3) {
Counter++;
} else {
Counter += ((numEle + 2) >> 2);
}
break;
case 64:
if (numEle == 3) {
Counter += 2;
} else {
Counter += (numEle >> 1);
}
break;
case 16:
case 8:
switch (numEle) {
default:
Counter += ((numEle + 2) >> 2);
case 2:
Counter++;
break;
}
break;
}
} else if (const PointerType *PT = dyn_cast<PointerType>(curType)) {
Type *CT = PT->getElementType();
const StructType *ST = dyn_cast<StructType>(CT);
if (ST && ST->isOpaque()) {
bool i1d = ST->getName() == "struct._image1d_t";
bool i1da = ST->getName() == "struct._image1d_array_t";
bool i1db = ST->getName() == "struct._image1d_buffer_t";
bool i2d = ST->getName() == "struct._image2d_t";
bool i2da = ST->getName() == "struct._image2d_array_t";
bool i3d = ST->getName() == "struct._image3d_t";
bool is_image = i1d || i1da || i1db || i2d || i2da || i3d;
if (is_image) {
if (mSTM->device()->isSupported(AMDILDeviceInfo::Images)) {
Counter += 2;
} else {
addErrorMsg(amd::CompilerErrorMessage[NO_IMAGE_SUPPORT]);
}
} else {
Counter++;
}
} else if (CT->isStructTy()
&& PT->getAddressSpace() == AMDILAS::PRIVATE_ADDRESS) {
StructType *ST = dyn_cast<StructType>(CT);
Counter += ((getTypeSize(ST) + 15) & ~15) >> 4;
} else if (CT->isIntOrIntVectorTy()
|| CT->isFPOrFPVectorTy()
|| CT->isArrayTy()
|| CT->isPointerTy()
|| PT->getAddressSpace() != AMDILAS::PRIVATE_ADDRESS) {
++Counter;
} else {
assert(0 && "Current type is not supported!");
addErrorMsg(amd::CompilerErrorMessage[INTERNAL_ERROR]);
}
} else {
assert(0 && "Current type is not supported!");
addErrorMsg(amd::CompilerErrorMessage[INTERNAL_ERROR]);
}
++I;
}
// Convert from slots to bytes by multiplying by 16(shift by 4).
mArgSize = Counter << 4;
}
return (uint32_t)mArgSize;
}
uint32_t
AMDILMachineFunctionInfo::getScratchSize()
{
if (mScratchSize == -1) {
mScratchSize = 0;
Function::const_arg_iterator I = mMF->getFunction()->arg_begin();
Function::const_arg_iterator Ie = mMF->getFunction()->arg_end();
while (I != Ie) {
Type *curType = I->getType();
mScratchSize += ((getTypeSize(curType) + 15) & ~15);
++I;
}
mScratchSize += ((mScratchSize + 15) & ~15);
}
return (uint32_t)mScratchSize;
}

uint32_t
AMDILMachineFunctionInfo::getStackSize()
{
if (mStackSize == -1) {
uint32_t privSize = 0;
const MachineFrameInfo *MFI = mMF->getFrameInfo();
privSize = MFI->getOffsetAdjustment() + MFI->getStackSize();
const AMDILTargetMachine *TM =
reinterpret_cast<const AMDILTargetMachine*>(&mMF->getTarget());
bool addStackSize = TM->getOptLevel() == CodeGenOpt::None;
Function::const_arg_iterator I = mMF->getFunction()->arg_begin();
Function::const_arg_iterator Ie = mMF->getFunction()->arg_end();
while (I != Ie) {
Type *curType = I->getType();
++I;
if (dyn_cast<PointerType>(curType)) {
Type *CT = dyn_cast<PointerType>(curType)->getElementType();
if (CT->isStructTy()
&& dyn_cast<PointerType>(curType)->getAddressSpace()
== AMDILAS::PRIVATE_ADDRESS) {
addStackSize = true;
}
}
}
if (addStackSize) {
privSize += getScratchSize();
}
mStackSize = privSize;
}
return (uint32_t)mStackSize;

}

uint32_t
AMDILMachineFunctionInfo::addi32Literal(uint32_t val, int Opcode) {
// Since we have emulated 16/8/1 bit register types with a 32bit real
// register, we need to sign extend the constants to 32bits in order for
// comparisons against the constants to work correctly, this fixes some issues
// we had in conformance failing for saturation.
if (Opcode == AMDIL::LOADCONST_i16) {
val = (((int32_t)val << 16) >> 16);
} else if (Opcode == AMDIL::LOADCONST_i8) {
val = (((int32_t)val << 24) >> 24);
}
if (mIntLits.find(val) == mIntLits.end()) {
mIntLits[val] = getNumLiterals();
}
return mIntLits[val];
}

uint32_t
AMDILMachineFunctionInfo::addi64Literal(uint64_t val) {
if (mLongLits.find(val) == mLongLits.end()) {
mLongLits[val] = getNumLiterals();
}
return mLongLits[val];
}

uint32_t
AMDILMachineFunctionInfo::addi128Literal(uint64_t val_lo, uint64_t val_hi) {
std::pair<uint64_t, uint64_t> a;
a.first = val_lo;
a.second = val_hi;
if (mVecLits.find(a) == mVecLits.end()) {
mVecLits[a] = getNumLiterals();
}
return mVecLits[a];
}

uint32_t
AMDILMachineFunctionInfo::addf32Literal(const ConstantFP *CFP) {
uint32_t val = (uint32_t)CFP->getValueAPF().bitcastToAPInt().getZExtValue();
if (mIntLits.find(val) == mIntLits.end()) {
mIntLits[val] = getNumLiterals();
}
return mIntLits[val];
}

uint32_t
AMDILMachineFunctionInfo::addf64Literal(const ConstantFP *CFP) {
union dtol_union {
double d;
uint64_t ul;
} dval;
const APFloat &APF = CFP->getValueAPF();
if (&APF.getSemantics() == (const llvm::fltSemantics *)&APFloat::IEEEsingle) {
float fval = APF.convertToFloat();
dval.d = (double)fval;
} else {
dval.d = APF.convertToDouble();
}
if (mLongLits.find(dval.ul) == mLongLits.end()) {
mLongLits[dval.ul] = getNumLiterals();
}
return mLongLits[dval.ul];
}

uint32_t
AMDILMachineFunctionInfo::getIntLits(uint32_t offset)
{
return mIntLits[offset];
}

uint32_t
AMDILMachineFunctionInfo::getLongLits(uint64_t offset)
{
return mLongLits[offset];
}

uint32_t
AMDILMachineFunctionInfo::getVecLits(uint64_t low64, uint64_t high64)
{
return mVecLits[std::pair<uint64_t, uint64_t>(low64, high64)];
}

size_t
AMDILMachineFunctionInfo::getNumLiterals() const {
return mLongLits.size() + mIntLits.size() + mVecLits.size() + mReservedLits;
}

void
AMDILMachineFunctionInfo::addReservedLiterals(uint32_t size)
{
mReservedLits += size;
}

uint32_t
AMDILMachineFunctionInfo::addSampler(std::string name, uint32_t val)
{
if (mSamplerMap.find(name) != mSamplerMap.end()) {
SamplerInfo newVal = mSamplerMap[name];
assert(newVal.val == val
&& "Found a sampler with same name but different values!");
return mSamplerMap[name].idx;
} else {
SamplerInfo curVal;
curVal.name = name;
curVal.val = val;
curVal.idx = mSamplerMap.size();
mSamplerMap[name] = curVal;
return curVal.idx;
}
}

void
AMDILMachineFunctionInfo::setUsesMem(unsigned id) {
assert(id < AMDILDevice::MAX_IDS &&
"Must set the ID to be less than MAX_IDS!");
mUsedMem[id] = true;
}

bool
AMDILMachineFunctionInfo::usesMem(unsigned id) {
assert(id < AMDILDevice::MAX_IDS &&
"Must set the ID to be less than MAX_IDS!");
return mUsedMem[id];
}

void
AMDILMachineFunctionInfo::addErrorMsg(const char *msg, ErrorMsgEnum val)
{
if (val == DEBUG_ONLY) {
#if defined(DEBUG) || defined(_DEBUG)
mErrors.insert(msg);
#endif
} else if (val == RELEASE_ONLY) {
#if !defined(DEBUG) && !defined(_DEBUG)
mErrors.insert(msg);
#endif
} else if (val == ALWAYS) {
mErrors.insert(msg);
}
}

uint32_t
AMDILMachineFunctionInfo::addPrintfString(std::string &name, unsigned offset)
{
if (mPrintfMap.find(name) != mPrintfMap.end()) {
return mPrintfMap[name]->getPrintfID();
} else {
PrintfInfo *info = new PrintfInfo;
info->setPrintfID(mPrintfMap.size() + offset);
mPrintfMap[name] = info;
return info->getPrintfID();
}
}

void
AMDILMachineFunctionInfo::addPrintfOperand(std::string &name,
size_t idx,
uint32_t size)
{
mPrintfMap[name]->addOperand(idx, size);
}

void
AMDILMachineFunctionInfo::addMetadata(const char *md, bool kernelOnly)
{
addMetadata(std::string(md), kernelOnly);
}

void
AMDILMachineFunctionInfo::addMetadata(std::string md, bool kernelOnly)
{
if (kernelOnly) {
mMetadataKernel.push_back(md);
} else {
mMetadataFunc.insert(md);
}
}


+ 0
- 422
src/gallium/drivers/radeon/AMDILMachineFunctionInfo.h Parādīt failu

@@ -1,422 +0,0 @@
//== AMDILMachineFunctionInfo.h - AMD il Machine Function Info -*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//==-----------------------------------------------------------------------===//
//
// This file declares AMDIL-specific per-machine-function information
//
//===----------------------------------------------------------------------===//
#ifndef _AMDILMACHINEFUNCTIONINFO_H_
#define _AMDILMACHINEFUNCTIONINFO_H_
#include "AMDIL.h"
#include "AMDILDevice.h"
#include "AMDILKernel.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/ValueMap.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/Function.h"

#include <map>
#include <set>
#include <string>

namespace llvm
{
class AMDILSubtarget;
class PrintfInfo {
uint32_t mPrintfID;
SmallVector<uint32_t, DEFAULT_VEC_SLOTS> mOperands;
public:
void addOperand(size_t idx, uint32_t size);
uint32_t getPrintfID();
void setPrintfID(uint32_t idx);
size_t getNumOperands();
uint32_t getOperandID(uint32_t idx);
}; // class PrintfInfo

enum NameDecorationStyle
{
None,
StdCall,
FastCall
};
typedef struct SamplerInfoRec {
std::string name; // The name of the sampler
uint32_t val; // The value of the sampler
uint32_t idx; // The sampler resource id
} SamplerInfo;
// Some typedefs that will help with using the various iterators
// of the machine function info class.
typedef std::map<uint32_t, uint32_t>::iterator lit32_iterator;
typedef std::map<uint64_t, uint32_t>::iterator lit64_iterator;
typedef std::map<std::pair<uint64_t, uint64_t>, uint32_t>::iterator
lit128_iterator;
typedef StringMap<SamplerInfo>::iterator sampler_iterator;
typedef DenseSet<uint32_t>::iterator func_iterator;
typedef DenseSet<uint32_t>::iterator intr_iterator;
typedef DenseSet<uint32_t>::iterator uav_iterator;
typedef DenseSet<uint32_t>::iterator read_image2d_iterator;
typedef DenseSet<uint32_t>::iterator read_image3d_iterator;
typedef DenseSet<uint32_t>::iterator write_image2d_iterator;
typedef DenseSet<uint32_t>::iterator write_image3d_iterator;
typedef DenseSet<const char*>::iterator error_iterator;
typedef std::map<std::string, PrintfInfo*>::iterator printf_iterator;
typedef std::set<std::string>::iterator func_md_iterator;
typedef std::vector<std::string>::iterator kernel_md_iterator;
// AMDILMachineFunctionInfo - This class is
// derived from MachineFunction private
// amdil target-specific information for each MachineFunction
class AMDILMachineFunctionInfo : public MachineFunctionInfo
{
// CalleeSavedFrameSize - Size of the callee-saved
// register portion of the
// stack frame in bytes.
unsigned int CalleeSavedFrameSize;
// BytesToPopOnReturn - Number of bytes function pops on return.
// Used on windows platform for stdcall & fastcall name decoration
unsigned int BytesToPopOnReturn;
// DecorationStyle - If the function requires additional
// name decoration,
// DecorationStyle holds the right way to do so.
NameDecorationStyle DecorationStyle;
// ReturnAddrIndex - FrameIndex for return slot.
int ReturnAddrIndex;

// TailCallReturnAddrDelta - Delta the ReturnAddr stack slot is moved
// Used for creating an area before the register spill area
// on the stack
// the returnaddr can be savely move to this area
int TailCallReturnAddrDelta;

// SRetReturnReg - Some subtargets require that sret lowering includes
// returning the value of the returned struct in a register.
// This field holds the virtual register into which the sret
// argument is passed.
unsigned int SRetReturnReg;

// UsesLocal - Specifies that this function uses LDS memory and
// that it needs to be allocated.
bool UsesLDS;

// LDSArg - Flag that specifies if this function has an Local
// argument or not
bool LDSArg;

// UsesGDS - Specifies that this function uses GDS memory and
// that it needs to be allocated.
bool UsesGDS;

// GDSArg - Flag that specifies if this function has an Region
// argument or not
bool GDSArg;

// The size in bytes required to host all of the kernel arguments.
// -1 means this value has not been determined yet.
int32_t mArgSize;

// The size in bytes required to host the stack and the kernel arguments
// in private memory.
// -1 means this value has not been determined yet.
int32_t mScratchSize;

// The size in bytes required to host the the kernel arguments
// on the stack.
// -1 means this value has not been determined yet.
int32_t mStackSize;

/// A map of constant to literal mapping for all of the 32bit or
/// smaller literals in the current function.
std::map<uint32_t, uint32_t> mIntLits;

/// A map of constant to literal mapping for all of the 64bit
/// literals in the current function.
std::map<uint64_t, uint32_t> mLongLits;

/// A map of constant to literal mapping for all of the 128bit
/// literals in the current function.
std::map<std::pair<uint64_t, uint64_t>, uint32_t> mVecLits;

/// The number of literals that should be reserved.
/// TODO: Remove this when the wrapper emitter is added.
uint32_t mReservedLits;

/// A map of name to sampler information that is used to emit
/// metadata to the IL stream that the runtimes can use for
/// hardware setup.
StringMap<SamplerInfo> mSamplerMap;

/// Array of flags to specify if a specific memory type is used or not.
bool mUsedMem[AMDILDevice::MAX_IDS];

/// Set of all functions that this function calls.
DenseSet<uint32_t> mFuncs;

/// Set of all intrinsics that this function calls.
DenseSet<uint32_t> mIntrs;

/// Set of all read only 2D images.
DenseSet<uint32_t> mRO2D;
/// Set of all read only 3D images.
DenseSet<uint32_t> mRO3D;
/// Set of all write only 2D images.
DenseSet<uint32_t> mWO2D;
/// Set of all write only 3D images.
DenseSet<uint32_t> mWO3D;
/// Set of all the raw uavs.
DenseSet<uint32_t> mRawUAV;
/// Set of all the arena uavs.
DenseSet<uint32_t> mArenaUAV;

/// A set of all errors that occured in the backend for this function.
DenseSet<const char *> mErrors;

/// A mapping of printf data and the printf string
std::map<std::string, PrintfInfo*> mPrintfMap;

/// A set of all of the metadata that is used for the current function.
std::set<std::string> mMetadataFunc;

/// A set of all of the metadata that is used for the function wrapper.
std::vector<std::string> mMetadataKernel;

/// Information about the kernel, NULL if the function is not a kernel.
AMDILKernel *mKernel;

/// Pointer to the machine function that this information belongs to.
MachineFunction *mMF;

/// Pointer to the subtarget for this function.
const AMDILSubtarget *mSTM;
public:
AMDILMachineFunctionInfo();
AMDILMachineFunctionInfo(MachineFunction &MF);
virtual ~AMDILMachineFunctionInfo();
unsigned int
getCalleeSavedFrameSize() const;
void
setCalleeSavedFrameSize(unsigned int bytes);

unsigned int
getBytesToPopOnReturn() const;
void
setBytesToPopOnReturn (unsigned int bytes);

NameDecorationStyle
getDecorationStyle() const;
void
setDecorationStyle(NameDecorationStyle style);

int
getRAIndex() const;
void
setRAIndex(int Index);

int
getTCReturnAddrDelta() const;
void
setTCReturnAddrDelta(int delta);

unsigned int
getSRetReturnReg() const;
void
setSRetReturnReg(unsigned int Reg);

void
setUsesLocal();
bool
usesLocal() const;
void
setHasLocalArg();
bool
hasLocalArg() const;

void
setUsesRegion();
bool
usesRegion() const;
void
setHasRegionArg();
bool
hasRegionArg() const;

bool
usesHWConstant(std::string name) const;
uint32_t
getLocal(uint32_t);
bool
isKernel() const;
AMDILKernel*
getKernel();

std::string
getName();

/// Get the size in bytes that are required to host all of
/// arguments based on the argument alignment rules in the AMDIL
/// Metadata spec.
uint32_t getArgSize();

/// Get the size in bytes that are required to host all of
/// arguments and stack memory in scratch.
uint32_t getScratchSize();

/// Get the size in bytes that is required to host all of
/// the arguments on the stack.
uint32_t getStackSize();

///
/// @param val value to add the lookup table
/// @param Opcode opcode of the literal instruction
/// @brief adds the specified value of the type represented by the
/// Opcode
/// to the literal to integer and integer to literal mappings.
///
/// Add a 32bit integer value to the literal table.
uint32_t addi32Literal(uint32_t val, int Opcode = AMDIL::LOADCONST_i32);

/// Add a 32bit floating point value to the literal table.
uint32_t addf32Literal(const ConstantFP *CFP);

/// Add a 64bit integer value to the literal table.
uint32_t addi64Literal(uint64_t val);

/// Add a 128 bit integer value to the literal table.
uint32_t addi128Literal(uint64_t val_lo, uint64_t val_hi);

/// Add a 64bit floating point literal as a 64bit integer value.
uint32_t addf64Literal(const ConstantFP *CFP);

/// Get the number of literals that have currently been allocated.
size_t getNumLiterals() const;

/// Get the literal ID of an Integer literal of the given offset.
uint32_t getIntLits(uint32_t lit);

/// Get the literal ID of a Long literal of the given offset.
uint32_t getLongLits(uint64_t lit);

/// Get the literal ID of a Long literal of the given offset.
uint32_t getVecLits(uint64_t low64, uint64_t high64);

/// Add some literals to the number of reserved literals.
void addReservedLiterals(uint32_t);

// Functions that return iterators to the beginning and end
// of the various literal maps.
// Functions that return the beginning and end of the 32bit literal map
lit32_iterator begin_32() { return mIntLits.begin(); }
lit32_iterator end_32() { return mIntLits.end(); }

// Functions that return the beginning and end of the 64bit literal map
lit64_iterator begin_64() { return mLongLits.begin(); }
lit64_iterator end_64() { return mLongLits.end(); }

// Functions that return the beginning and end of the 2x64bit literal map
lit128_iterator begin_128() { return mVecLits.begin(); }
lit128_iterator end_128() { return mVecLits.end(); }

// Add a sampler to the set of known samplers for the current kernel.
uint32_t addSampler(std::string name, uint32_t value);
// Iterators that point to the beginning and end of the sampler map.
sampler_iterator sampler_begin() { return mSamplerMap.begin(); }
sampler_iterator sampler_end() { return mSamplerMap.end(); }


/// Set the flag for the memory ID to true for the current function.
void setUsesMem(unsigned);
/// Retrieve the flag for the memory ID.
bool usesMem(unsigned);

/// Add called functions to the set of all functions this function calls.
void addCalledFunc(uint32_t id) { mFuncs.insert(id); }
void eraseCalledFunc(uint32_t id) { mFuncs.erase(id); }
size_t func_size() { return mFuncs.size(); }
bool func_empty() { return mFuncs.empty(); }
func_iterator func_begin() { return mFuncs.begin(); }
func_iterator func_end() { return mFuncs.end(); }

/// Add called intrinsics to the set of all intrinscis this function calls.
void addCalledIntr(uint32_t id) { mIntrs.insert(id); }
size_t intr_size() { return mIntrs.size(); }
bool intr_empty() { return mIntrs.empty(); }
intr_iterator intr_begin() { return mIntrs.begin(); }
intr_iterator intr_end() { return mIntrs.end(); }

/// Add a 2D read_only image id.
void addROImage2D(uint32_t id) { mRO2D.insert(id); }
size_t read_image2d_size() { return mRO2D.size(); }
read_image2d_iterator read_image2d_begin() { return mRO2D.begin(); }
read_image2d_iterator read_image2d_end() { return mRO2D.end(); }

/// Add a 3D read_only image id.
void addROImage3D(uint32_t id) { mRO3D.insert(id); }
size_t read_image3d_size() { return mRO3D.size(); }
read_image3d_iterator read_image3d_begin() { return mRO3D.begin(); }
read_image3d_iterator read_image3d_end() { return mRO3D.end(); }

/// Add a 2D write_only image id.
void addWOImage2D(uint32_t id) { mWO2D.insert(id); }
size_t write_image2d_size() { return mWO2D.size(); }
write_image2d_iterator write_image2d_begin() { return mWO2D.begin(); }
write_image2d_iterator write_image2d_end() { return mWO2D.end(); }

/// Add a 3D write_only image id.
void addWOImage3D(uint32_t id) { mWO3D.insert(id); }
size_t write_image3d_size() { return mWO3D.size(); }
write_image3d_iterator write_image3d_begin() { return mWO3D.begin(); }
write_image3d_iterator write_image3d_end() { return mWO3D.end(); }

/// Add a raw uav id.
void uav_insert(uint32_t id) { mRawUAV.insert(id); }
bool uav_count(uint32_t id) { return mRawUAV.count(id); }
size_t uav_size() { return mRawUAV.size(); }
uav_iterator uav_begin() { return mRawUAV.begin(); }
uav_iterator uav_end() { return mRawUAV.end(); }

/// Add an arena uav id.
void arena_insert(uint32_t id) { mArenaUAV.insert(id); }
bool arena_count(uint32_t id) { return mArenaUAV.count(id); }
size_t arena_size() { return mArenaUAV.size(); }
uav_iterator arena_begin() { return mArenaUAV.begin(); }
uav_iterator arena_end() { return mArenaUAV.end(); }

// Add an error to the output for the current function.
typedef enum {
RELEASE_ONLY, /// Only emit error message in release mode.
DEBUG_ONLY, /// Only emit error message in debug mode.
ALWAYS /// Always emit the error message.
} ErrorMsgEnum;
/// Add an error message to the set of all error messages.
void addErrorMsg(const char* msg, ErrorMsgEnum val = ALWAYS);
bool errors_empty() { return mErrors.empty(); }
error_iterator errors_begin() { return mErrors.begin(); }
error_iterator errors_end() { return mErrors.end(); }

/// Add a string to the printf map
uint32_t addPrintfString(std::string &name, unsigned offset);
/// Add a operand to the printf string
void addPrintfOperand(std::string &name, size_t idx, uint32_t size);
bool printf_empty() { return mPrintfMap.empty(); }
size_t printf_size() { return mPrintfMap.size(); }
printf_iterator printf_begin() { return mPrintfMap.begin(); }
printf_iterator printf_end() { return mPrintfMap.end(); }

/// Add a string to the metadata set for a function/kernel wrapper
void addMetadata(const char *md, bool kernelOnly = false);
void addMetadata(std::string md, bool kernelOnly = false);
func_md_iterator func_md_begin() { return mMetadataFunc.begin(); }
func_md_iterator func_md_end() { return mMetadataFunc.end(); }
kernel_md_iterator kernel_md_begin() { return mMetadataKernel.begin(); }
kernel_md_iterator kernel_md_end() { return mMetadataKernel.end(); }
};
} // llvm namespace
#endif // _AMDILMACHINEFUNCTIONINFO_H_

+ 0
- 15
src/gallium/drivers/radeon/AMDILPeepholeOptimizer.cpp Parādīt failu

@@ -16,7 +16,6 @@

#include "AMDILAlgorithms.tpp"
#include "AMDILDevices.h"
#include "AMDILMachineFunctionInfo.h"
#include "AMDILUtilityFunctions.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
@@ -241,20 +240,6 @@ AMDILPeepholeOpt::doAtomicConversionIfNeeded(Function &F)
if (mConvertAtomics) {
return;
}
// If we did not convert all of the atomics, then we need to make sure that
// the atomics that were not converted have their base pointers set to use the
// arena path.
Function::arg_iterator argB = F.arg_begin();
Function::arg_iterator argE = F.arg_end();
AMDILMachineFunctionInfo *mMFI = getAnalysis<MachineFunctionAnalysis>().getMF()
.getInfo<AMDILMachineFunctionInfo>();
for (; argB != argE; ++argB) {
if (mSTM->device()->isSupported(AMDILDeviceInfo::ArenaUAV)) {
mMFI->uav_insert(mSTM->device()->getResourceID(AMDILDevice::ARENA_UAV_ID));
} else {
mMFI->uav_insert(mSTM->device()->getResourceID(AMDILDevice::GLOBAL_ID));
}
}
}

bool

+ 0
- 1
src/gallium/drivers/radeon/Makefile.sources Parādīt failu

@@ -28,7 +28,6 @@ CPP_SOURCES := \
AMDILIntrinsicInfo.cpp \
AMDILISelDAGToDAG.cpp \
AMDILISelLowering.cpp \
AMDILMachineFunctionInfo.cpp \
AMDILMachinePeephole.cpp \
AMDILMCCodeEmitter.cpp \
AMDILNIDevice.cpp \

+ 0
- 3
src/gallium/drivers/radeon/R600CodeEmitter.cpp Parādīt failu

@@ -15,7 +15,6 @@
#include "AMDGPUUtil.h"
#include "AMDILCodeEmitter.h"
#include "AMDILInstrInfo.h"
#include "AMDILMachineFunctionInfo.h"
#include "AMDILUtilityFunctions.h"
#include "R600RegisterInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
@@ -42,7 +41,6 @@ namespace {
formatted_raw_ostream &_OS;
const TargetMachine * TM;
const MachineRegisterInfo * MRI;
AMDILMachineFunctionInfo * MFI;
const R600RegisterInfo * TRI;
bool evergreenEncoding;

@@ -149,7 +147,6 @@ bool R600CodeEmitter::runOnMachineFunction(MachineFunction &MF) {

TM = &MF.getTarget();
MRI = &MF.getRegInfo();
MFI = MF.getInfo<AMDILMachineFunctionInfo>();
TRI = static_cast<const R600RegisterInfo *>(TM->getRegisterInfo());
const AMDILSubtarget &STM = TM->getSubtarget<AMDILSubtarget>();
std::string gpu = STM.getDeviceName();

+ 0
- 3
src/gallium/drivers/radeon/R600LowerInstructions.cpp Parādīt failu

@@ -15,7 +15,6 @@
#include "AMDGPUInstrInfo.h"
#include "AMDGPUUtil.h"
#include "AMDIL.h"
#include "AMDILMachineFunctionInfo.h"
#include "AMDILRegisterInfo.h"
#include "R600InstrInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
@@ -34,7 +33,6 @@ namespace {
private:
static char ID;
TargetMachine &TM;
AMDILMachineFunctionInfo * MFI;
const R600InstrInfo * TII;
MachineRegisterInfo * MRI;

@@ -73,7 +71,6 @@ FunctionPass *llvm::createR600LowerInstructionsPass(TargetMachine &tm) {
bool R600LowerInstructionsPass::runOnMachineFunction(MachineFunction &MF)
{
MRI = &MF.getRegInfo();
MFI = MF.getInfo<AMDILMachineFunctionInfo>();

for (MachineFunction::iterator BB = MF.begin(), BB_E = MF.end();
BB != BB_E; ++BB) {

+ 2
- 42
src/gallium/drivers/radeon/SIMachineFunctionInfo.cpp Parādīt failu

@@ -13,50 +13,10 @@


#include "SIMachineFunctionInfo.h"
#include "AMDGPU.h"
#include "llvm/CodeGen/MachineFunctionPass.h"

using namespace llvm;


SIMachineFunctionInfo::SIMachineFunctionInfo()
: AMDILMachineFunctionInfo(),
spi_ps_input_addr(0)
{ }

SIMachineFunctionInfo::SIMachineFunctionInfo(MachineFunction &MF)
: AMDILMachineFunctionInfo(MF),
SIMachineFunctionInfo::SIMachineFunctionInfo(const MachineFunction &MF)
: MachineFunctionInfo(),
spi_ps_input_addr(0)
{ }


namespace {
class SIInitMachineFunctionInfoPass : public MachineFunctionPass {

private:
static char ID;
TargetMachine &TM;

public:
SIInitMachineFunctionInfoPass(TargetMachine &tm) :
MachineFunctionPass(ID), TM(tm) { }
virtual bool runOnMachineFunction(MachineFunction &MF);
};
} // End anonymous namespace

char SIInitMachineFunctionInfoPass::ID = 0;

FunctionPass *llvm::createSIInitMachineFunctionInfoPass(TargetMachine &tm) {
return new SIInitMachineFunctionInfoPass(tm);
}

/* A MachineFunction's MachineFunctionInfo is initialized in the first call to
* getInfo(). We need to intialize it as an SIMachineFunctionInfo object
* before any of the AMDIL passes otherwise it will be an
* AMDILMachineFunctionInfo object and we won't be able to use it.
*/
bool SIInitMachineFunctionInfoPass::runOnMachineFunction(MachineFunction &MF)
{
SIMachineFunctionInfo * MFI = MF.getInfo<SIMachineFunctionInfo>();
return false;
}

+ 3
- 4
src/gallium/drivers/radeon/SIMachineFunctionInfo.h Parādīt failu

@@ -15,17 +15,16 @@
#ifndef _SIMACHINEFUNCTIONINFO_H_
#define _SIMACHINEFUNCTIONINFO_H_

#include "AMDILMachineFunctionInfo.h"
#include "llvm/CodeGen/MachineFunction.h"

namespace llvm {

class SIMachineFunctionInfo : public AMDILMachineFunctionInfo {
class SIMachineFunctionInfo : public MachineFunctionInfo {

private:

public:
SIMachineFunctionInfo();
SIMachineFunctionInfo(MachineFunction &MF);
SIMachineFunctionInfo(const MachineFunction &MF);
unsigned spi_ps_input_addr;

};

+ 0
- 2
src/gallium/drivers/radeon/SIPropagateImmReads.cpp Parādīt failu

@@ -13,7 +13,6 @@

#include "AMDGPU.h"
#include "AMDGPUUtil.h"
#include "AMDILMachineFunctionInfo.h"
#include "SIInstrInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"

@@ -42,7 +41,6 @@ FunctionPass *llvm::createSIPropagateImmReadsPass(TargetMachine &tm) {

bool SIPropagateImmReadsPass::runOnMachineFunction(MachineFunction &MF)
{
AMDILMachineFunctionInfo * MFI = MF.getInfo<AMDILMachineFunctionInfo>();
const SIInstrInfo * TII = static_cast<const SIInstrInfo*>(TM.getInstrInfo());

for (MachineFunction::iterator BB = MF.begin(), BB_E = MF.end();

Notiek ielāde…
Atcelt
Saglabāt