AMDGPU: Add SIWholeQuadMode pass
authorNicolai Haehnle <nhaehnle@gmail.com>
Mon, 21 Mar 2016 20:28:33 +0000 (20:28 +0000)
committerNicolai Haehnle <nhaehnle@gmail.com>
Mon, 21 Mar 2016 20:28:33 +0000 (20:28 +0000)
commit213e87f2ee2f5f5fa5704346d2f73df1d61a2f02
tree8a56086de35da4d164e198a0b26e93122b564380
parentb14f4fd0defd496c0c5ac6fc36aa15e9c7f450ce
AMDGPU: Add SIWholeQuadMode pass

Summary:
Whole quad mode is already enabled for pixel shaders that compute
derivatives, but it must be suspended for instructions that cause a
shader to have side effects (i.e. stores and atomics).

This pass addresses the issue by storing the real (initial) live mask
in a register, masking EXEC before instructions that require exact
execution and (re-)enabling WQM where required.

This pass is run before register coalescing so that we can use
machine SSA for analysis.

The changes in this patch expose a problem with the second machine
scheduling pass: target independent instructions like COPY implicitly
use EXEC when they operate on VGPRs, but this fact is not encoded in
the MIR. This can lead to miscompilation because instructions are
moved past changes to EXEC.

This patch fixes the problem by adding use-implicit operands to
target independent instructions. Some general codegen passes are
relaxed to work with such implicit use operands.

Reviewers: arsenm, tstellarAMD, mareko

Subscribers: MatzeB, arsenm, llvm-commits

Differential Revision: http://reviews.llvm.org/D18162

llvm-svn: 263982
llvm/lib/Target/AMDGPU/AMDGPU.h
llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.h
llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
llvm/lib/Target/AMDGPU/CMakeLists.txt
llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
llvm/lib/Target/AMDGPU/SIInstrInfo.h
llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp
llvm/lib/Target/AMDGPU/SIRegisterInfo.h
llvm/lib/Target/AMDGPU/SIWholeQuadMode.cpp [new file with mode: 0644]
llvm/test/CodeGen/AMDGPU/wqm.ll [new file with mode: 0644]