Skip to content

Commit

Permalink
Merging r268259:
Browse files Browse the repository at this point in the history
------------------------------------------------------------------------
r268259 | nhaehnle | 2016-05-02 10:37:01 -0700 (Mon, 02 May 2016) | 14 lines

AMDGPU: llvm.SI.fs.constant is a source of divergence

Summary:
This intrinsic is used to get flat-shaded fragment shader inputs. Those are
uniform across a primitive, but a fragment shader wave may process pixels from
multiple primitives (as indicated by the prim_mask), and so that's where
divergence can arise.

Reviewers: arsenm, tstellarAMD

Subscribers: arsenm, llvm-commits

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

------------------------------------------------------------------------

llvm-svn: 271769
  • Loading branch information
tstellarAMD committed Jun 4, 2016
1 parent 1087f76 commit 8310438
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
1 change: 1 addition & 0 deletions llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp
Expand Up @@ -131,6 +131,7 @@ static bool isIntrinsicSourceOfDivergence(const TargetIntrinsicInfo *TII,
return false;
case AMDGPUIntrinsic::SI_tid:
case AMDGPUIntrinsic::SI_fs_interp:
case AMDGPUIntrinsic::SI_fs_constant:
return true;
}
}
Expand Down
23 changes: 23 additions & 0 deletions llvm/test/Analysis/DivergenceAnalysis/AMDGPU/interp-intrinsics.ll
@@ -0,0 +1,23 @@
; RUN: opt -mtriple amdgcn--- -analyze -divergence %s | FileCheck %s

; CHECK-LABEL: 'fs_interp'
; CHECK: DIVERGENT: %v = call float @llvm.SI.fs.interp(
define void @fs_interp(i32 inreg %prim_mask, <2 x i32> %interp_param) #1 {
%v = call float @llvm.SI.fs.interp(i32 0, i32 0, i32 %prim_mask, <2 x i32> %interp_param)
store volatile float %v, float addrspace(1)* undef
ret void
}

; CHECK-LABEL: 'fs_constant'
; CHECK: DIVERGENT: %v = call float @llvm.SI.fs.constant(
define void @fs_constant(i32 inreg %prim_mask, <2 x i32> %interp_param) #1 {
%v = call float @llvm.SI.fs.constant(i32 0, i32 0, i32 %prim_mask)
store volatile float %v, float addrspace(1)* undef
ret void
}

declare float @llvm.SI.fs.interp(i32, i32, i32, <2 x i32>) #0
declare float @llvm.SI.fs.constant(i32, i32, i32) #0

attributes #0 = { nounwind readnone }
attributes #1 = { "ShaderType"="1"}

0 comments on commit 8310438

Please sign in to comment.