diff options
Diffstat (limited to 'contrib/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp')
| -rw-r--r-- | contrib/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp | 22 | 
1 files changed, 18 insertions, 4 deletions
| diff --git a/contrib/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp b/contrib/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp index c6396de89c4f..69ddbfb53958 100644 --- a/contrib/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp +++ b/contrib/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp @@ -88,14 +88,28 @@ static bool isSMovRel(unsigned Opcode) {    }  } -static bool isSendMsgTraceDataOrGDS(const MachineInstr &MI) { +static bool isSendMsgTraceDataOrGDS(const SIInstrInfo &TII, +                                    const MachineInstr &MI) { +  if (TII.isAlwaysGDS(MI.getOpcode())) +    return true; +    switch (MI.getOpcode()) {    case AMDGPU::S_SENDMSG:    case AMDGPU::S_SENDMSGHALT:    case AMDGPU::S_TTRACEDATA:      return true; +  // These DS opcodes don't support GDS. +  case AMDGPU::DS_NOP: +  case AMDGPU::DS_PERMUTE_B32: +  case AMDGPU::DS_BPERMUTE_B32: +    return false;    default: -    // TODO: GDS +    if (TII.isDS(MI.getOpcode())) { +      int GDS = AMDGPU::getNamedOperandIdx(MI.getOpcode(), +                                           AMDGPU::OpName::gds); +      if (MI.getOperand(GDS).getImm()) +        return true; +    }      return false;    }  } @@ -145,7 +159,7 @@ GCNHazardRecognizer::getHazardType(SUnit *SU, int Stalls) {        checkReadM0Hazards(MI) > 0)      return NoopHazard; -  if (ST.hasReadM0SendMsgHazard() && isSendMsgTraceDataOrGDS(*MI) && +  if (ST.hasReadM0SendMsgHazard() && isSendMsgTraceDataOrGDS(TII, *MI) &&        checkReadM0Hazards(MI) > 0)      return NoopHazard; @@ -199,7 +213,7 @@ unsigned GCNHazardRecognizer::PreEmitNoops(MachineInstr *MI) {                                             isSMovRel(MI->getOpcode())))      return std::max(WaitStates, checkReadM0Hazards(MI)); -  if (ST.hasReadM0SendMsgHazard() && isSendMsgTraceDataOrGDS(*MI)) +  if (ST.hasReadM0SendMsgHazard() && isSendMsgTraceDataOrGDS(TII, *MI))      return std::max(WaitStates, checkReadM0Hazards(MI));    return WaitStates; | 
