153 lines · plain
1; RUN: opt -mtriple amdgcn-unknown-amdhsa -passes='print<uniformity>' -disable-output %s 2>&1 | FileCheck %s2 3declare i32 @llvm.amdgcn.workitem.id.x() #04declare i32 @llvm.amdgcn.workitem.id.y() #05declare i32 @llvm.amdgcn.workitem.id.z() #06declare i32 @llvm.amdgcn.mbcnt.lo(i32, i32) #07declare i32 @llvm.amdgcn.mbcnt.hi(i32, i32) #08 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) undef13 ret void14}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) undef20 ret void21}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) undef27 ret void28}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) undef34 ret void35}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) undef41 ret void42}43 44; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_singlethreaded':45; CHECK-NOT: DIVERGENT46define 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) undef49 ret void50}51 52; CHECK-LABEL: UniformityInfo for function 'workitem_id_y_singlethreaded':53; CHECK-NOT: DIVERGENT54define 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) undef57 ret void58}59 60; CHECK-LABEL: UniformityInfo for function 'workitem_id_z_singlethreaded':61; CHECK-NOT: DIVERGENT62define 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) undef65 ret void66}67 68; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_singlethreaded_md':69; CHECK-NOT: DIVERGENT70define 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) undef73 ret void74}75 76; CHECK-LABEL: UniformityInfo for function 'workitem_id_y_singlethreaded_md':77; CHECK-NOT: DIVERGENT78define 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) undef81 ret void82}83 84; CHECK-LABEL: UniformityInfo for function 'workitem_id_z_singlethreaded_md':85; CHECK-NOT: DIVERGENT86define 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) undef89 ret void90}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) undef97 ret void98}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) undef105 ret void106}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) undef113 ret void114}115 116; CHECK-LABEL: UniformityInfo for function 'workitem_id_z_uniform_len_1'117; CHECK-NOT: DIVERGENT118define amdgpu_kernel void @workitem_id_z_uniform_len_1(ptr %o) !reqd_work_group_size !4 {119 %id.z = call i32 @llvm.amdgcn.workitem.id.z()120 store i32 %id.z, ptr %o121 ret void122}123 124; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_div_wavefront_size'125; CHECK: DIVERGENT: %id.x = call i32 @llvm.amdgcn.workitem.id.x()126; CHECK-NOT: DIVERGENT127define amdgpu_kernel void @workitem_id_x_div_wavefront_size(ptr %o) #3 !reqd_work_group_size !5 {128 %id.x = call i32 @llvm.amdgcn.workitem.id.x()129 %id.sg = lshr i32 %id.x, 6130 store i32 %id.sg, ptr %o131 ret void132}133 134; CHECK-LABEL: UniformityInfo for function 'workitem_id_y_uniform_in_subgroup'135; CHECK-NOT: DIVERGENT136define amdgpu_kernel void @workitem_id_y_uniform_in_subgroup(ptr %o) #3 !reqd_work_group_size !5 {137 %id.y = call i32 @llvm.amdgcn.workitem.id.y()138 store i32 %id.y, ptr %o139 ret void140}141 142attributes #0 = { nounwind readnone }143attributes #1 = { nounwind }144attributes #2 = { "amdgpu-flat-work-group-size"="1,1" }145attributes #3 = { "target-cpu"="gfx900" "amdgpu-flat-work-group-size"="256,256" }146 147!0 = !{i32 1, i32 1, i32 1}148!1 = !{i32 2, i32 1, i32 1}149!2 = !{i32 1, i32 2, i32 1}150!3 = !{i32 1, i32 1, i32 2}151!4 = !{i32 64, i32 1, i32 1}152!5 = !{i32 128, i32 2, i32 1}153