1; RUN: opt -mtriple amdgcn-unknown-amdhsa -passes='print<uniformity>' -disable-output %s 2>&1 | FileCheck %s 2 3declare i32 @llvm.amdgcn.workitem.id.x() #0 4declare i32 @llvm.amdgcn.workitem.id.y() #0 5declare i32 @llvm.amdgcn.workitem.id.z() #0 6declare i32 @llvm.amdgcn.mbcnt.lo(i32, i32) #0 7declare i32 @llvm.amdgcn.mbcnt.hi(i32, i32) #0 8 9; CHECK: DIVERGENT: %id.x = call i32 @llvm.amdgcn.workitem.id.x() 10define amdgpu_kernel void @workitem_id_x() #1 { 11 %id.x = call i32 @llvm.amdgcn.workitem.id.x() 12 store volatile i32 %id.x, ptr addrspace(1) undef 13 ret void 14} 15 16; CHECK: DIVERGENT: %id.y = call i32 @llvm.amdgcn.workitem.id.y() 17define amdgpu_kernel void @workitem_id_y() #1 { 18 %id.y = call i32 @llvm.amdgcn.workitem.id.y() 19 store volatile i32 %id.y, ptr addrspace(1) undef 20 ret void 21} 22 23; CHECK: DIVERGENT: %id.z = call i32 @llvm.amdgcn.workitem.id.z() 24define amdgpu_kernel void @workitem_id_z() #1 { 25 %id.z = call i32 @llvm.amdgcn.workitem.id.z() 26 store volatile i32 %id.z, ptr addrspace(1) undef 27 ret void 28} 29 30; CHECK: DIVERGENT: %mbcnt.lo = call i32 @llvm.amdgcn.mbcnt.lo(i32 0, i32 0) 31define amdgpu_kernel void @mbcnt_lo() #1 { 32 %mbcnt.lo = call i32 @llvm.amdgcn.mbcnt.lo(i32 0, i32 0) 33 store volatile i32 %mbcnt.lo, ptr addrspace(1) undef 34 ret void 35} 36 37; CHECK: DIVERGENT: %mbcnt.hi = call i32 @llvm.amdgcn.mbcnt.hi(i32 0, i32 0) 38define amdgpu_kernel void @mbcnt_hi() #1 { 39 %mbcnt.hi = call i32 @llvm.amdgcn.mbcnt.hi(i32 0, i32 0) 40 store volatile i32 %mbcnt.hi, ptr addrspace(1) undef 41 ret void 42} 43 44; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_singlethreaded': 45; CHECK-NOT: DIVERGENT 46define amdgpu_kernel void @workitem_id_x_singlethreaded() #2 { 47 %id.x = call i32 @llvm.amdgcn.workitem.id.x() 48 store volatile i32 %id.x, ptr addrspace(1) undef 49 ret void 50} 51 52; CHECK-LABEL: UniformityInfo for function 'workitem_id_y_singlethreaded': 53; CHECK-NOT: DIVERGENT 54define amdgpu_kernel void @workitem_id_y_singlethreaded() #2 { 55 %id.x = call i32 @llvm.amdgcn.workitem.id.y() 56 store volatile i32 %id.x, ptr addrspace(1) undef 57 ret void 58} 59 60; CHECK-LABEL: UniformityInfo for function 'workitem_id_z_singlethreaded': 61; CHECK-NOT: DIVERGENT 62define amdgpu_kernel void @workitem_id_z_singlethreaded() #2 { 63 %id.x = call i32 @llvm.amdgcn.workitem.id.y() 64 store volatile i32 %id.x, ptr addrspace(1) undef 65 ret void 66} 67 68; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_singlethreaded_md': 69; CHECK-NOT: DIVERGENT 70define amdgpu_kernel void @workitem_id_x_singlethreaded_md() !reqd_work_group_size !0 { 71 %id.x = call i32 @llvm.amdgcn.workitem.id.x() 72 store volatile i32 %id.x, ptr addrspace(1) undef 73 ret void 74} 75 76; CHECK-LABEL: UniformityInfo for function 'workitem_id_y_singlethreaded_md': 77; CHECK-NOT: DIVERGENT 78define amdgpu_kernel void @workitem_id_y_singlethreaded_md() !reqd_work_group_size !0 { 79 %id.x = call i32 @llvm.amdgcn.workitem.id.y() 80 store volatile i32 %id.x, ptr addrspace(1) undef 81 ret void 82} 83 84; CHECK-LABEL: UniformityInfo for function 'workitem_id_z_singlethreaded_md': 85; CHECK-NOT: DIVERGENT 86define amdgpu_kernel void @workitem_id_z_singlethreaded_md() !reqd_work_group_size !0 { 87 %id.x = call i32 @llvm.amdgcn.workitem.id.y() 88 store volatile i32 %id.x, ptr addrspace(1) undef 89 ret void 90} 91 92; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_not_singlethreaded_dimx': 93; CHECK: DIVERGENT: %id.x = call i32 @llvm.amdgcn.workitem.id.x() 94define amdgpu_kernel void @workitem_id_x_not_singlethreaded_dimx() !reqd_work_group_size !1 { 95 %id.x = call i32 @llvm.amdgcn.workitem.id.x() 96 store volatile i32 %id.x, ptr addrspace(1) undef 97 ret void 98} 99 100; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_not_singlethreaded_dimy': 101; CHECK: DIVERGENT: %id.x = call i32 @llvm.amdgcn.workitem.id.x() 102define amdgpu_kernel void @workitem_id_x_not_singlethreaded_dimy() !reqd_work_group_size !2 { 103 %id.x = call i32 @llvm.amdgcn.workitem.id.x() 104 store volatile i32 %id.x, ptr addrspace(1) undef 105 ret void 106} 107 108; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_not_singlethreaded_dimz': 109; CHECK: DIVERGENT: %id.x = call i32 @llvm.amdgcn.workitem.id.x() 110define amdgpu_kernel void @workitem_id_x_not_singlethreaded_dimz() !reqd_work_group_size !3 { 111 %id.x = call i32 @llvm.amdgcn.workitem.id.x() 112 store volatile i32 %id.x, ptr addrspace(1) undef 113 ret void 114} 115 116attributes #0 = { nounwind readnone } 117attributes #1 = { nounwind } 118attributes #2 = { "amdgpu-flat-work-group-size"="1,1" } 119 120!0 = !{i32 1, i32 1, i32 1} 121!1 = !{i32 2, i32 1, i32 1} 122!2 = !{i32 1, i32 2, i32 1} 123!3 = !{i32 1, i32 1, i32 2} 124