diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-08-01 18:41:32 +0000 | 
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-08-01 18:41:32 +0000 | 
| commit | bb582ebdba0e85b3ef1661d9ea0bd824f55c32ae (patch) | |
| tree | 7ee42a7c6c9c87054eb4bf467a0df3710d57706b /llvm/lib | |
| parent | e56a2ad85e381e86c9a9f6df0a8e79964ec14bb9 (diff) | |
| download | bcm5719-llvm-bb582ebdba0e85b3ef1661d9ea0bd824f55c32ae.tar.gz bcm5719-llvm-bb582ebdba0e85b3ef1661d9ea0bd824f55c32ae.zip | |
AMDGPU: Remove v0 workaround for DS_GWS_* instructions
Any register should work for the src field since r366067, since the
used value is not pulled from the expected encoding field.
llvm-svn: 367598
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp | 20 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 18 | 
2 files changed, 4 insertions, 34 deletions
| diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp index e8de28263f9..3851ee8968b 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp @@ -2189,22 +2189,7 @@ void AMDGPUDAGToDAGISel::SelectDS_GWS(SDNode *N, unsigned IntrID) {      glueCopyToM0(N, SDValue(M0Base, 0));    } -  SDValue V0;    SDValue Chain = N->getOperand(0); -  SDValue Glue; -  if (HasVSrc) { -    SDValue VSrc0 = N->getOperand(2); - -    // The manual doesn't mention this, but it seems only v0 works. -    V0 = CurDAG->getRegister(AMDGPU::VGPR0, MVT::i32); - -    SDValue CopyToV0 = CurDAG->getCopyToReg( -      N->getOperand(0), SL, V0, VSrc0, -      N->getOperand(N->getNumOperands() - 1)); -    Chain = CopyToV0; -    Glue = CopyToV0.getValue(1); -  } -    SDValue OffsetField = CurDAG->getTargetConstant(ImmOffset, SL, MVT::i32);    // TODO: Can this just be removed from the instruction? @@ -2213,14 +2198,11 @@ void AMDGPUDAGToDAGISel::SelectDS_GWS(SDNode *N, unsigned IntrID) {    const unsigned Opc = gwsIntrinToOpcode(IntrID);    SmallVector<SDValue, 5> Ops;    if (HasVSrc) -    Ops.push_back(V0); +    Ops.push_back(N->getOperand(2));    Ops.push_back(OffsetField);    Ops.push_back(GDS);    Ops.push_back(Chain); -  if (HasVSrc) -    Ops.push_back(Glue); -    SDNode *Selected = CurDAG->SelectNodeTo(N, Opc, N->getVTList(), Ops);    CurDAG->setNodeMemRefs(cast<MachineSDNode>(Selected), {MMO});  } diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp index bee25c9d184..a14a8929aa4 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp @@ -3096,12 +3096,13 @@ SITargetLowering::emitGWSMemViolTestLoop(MachineInstr &MI,    MachineBasicBlock *RemainderBB;    const SIInstrInfo *TII = getSubtarget()->getInstrInfo(); -  MachineBasicBlock::iterator Prev = std::prev(MI.getIterator()); +  // Apparently kill flags are only valid if the def is in the same block? +  if (MachineOperand *Src = TII->getNamedOperand(MI, AMDGPU::OpName::data0)) +    Src->setIsKill(false);    std::tie(LoopBB, RemainderBB) = splitBlockForLoop(MI, *BB, true);    MachineBasicBlock::iterator I = LoopBB->end(); -  MachineOperand *Src = TII->getNamedOperand(MI, AMDGPU::OpName::data0);    const unsigned EncodedReg = AMDGPU::Hwreg::encodeHwreg(      AMDGPU::Hwreg::ID_TRAPSTS, AMDGPU::Hwreg::OFFSET_MEM_VIOL, 1); @@ -3111,19 +3112,6 @@ SITargetLowering::emitGWSMemViolTestLoop(MachineInstr &MI,      .addImm(0)      .addImm(EncodedReg); -  // This is a pain, but we're not allowed to have physical register live-ins -  // yet. Insert a pair of copies if the VGPR0 hack is necessary. -  if (Src && TargetRegisterInfo::isPhysicalRegister(Src->getReg())) { -    unsigned Data0 = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); -    BuildMI(*BB, std::next(Prev), DL, TII->get(AMDGPU::COPY), Data0) -      .add(*Src); - -    BuildMI(*LoopBB, LoopBB->begin(), DL, TII->get(AMDGPU::COPY), Src->getReg()) -      .addReg(Data0); - -    MRI.setSimpleHint(Data0, Src->getReg()); -  } -    bundleInstWithWaitcnt(MI);    unsigned Reg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); | 

