summaryrefslogtreecommitdiff
path: root/lib/Target/R600/SIMachineFunctionInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/R600/SIMachineFunctionInfo.cpp')
-rw-r--r--lib/Target/R600/SIMachineFunctionInfo.cpp51
1 files changed, 42 insertions, 9 deletions
diff --git a/lib/Target/R600/SIMachineFunctionInfo.cpp b/lib/Target/R600/SIMachineFunctionInfo.cpp
index af609958129..e4a39f65674 100644
--- a/lib/Target/R600/SIMachineFunctionInfo.cpp
+++ b/lib/Target/R600/SIMachineFunctionInfo.cpp
@@ -12,6 +12,7 @@
#include "SIMachineFunctionInfo.h"
#include "SIInstrInfo.h"
#include "SIRegisterInfo.h"
+#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/LLVMContext.h"
@@ -26,8 +27,22 @@ void SIMachineFunctionInfo::anchor() {}
SIMachineFunctionInfo::SIMachineFunctionInfo(const MachineFunction &MF)
: AMDGPUMachineFunction(MF),
+ SpillTIDVirtualReg(AMDGPU::NoRegister),
PSInputAddr(0),
- SpillTracker() { }
+ SpillTracker(),
+ LDSWaveSpillSize(0),
+ HasCalculatedTIDOffset(false) { }
+
+static void addFunctionLiveOut(unsigned Reg, MachineFunction *MF) {
+ for (MachineBasicBlock &MBB : *MF) {
+ if (MBB.back().getOpcode() == AMDGPU::S_ENDPGM) {
+ MBB.back().addOperand(*MF, MachineOperand::CreateReg(Reg, false, true));
+ return;
+ }
+ }
+ MF->getFunction()->getContext().emitError(
+ "Could not found S_ENGPGM instrtuction.");
+}
static unsigned createLaneVGPR(MachineRegisterInfo &MRI, MachineFunction *MF) {
unsigned VGPR = MRI.createVirtualRegister(&AMDGPU::VReg_32RegClass);
@@ -55,15 +70,8 @@ static unsigned createLaneVGPR(MachineRegisterInfo &MRI, MachineFunction *MF) {
//
// To work around this, we add Lane VGPRs to the functions live out list,
// so that we can guarantee its live range will cover all of its uses.
+ addFunctionLiveOut(VGPR, MF);
- for (MachineBasicBlock &MBB : *MF) {
- if (MBB.back().getOpcode() == AMDGPU::S_ENDPGM) {
- MBB.back().addOperand(*MF, MachineOperand::CreateReg(VGPR, false, true));
- return VGPR;
- }
- }
- MF->getFunction()->getContext().emitError(
- "Could not found S_ENGPGM instrtuction.");
return VGPR;
}
@@ -92,3 +100,28 @@ const SIMachineFunctionInfo::SpilledReg&
SIMachineFunctionInfo::RegSpillTracker::getSpilledReg(unsigned FrameIndex) {
return SpilledRegisters[FrameIndex];
}
+
+unsigned SIMachineFunctionInfo::getSpillTIDVirtualReg(
+ MachineRegisterInfo &MRI,
+ MachineFunction *MF) {
+ if (SpillTIDVirtualReg == AMDGPU::NoRegister) {
+ SpillTIDVirtualReg = MRI.createVirtualRegister(&AMDGPU::VReg_32RegClass);
+ MachineBasicBlock &Entry = MF->front();
+ MachineBasicBlock::iterator Insert = Entry.front();
+ Insert->addOperand(MachineOperand::CreateReg(SpillTIDVirtualReg,
+ true, true));
+ addFunctionLiveOut(SpillTIDVirtualReg, MF);
+ }
+
+ return SpillTIDVirtualReg;
+}
+
+unsigned SIMachineFunctionInfo::allocateLDSSpaceForSpill(unsigned FrameIndex,
+ unsigned NumBytes) {
+ if (!LDSSpillOffsets.count(FrameIndex)) {
+ LDSSpillOffsets[FrameIndex] = LDSWaveSpillSize;
+ LDSWaveSpillSize += NumBytes;
+ }
+
+ return LDSSpillOffsets[FrameIndex];
+}