[llvm] [AMDGPU] Add more cases to the "this is a wave ID" recognizer (PR #177713)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 23 23:20:43 PST 2026
================
@@ -131,6 +131,54 @@ define amdgpu_kernel void @workitem_id_x_div_wavefront_size(ptr %o) #3 !reqd_wor
ret void
}
+; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_masked'
+; CHECK: DIVERGENT: %id.x = call i32 @llvm.amdgcn.workitem.id.x()
+; CHECK-NOT: DIVERGENT
+define amdgpu_kernel void @workitem_id_x_masked(ptr %o) #3 !reqd_work_group_size !5 {
+ %id.x = call i32 @llvm.amdgcn.workitem.id.x()
+ %id.sg.shl.6 = and i32 %id.x, 192
+ store i32 %id.sg.shl.6, ptr %o
+ ret void
+}
+
+; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_zext_masked'
+; CHECK: DIVERGENT: %id.x = call i32 @llvm.amdgcn.workitem.id.x()
+; CHECK: DIVERGENT: %id.x.zext = zext i32 %id.x to i64
+; CHECK-NOT: DIVERGENT
+define amdgpu_kernel void @workitem_id_x_zext_masked(ptr %o) #3 !reqd_work_group_size !5 {
+ %id.x = call i32 @llvm.amdgcn.workitem.id.x()
+ %id.x.zext = zext i32 %id.x to i64
+ %id.sg.shl.6 = and i64 %id.x.zext, 192
+ store i64 %id.sg.shl.6, ptr %o
+ ret void
+}
+
+; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_div_wavefront_size_masked'
+; CHECK: DIVERGENT: %id.x = call i32 @llvm.amdgcn.workitem.id.x()
+; CHECK: DIVERGENT: %id.x.masked = and i32 %id.x, 127
+; CHECK-NOT: DIVERGENT
+define amdgpu_kernel void @workitem_id_x_div_wavefront_size_masked(ptr %o) #3 !reqd_work_group_size !5 {
+ %id.x = call i32 @llvm.amdgcn.workitem.id.x()
+ %id.x.masked = and i32 %id.x, 127
+ %id.sg = lshr i32 %id.x.masked, 6
+ store i32 %id.sg, ptr %o
+ ret void
+}
+
+; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_div_wavefront_size_trunc_masked'
+; CHECK: DIVERGENT: %id.x = call i32 @llvm.amdgcn.workitem.id.x()
+; CHECK: DIVERGENT: %id.x.trunc = trunc i32 %id.x to i16
+; CHECK: DIVERGENT: %id.x.masked = and i16 %id.x.trunc, 127
+; CHECK-NOT: DIVERGENT
+define amdgpu_kernel void @workitem_id_x_div_wavefront_size_trunc_masked(ptr %o) #3 !reqd_work_group_size !5 {
+ %id.x = call i32 @llvm.amdgcn.workitem.id.x()
+ %id.x.trunc = trunc i32 %id.x to i16
+ %id.x.masked = and i16 %id.x.trunc, 127
+ %id.sg = lshr i16 %id.x.masked, 6
+ store i16 %id.sg, ptr %o
----------------
arsenm wrote:
Instcombine also changes this pattern, make sure you're only handling canonical IR
https://github.com/llvm/llvm-project/pull/177713
More information about the llvm-commits
mailing list