mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Don't use MRI liveouts in R600.
Something very strange is going on with the output registers in this target. Its ISelLowering code is inserting dangling CopyToReg nodes, hoping that those physregs won't get clobbered before the RETURN. This patch adds the output registers as implicit uses on RETURN instructions in the custom emission pass. I'd much prefer to have those CopyToReg nodes glued to the RETURNs, but I don't see how. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174400 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0a9d1d31e9
commit
a499d2bcef
@ -266,6 +266,15 @@ MachineBasicBlock * R600TargetLowering::EmitInstrWithCustomInserter(
|
||||
.addImm(EOP);
|
||||
break;
|
||||
}
|
||||
case AMDGPU::RETURN: {
|
||||
// RETURN instructions must have the live-out registers as implicit uses,
|
||||
// otherwise they appear dead.
|
||||
R600MachineFunctionInfo *MFI = MF->getInfo<R600MachineFunctionInfo>();
|
||||
MachineInstrBuilder MIB(*MF, MI);
|
||||
for (unsigned i = 0, e = MFI->LiveOuts.size(); i != e; ++i)
|
||||
MIB.addReg(MFI->LiveOuts[i], RegState::Implicit);
|
||||
return BB;
|
||||
}
|
||||
}
|
||||
|
||||
MI->eraseFromParent();
|
||||
@ -348,12 +357,10 @@ SDValue R600TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const
|
||||
switch (IntrinsicID) {
|
||||
case AMDGPUIntrinsic::AMDGPU_store_output: {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
R600MachineFunctionInfo *MFI = MF.getInfo<R600MachineFunctionInfo>();
|
||||
int64_t RegIndex = cast<ConstantSDNode>(Op.getOperand(3))->getZExtValue();
|
||||
unsigned Reg = AMDGPU::R600_TReg32RegClass.getRegister(RegIndex);
|
||||
if (!MRI.isLiveOut(Reg)) {
|
||||
MRI.addLiveOut(Reg);
|
||||
}
|
||||
MFI->LiveOuts.push_back(Reg);
|
||||
return DAG.getCopyToReg(Chain, Op.getDebugLoc(), Reg, Op.getOperand(2));
|
||||
}
|
||||
case AMDGPUIntrinsic::R600_store_pixel_color: {
|
||||
|
@ -1580,7 +1580,8 @@ def FNEG_R600 : FNEG<R600_Reg32>;
|
||||
//===---------------------------------------------------------------------===//
|
||||
// Return instruction
|
||||
//===---------------------------------------------------------------------===//
|
||||
let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in {
|
||||
let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1,
|
||||
usesCustomInserter = 1 in {
|
||||
def RETURN : ILFormat<(outs), (ins variable_ops),
|
||||
"RETURN", [(IL_retflag)]>;
|
||||
}
|
||||
|
@ -23,6 +23,7 @@ class R600MachineFunctionInfo : public MachineFunctionInfo {
|
||||
|
||||
public:
|
||||
R600MachineFunctionInfo(const MachineFunction &MF);
|
||||
SmallVector<unsigned, 4> LiveOuts;
|
||||
SDNode *Outputs[16];
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user