80 lines · plain
1; RUN: opt -mtriple amdgcn-- -passes='print<uniformity>' -disable-output %s 2>&1 | FileCheck %s2;3; This is to test a divergent phi involving loops4; (https://github.com/llvm/llvm-project/issues/137277).5;6; B0 (div.cond)7; / \8; (L)B1 B49; | |10; B2 B5 (L)11; | |12; B3 /13; \ /14; B6 (phi: divergent)15;16 17;18; CHECK-LABEL: UniformityInfo for function 'test_loop_ctrl_divergence':19; CHECK-LABEL: BLOCK Entry20; CHECK: DIVERGENT: %tid = call i32 @llvm.amdgcn.workitem.id.x()21; CHECK-LABEL: BLOCK B022; CHECK: DIVERGENT: %div.cond = icmp eq i32 %tid, 023; CHECK-LABEL: BLOCK B324; CHECK: %uni_a = phi i32 [ %a1, %B2 ], [ %a, %Entry ]25; CHECK-LABEL: BLOCK B526; CHECK: %uni.a3 = phi i32 [ %a2, %B4 ], [ %uni_a3, %B5 ]27; CHECK-LABEL BLOCK B628; CHECK: DIVERGENT: %div_a = phi i32 [ %uni_a, %B3 ], [ %uni_a3, %B5 ]29;30 31define amdgpu_kernel void @test_loop_ctrl_divergence(i32 %a, i32 %b, i32 %c, i32 %d) {32Entry:33 %tid = call i32 @llvm.amdgcn.workitem.id.x()34 %uni.cond0 = icmp eq i32 %d, 035 br i1 %uni.cond0, label %B3, label %B0 ; uniform branch36 37B0:38 %div.cond = icmp eq i32 %tid, 039 br i1 %div.cond, label %B4, label %B1 ; divergent branch40 41B1:42 %uni.a0 = phi i32 [%a, %B0], [%a0, %B1]43 %a0 = add i32 %uni.a0, 144 %uni.cond1 = icmp slt i32 %a0, %b45 br i1 %uni.cond1, label %B1, label %B246 47B2:48 %a1 = add i32 %a0, 1049 br label %B350 51B3:52 %uni_a = phi i32 [%a1, %B2], [%a, %Entry]53 br label %B654 55B4:56 %a2 = add i32 %a, 2057 br label %B558 59B5:60 %uni.a3= phi i32 [%a2, %B4], [%uni_a3, %B5]61 %uni_a3 = add i32 %uni.a3, 162 %uni.cond2 = icmp slt i32 %uni_a3, %c63 br i1 %uni.cond2, label %B5, label %B664 65B6:66 %div_a = phi i32 [%uni_a, %B3], [%uni_a3, %B5] ; divergent67 %div.cond2 = icmp eq i32 %tid, 268 br i1 %div.cond2, label %B7, label %B8 ; divergent branch69 70B7:71 %c0 = add i32 %div_a, 2 ; divergent72 br label %B873 74B8:75 %ret = phi i32 [%c0, %B7], [0, %B6] ; divergent76 ret void77}78 79declare i32 @llvm.amdgcn.workitem.id.x()80