diff options
Diffstat (limited to 'lib/Target/R600/SILowerControlFlow.cpp')
| -rw-r--r-- | lib/Target/R600/SILowerControlFlow.cpp | 42 | 
1 files changed, 30 insertions, 12 deletions
| diff --git a/lib/Target/R600/SILowerControlFlow.cpp b/lib/Target/R600/SILowerControlFlow.cpp index 958763dffc22..ef867d36692d 100644 --- a/lib/Target/R600/SILowerControlFlow.cpp +++ b/lib/Target/R600/SILowerControlFlow.cpp @@ -109,6 +109,23 @@ FunctionPass *llvm::createSILowerControlFlowPass(TargetMachine &tm) {    return new SILowerControlFlowPass(tm);  } +static bool isDS(unsigned Opcode) { +  switch(Opcode) { +  default: return false; +  case AMDGPU::DS_ADD_U32_RTN: +  case AMDGPU::DS_SUB_U32_RTN: +  case AMDGPU::DS_WRITE_B32: +  case AMDGPU::DS_WRITE_B8: +  case AMDGPU::DS_WRITE_B16: +  case AMDGPU::DS_READ_B32: +  case AMDGPU::DS_READ_I8: +  case AMDGPU::DS_READ_U8: +  case AMDGPU::DS_READ_I16: +  case AMDGPU::DS_READ_U16: +    return true; +  } +} +  bool SILowerControlFlowPass::shouldSkip(MachineBasicBlock *From,                                          MachineBasicBlock *To) { @@ -145,7 +162,9 @@ void SILowerControlFlowPass::SkipIfDead(MachineInstr &MI) {    MachineBasicBlock &MBB = *MI.getParent();    DebugLoc DL = MI.getDebugLoc(); -  if (!shouldSkip(&MBB, &MBB.getParent()->back())) +  if (MBB.getParent()->getInfo<SIMachineFunctionInfo>()->ShaderType != +      ShaderType::PIXEL || +      !shouldSkip(&MBB, &MBB.getParent()->back()))      return;    MachineBasicBlock::iterator Insert = &MI; @@ -296,9 +315,11 @@ void SILowerControlFlowPass::Kill(MachineInstr &MI) {    MachineBasicBlock &MBB = *MI.getParent();    DebugLoc DL = MI.getDebugLoc(); -  // Kill is only allowed in pixel shaders +  // Kill is only allowed in pixel / geometry shaders    assert(MBB.getParent()->getInfo<SIMachineFunctionInfo>()->ShaderType == -         ShaderType::PIXEL); +         ShaderType::PIXEL || +         MBB.getParent()->getInfo<SIMachineFunctionInfo>()->ShaderType == +         ShaderType::GEOMETRY);    // Clear this pixel from the exec mask if the operand is negative    BuildMI(MBB, &MI, DL, TII->get(AMDGPU::V_CMPX_LE_F32_e32), AMDGPU::VCC) @@ -431,6 +452,11 @@ bool SILowerControlFlowPass::runOnMachineFunction(MachineFunction &MF) {        Next = llvm::next(I);        MachineInstr &MI = *I; +      if (isDS(MI.getOpcode())) { +        NeedM0 = true; +        NeedWQM = true; +      } +        switch (MI.getOpcode()) {          default: break;          case AMDGPU::SI_IF: @@ -491,14 +517,6 @@ bool SILowerControlFlowPass::runOnMachineFunction(MachineFunction &MF) {            IndirectDst(MI);            break; -        case AMDGPU::DS_READ_B32: -          NeedWQM = true; -          // Fall through -        case AMDGPU::DS_WRITE_B32: -        case AMDGPU::DS_ADD_U32_RTN: -          NeedM0 = true; -          break; -          case AMDGPU::V_INTERP_P1_F32:          case AMDGPU::V_INTERP_P2_F32:          case AMDGPU::V_INTERP_MOV_F32: @@ -517,7 +535,7 @@ bool SILowerControlFlowPass::runOnMachineFunction(MachineFunction &MF) {              AMDGPU::M0).addImm(0xffffffff);    } -  if (NeedWQM && MFI->ShaderType != ShaderType::COMPUTE) { +  if (NeedWQM && MFI->ShaderType == ShaderType::PIXEL) {      MachineBasicBlock &MBB = MF.front();      BuildMI(MBB, MBB.getFirstNonPHI(), DebugLoc(), TII->get(AMDGPU::S_WQM_B64),              AMDGPU::EXEC).addReg(AMDGPU::EXEC); | 
