Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Analysis / UniformityAnalysis / AMDGPU / always_uniform.ll
blobd7d8d29fbfd42e5c0719b327666559a4ac637259
1 ; RUN: opt -mtriple amdgcn-unknown-amdhsa -passes='print<uniformity>' -disable-output %s 2>&1 | FileCheck %s
3 ; CHECK-LABEL: for function 'readfirstlane':
4 define amdgpu_kernel void @readfirstlane() {
5   %id.x = call i32 @llvm.amdgcn.workitem.id.x()
6 ; CHECK: DIVERGENT:  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
7   %first.lane = call i32 @llvm.amdgcn.readfirstlane(i32 %id.x)
8 ; CHECK-NOT: DIVERGENT:  %first.lane = call i32 @llvm.amdgcn.readfirstlane(i32 %id.x)
9   ret void
12 ; CHECK-LABEL: for function 'icmp':
13 define amdgpu_kernel void @icmp(i32 inreg %x) {
14 ; CHECK-NOT: DIVERGENT:  %icmp = call i64 @llvm.amdgcn.icmp.i32
15   %icmp = call i64 @llvm.amdgcn.icmp.i32(i32 %x, i32 0, i32 33)
16   ret void
19 ; CHECK-LABEL: for function 'fcmp':
20 define amdgpu_kernel void @fcmp(float inreg %x, float inreg %y) {
21 ; CHECK-NOT: DIVERGENT:  %fcmp = call i64 @llvm.amdgcn.fcmp.i32
22   %fcmp = call i64 @llvm.amdgcn.fcmp.i32(float %x, float %y, i32 33)
23   ret void
26 ; CHECK-LABEL: for function 'ballot':
27 define amdgpu_kernel void @ballot(i1 inreg %x) {
28 ; CHECK-NOT: DIVERGENT:  %ballot = call i64 @llvm.amdgcn.ballot.i32
29   %ballot = call i64 @llvm.amdgcn.ballot.i32(i1 %x)
30   ret void
33 ; SGPR asm outputs are uniform regardless of the input operands.
34 ; CHECK-LABEL: for function 'asm_sgpr':
35 ; CHECK: DIVERGENT: i32 %divergent
36 ; CHECK-NOT: DIVERGENT
37 define i32 @asm_sgpr(i32 %divergent) {
38   %sgpr = call i32 asm "; def $0, $1","=s,v"(i32 %divergent)
39   ret i32 %sgpr
42 ; SGPR asm outputs are uniform regardless of the input operands.
43 ; Argument not divergent if marked inreg.
44 ; CHECK-LABEL: for function 'asm_sgpr_inreg_arg':
45 ; CHECK-NOT: DIVERGENT
46 define i32 @asm_sgpr_inreg_arg(i32 inreg %divergent) {
47   %sgpr = call i32 asm "; def $0, $1","=s,v"(i32 %divergent)
48   ret i32 %sgpr
51 ; CHECK-LABEL: for function 'asm_mixed_sgpr_vgpr':
52 ; CHECK: DIVERGENT: %asm = call { i32, i32 } asm "; def $0, $1, $2", "=s,=v,v"(i32 %divergent)
53 ; CHECK-NEXT: {{^[ \t]+}}%sgpr = extractvalue { i32, i32 } %asm, 0
54 ; CHECK-NEXT: DIVERGENT:       %vgpr = extractvalue { i32, i32 } %asm, 1
55 define void @asm_mixed_sgpr_vgpr(i32 %divergent) {
56   %asm = call { i32, i32 } asm "; def $0, $1, $2","=s,=v,v"(i32 %divergent)
57   %sgpr = extractvalue { i32, i32 } %asm, 0
58   %vgpr = extractvalue { i32, i32 } %asm, 1
59   store i32 %sgpr, ptr addrspace(1) undef
60   store i32 %vgpr, ptr addrspace(1) undef
61   ret void
64 ; CHECK-LABEL: for function 'single_lane_func_arguments':
65 ; CHECK-NOT: DIVERGENT
66 define void @single_lane_func_arguments(i32 %i32, i1 %i1) #2 {
67  ret void
70 ; CHECK-LABEL: for function 'divergent_args':
71 ; CHECK: DIVERGENT ARGUMENTS
72 define void @divergent_args(i32 %i32, i1 %i1) {
73  ret void
76 ; CHECK-LABEL: for function 'no_divergent_args_if_inreg':
77 ; CHECK-NOT: DIVERGENT
78 define void @no_divergent_args_if_inreg(i32 inreg %i32, i1 inreg %i1) {
79  ret void
82 declare i32 @llvm.amdgcn.workitem.id.x() #0
83 declare i32 @llvm.amdgcn.readfirstlane(i32) #0
84 declare i64 @llvm.amdgcn.icmp.i32(i32, i32, i32) #1
85 declare i64 @llvm.amdgcn.fcmp.i32(float, float, i32) #1
86 declare i64 @llvm.amdgcn.ballot.i32(i1) #1
88 attributes #0 = { nounwind readnone }
89 attributes #1 = { nounwind readnone convergent }
90 attributes #2 = { "amdgpu-flat-work-group-size"="1,1" }