forked from OSchip/llvm-project
Add physical register counting functions
llvm-svn: 118397
This commit is contained in:
parent
c03ec0cc42
commit
09bf309527
|
@ -15,6 +15,7 @@ add_llvm_target(PTXCodeGen
|
||||||
PTXInstrInfo.cpp
|
PTXInstrInfo.cpp
|
||||||
PTXMCAsmInfo.cpp
|
PTXMCAsmInfo.cpp
|
||||||
PTXMCAsmStreamer.cpp
|
PTXMCAsmStreamer.cpp
|
||||||
|
PTXMFInfoExtract.cpp
|
||||||
PTXRegisterInfo.cpp
|
PTXRegisterInfo.cpp
|
||||||
PTXSubtarget.cpp
|
PTXSubtarget.cpp
|
||||||
PTXTargetMachine.cpp
|
PTXTargetMachine.cpp
|
||||||
|
|
|
@ -24,6 +24,9 @@ namespace llvm {
|
||||||
FunctionPass *createPTXISelDag(PTXTargetMachine &TM,
|
FunctionPass *createPTXISelDag(PTXTargetMachine &TM,
|
||||||
CodeGenOpt::Level OptLevel);
|
CodeGenOpt::Level OptLevel);
|
||||||
|
|
||||||
|
FunctionPass *createPTXMFInfoExtract(PTXTargetMachine &TM,
|
||||||
|
CodeGenOpt::Level OptLevel);
|
||||||
|
|
||||||
extern Target ThePTXTarget;
|
extern Target ThePTXTarget;
|
||||||
} // namespace llvm;
|
} // namespace llvm;
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include "PTX.h"
|
#include "PTX.h"
|
||||||
#include "PTXISelLowering.h"
|
#include "PTXISelLowering.h"
|
||||||
|
#include "PTXMachineFunctionInfo.h"
|
||||||
#include "PTXRegisterInfo.h"
|
#include "PTXRegisterInfo.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
#include "llvm/CodeGen/MachineFunction.h"
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
|
@ -107,6 +108,9 @@ SDValue PTXTargetLowering::
|
||||||
SmallVectorImpl<SDValue> &InVals) const {
|
SmallVectorImpl<SDValue> &InVals) const {
|
||||||
if (isVarArg) llvm_unreachable("PTX does not support varargs");
|
if (isVarArg) llvm_unreachable("PTX does not support varargs");
|
||||||
|
|
||||||
|
MachineFunction &MF = DAG.getMachineFunction();
|
||||||
|
PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>();
|
||||||
|
|
||||||
lower_argument_func lower_argument;
|
lower_argument_func lower_argument;
|
||||||
|
|
||||||
switch (CallConv) {
|
switch (CallConv) {
|
||||||
|
@ -114,9 +118,11 @@ SDValue PTXTargetLowering::
|
||||||
llvm_unreachable("Unsupported calling convention");
|
llvm_unreachable("Unsupported calling convention");
|
||||||
break;
|
break;
|
||||||
case CallingConv::PTX_Kernel:
|
case CallingConv::PTX_Kernel:
|
||||||
|
MFI->setKernel();
|
||||||
lower_argument = lower_kernel_argument;
|
lower_argument = lower_kernel_argument;
|
||||||
break;
|
break;
|
||||||
case CallingConv::PTX_Device:
|
case CallingConv::PTX_Device:
|
||||||
|
MFI->setKernel(false);
|
||||||
lower_argument = lower_device_argument;
|
lower_argument = lower_device_argument;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -137,8 +143,15 @@ SDValue PTXTargetLowering::
|
||||||
unsigned reg;
|
unsigned reg;
|
||||||
SDValue arg = lower_argument(i, Chain, dl, VT, entry, DAG, ®);
|
SDValue arg = lower_argument(i, Chain, dl, VT, entry, DAG, ®);
|
||||||
InVals.push_back(arg);
|
InVals.push_back(arg);
|
||||||
|
|
||||||
|
if (!MFI->isDoneAddArg())
|
||||||
|
MFI->addArgReg(reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure we don't add argument registers twice
|
||||||
|
if (!MFI->isDoneAddArg())
|
||||||
|
MFI->doneAddArg();
|
||||||
|
|
||||||
return Chain;
|
return Chain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,6 +187,10 @@ SDValue PTXTargetLowering::
|
||||||
SDValue Flag;
|
SDValue Flag;
|
||||||
unsigned reg = PTX::R0;
|
unsigned reg = PTX::R0;
|
||||||
|
|
||||||
|
MachineFunction &MF = DAG.getMachineFunction();
|
||||||
|
PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>();
|
||||||
|
MFI->setRetReg(reg);
|
||||||
|
|
||||||
// If this is the first return lowered for this function, add the regs to the
|
// If this is the first return lowered for this function, add the regs to the
|
||||||
// liveout set for the function
|
// liveout set for the function
|
||||||
if (DAG.getMachineFunction().getRegInfo().liveout_empty())
|
if (DAG.getMachineFunction().getRegInfo().liveout_empty())
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
//===-- PTXMFInfoExtract.cpp - Extract PTX machine function info ----------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file defines an information extractor for PTX machine functions.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#define DEBUG_TYPE "ptx-mf-info-extract"
|
||||||
|
|
||||||
|
#include "PTX.h"
|
||||||
|
#include "PTXTargetMachine.h"
|
||||||
|
#include "PTXMachineFunctionInfo.h"
|
||||||
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||||
|
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||||
|
#include "llvm/Support/Debug.h"
|
||||||
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
|
#include "llvm/Support/raw_ostream.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
/// PTXMFInfoExtract - PTX specific code to extract of PTX machine
|
||||||
|
/// function information for PTXAsmPrinter
|
||||||
|
///
|
||||||
|
class PTXMFInfoExtract : public MachineFunctionPass {
|
||||||
|
private:
|
||||||
|
static char ID;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PTXMFInfoExtract(PTXTargetMachine &TM, CodeGenOpt::Level OptLevel)
|
||||||
|
: MachineFunctionPass(ID) {}
|
||||||
|
|
||||||
|
virtual bool runOnMachineFunction(MachineFunction &MF);
|
||||||
|
|
||||||
|
virtual const char *getPassName() const {
|
||||||
|
return "PTX Machine Function Info Extractor";
|
||||||
|
}
|
||||||
|
}; // class PTXMFInfoExtract
|
||||||
|
} // namespace llvm
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
char PTXMFInfoExtract::ID = 0;
|
||||||
|
|
||||||
|
bool PTXMFInfoExtract::runOnMachineFunction(MachineFunction &MF) {
|
||||||
|
PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>();
|
||||||
|
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||||
|
|
||||||
|
DEBUG(dbgs() << "****** PTX FUNCTION LOCAL VAR REG DEF ******\n");
|
||||||
|
|
||||||
|
unsigned reg_ret = MFI->retReg();
|
||||||
|
|
||||||
|
// FIXME: This is a slow linear scanning
|
||||||
|
for (unsigned reg = PTX::NoRegister + 1; reg < PTX::NUM_TARGET_REGS; ++reg)
|
||||||
|
if (MRI.isPhysRegUsed(reg) && reg != reg_ret && !MFI->isArgReg(reg))
|
||||||
|
MFI->addLocalVarReg(reg);
|
||||||
|
|
||||||
|
// Notify MachineFunctionInfo that I've done adding local var reg
|
||||||
|
MFI->doneAddLocalVar();
|
||||||
|
|
||||||
|
DEBUG(for (PTXMachineFunctionInfo::reg_iterator
|
||||||
|
i = MFI->localVarRegBegin(), e = MFI->localVarRegEnd();
|
||||||
|
i != e; ++i)
|
||||||
|
dbgs() << "Used Reg: " << *i << "\n";);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionPass *llvm::createPTXMFInfoExtract(PTXTargetMachine &TM,
|
||||||
|
CodeGenOpt::Level OptLevel) {
|
||||||
|
return new PTXMFInfoExtract(TM, OptLevel);
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
//===- PTXMachineFuctionInfo.h - PTX 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 PTX-specific per-machine-function information.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef PTX_MACHINE_FUNCTION_INFO_H
|
||||||
|
#define PTX_MACHINE_FUNCTION_INFO_H
|
||||||
|
|
||||||
|
#include "PTX.h"
|
||||||
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
/// PTXMachineFunctionInfo - This class is derived from MachineFunction and
|
||||||
|
/// contains private PTX target-specific information for each MachineFunction.
|
||||||
|
///
|
||||||
|
class PTXMachineFunctionInfo : public MachineFunctionInfo {
|
||||||
|
private:
|
||||||
|
bool is_kernel;
|
||||||
|
std::vector<unsigned> reg_arg, reg_local_var;
|
||||||
|
unsigned reg_ret;
|
||||||
|
bool _isDoneAddArg;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PTXMachineFunctionInfo(MachineFunction &MF)
|
||||||
|
: is_kernel(false), reg_ret(PTX::NoRegister), _isDoneAddArg(false) {
|
||||||
|
reg_arg.reserve(32);
|
||||||
|
reg_local_var.reserve(64);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setKernel(bool _is_kernel=true) { is_kernel = _is_kernel; }
|
||||||
|
|
||||||
|
void addArgReg(unsigned reg) { reg_arg.push_back(reg); }
|
||||||
|
void addLocalVarReg(unsigned reg) { reg_local_var.push_back(reg); }
|
||||||
|
void setRetReg(unsigned reg) { reg_ret = reg; }
|
||||||
|
|
||||||
|
void doneAddArg(void) {
|
||||||
|
std::sort(reg_arg.begin(), reg_arg.end());
|
||||||
|
_isDoneAddArg = true;
|
||||||
|
}
|
||||||
|
void doneAddLocalVar(void) {
|
||||||
|
std::sort(reg_local_var.begin(), reg_local_var.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isDoneAddArg(void) { return _isDoneAddArg; }
|
||||||
|
|
||||||
|
bool isKernel() const { return is_kernel; }
|
||||||
|
|
||||||
|
typedef std::vector<unsigned>::const_iterator reg_iterator;
|
||||||
|
|
||||||
|
bool argRegEmpty() const { return reg_arg.empty(); }
|
||||||
|
reg_iterator argRegBegin() const { return reg_arg.begin(); }
|
||||||
|
reg_iterator argRegEnd() const { return reg_arg.end(); }
|
||||||
|
|
||||||
|
bool localVarRegEmpty() const { return reg_local_var.empty(); }
|
||||||
|
reg_iterator localVarRegBegin() const { return reg_local_var.begin(); }
|
||||||
|
reg_iterator localVarRegEnd() const { return reg_local_var.end(); }
|
||||||
|
|
||||||
|
unsigned retReg() const { return reg_ret; }
|
||||||
|
|
||||||
|
bool isArgReg(unsigned reg) const {
|
||||||
|
return std::binary_search(reg_arg.begin(), reg_arg.end(), reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isLocalVarReg(unsigned reg) const {
|
||||||
|
return std::binary_search(reg_local_var.begin(), reg_local_var.end(), reg);
|
||||||
|
}
|
||||||
|
}; // class PTXMachineFunctionInfo
|
||||||
|
} // namespace llvm
|
||||||
|
|
||||||
|
#endif // PTX_MACHINE_FUNCTION_INFO_H
|
|
@ -41,5 +41,6 @@ PTXTargetMachine::PTXTargetMachine(const Target &T,
|
||||||
bool PTXTargetMachine::addInstSelector(PassManagerBase &PM,
|
bool PTXTargetMachine::addInstSelector(PassManagerBase &PM,
|
||||||
CodeGenOpt::Level OptLevel) {
|
CodeGenOpt::Level OptLevel) {
|
||||||
PM.add(createPTXISelDag(*this, OptLevel));
|
PM.add(createPTXISelDag(*this, OptLevel));
|
||||||
|
PM.add(createPTXMFInfoExtract(*this, OptLevel));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue