[Mesa-dev] [PATCH v2 1/2] R600/SI: Allow SI_KILL for geometry shaders
Tom Stellard
tom at stellard.net
Tue Feb 25 08:47:18 PST 2014
On Tue, Feb 25, 2014 at 07:36:46PM +0900, Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
Reviewed-by: Tom Stellard <thomas.stellard at amd.com>
> ---
>
> v2:
> * Bail in SILowerControlFlowPass::SkipIfDead() for geometry shaders, as
> the backend can't ensure M0 contains the proper value for S_SENDMSG by
> itself.
> * Use just 'SI' as the lit test prefix.
>
> lib/Target/R600/SILowerControlFlow.cpp | 10 +++++++---
> test/CodeGen/R600/llvm.AMDGPU.kill.ll | 18 ++++++++++++++++++
> 2 files changed, 25 insertions(+), 3 deletions(-)
> create mode 100644 test/CodeGen/R600/llvm.AMDGPU.kill.ll
>
> diff --git a/lib/Target/R600/SILowerControlFlow.cpp b/lib/Target/R600/SILowerControlFlow.cpp
> index f6f9016..fa5ee16 100644
> --- a/lib/Target/R600/SILowerControlFlow.cpp
> +++ b/lib/Target/R600/SILowerControlFlow.cpp
> @@ -145,7 +145,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;
> @@ -293,9 +295,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)
> diff --git a/test/CodeGen/R600/llvm.AMDGPU.kill.ll b/test/CodeGen/R600/llvm.AMDGPU.kill.ll
> new file mode 100644
> index 0000000..bec5cdf
> --- /dev/null
> +++ b/test/CodeGen/R600/llvm.AMDGPU.kill.ll
> @@ -0,0 +1,18 @@
> +; RUN: llc < %s -march=r600 -mcpu=verde -verify-machineinstrs | FileCheck --check-prefix=SI %s
> +
> +; SI-LABEL: @kill_gs
> +; SI: V_CMPX_LE_F32
> +
> +define void @kill_gs() #0 {
> +main_body:
> + %0 = icmp ule i32 0, 3
> + %1 = select i1 %0, float 1.000000e+00, float -1.000000e+00
> + call void @llvm.AMDGPU.kill(float %1)
> + ret void
> +}
> +
> +declare void @llvm.AMDGPU.kill(float)
> +
> +attributes #0 = { "ShaderType"="2" }
> +
> +!0 = metadata !{metadata !"const", null, i32 1}
> --
> 1.9.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list