212 lines · plain
1; RUN: llc -mtriple=amdgcn -amdgpu-set-wave-priority=true -o - %s | \2; RUN: FileCheck %s3 4; RUN: llc -mtriple=amdgcn -stop-after=si-late-branch-lowering -o - %s | \5; RUN: llc -x mir -mtriple=amdgcn -passes=amdgpu-set-wave-priority -o - | \6; RUN: llc -x mir -mtriple=amdgcn -start-after=si-late-branch-lowering -o - | \7; RUN: FileCheck %s8 9; CHECK-LABEL: no_setprio:10; CHECK-NOT: s_setprio11; CHECK: ; return to shader part epilog12define amdgpu_ps <2 x float> @no_setprio(<2 x float> %a, <2 x float> %b) "amdgpu-wave-priority-threshold"="1" {13 %s = fadd <2 x float> %a, %b14 ret <2 x float> %s15}16 17; CHECK-LABEL: vmem_in_exit_block:18; CHECK: s_setprio 319; CHECK: buffer_load_dwordx220; CHECK-NEXT: s_setprio 021; CHECK: ; return to shader part epilog22define amdgpu_ps <2 x float> @vmem_in_exit_block(ptr addrspace(8) inreg %p, <2 x float> %x) "amdgpu-wave-priority-threshold"="2" {23 %v = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 0, i32 0, i32 0, i32 0)24 %s = fadd <2 x float> %v, %x25 ret <2 x float> %s26}27 28; CHECK-LABEL: branch:29; CHECK: s_setprio 330; CHECK: s_cbranch_scc0 [[A:.*]]31; CHECK: {{.*}}: ; %b32; CHECK: buffer_load_dwordx233; CHECK-NEXT: s_setprio 034; CHECK: s_branch [[EXIT:.*]]35; CHECK: [[A]]: ; %a36; CHECK-NEXT: s_setprio 037; CHECK: s_branch [[EXIT]]38; CHECK-NEXT: [[EXIT]]:39define amdgpu_ps <2 x float> @branch(ptr addrspace(8) inreg %p, i32 inreg %i, <2 x float> %x) "amdgpu-wave-priority-threshold"="2" {40 %cond = icmp eq i32 %i, 041 br i1 %cond, label %a, label %b42 43a:44 ret <2 x float> <float 0.0, float 0.0>45 46b:47 %v = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 0, i32 0, i32 0, i32 0)48 %s = fadd <2 x float> %v, %x49 ret <2 x float> %s50}51 52; CHECK-LABEL: setprio_follows_setprio:53; CHECK: s_setprio 354; CHECK: buffer_load_dwordx255; CHECK: s_cbranch_scc1 [[C:.*]]56; CHECK: {{.*}}: ; %a57; CHECK: buffer_load_dwordx258; CHECK-NEXT: s_setprio 059; CHECK: s_cbranch_vccnz [[C]]60; CHECK: {{.*}}: ; %b61; CHECK-NOT: s_setprio62; CHECK: s_branch [[EXIT:.*]]63; CHECK: [[C]]: ; %c64; CHECK-NEXT: s_setprio 065; CHECK: s_branch [[EXIT]]66; CHECK: [[EXIT]]:67define amdgpu_ps <2 x float> @setprio_follows_setprio(ptr addrspace(8) inreg %p, i32 inreg %i) "amdgpu-wave-priority-threshold"="3" {68entry:69 %v1 = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 0, i32 0, i32 0, i32 0)70 %cond1 = icmp ne i32 %i, 071 br i1 %cond1, label %a, label %c72 73a:74 %v2 = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 0, i32 0, i32 1, i32 0)75 %v20 = extractelement <2 x float> %v2, i32 076 %v21 = extractelement <2 x float> %v2, i32 177 %cond2 = fcmp ult float %v20, %v2178 br i1 %cond2, label %b, label %c79 80b:81 ret <2 x float> %v282 83c:84 %v4 = fadd <2 x float> %v1, %v185 ret <2 x float> %v486}87 88; CHECK-LABEL: loop:89; CHECK: {{.*}}: ; %entry90; CHECK: s_setprio 391; CHECK-NOT: s_setprio92; CHECK: [[LOOP:.*]]: ; %loop93; CHECK-NOT: s_setprio94; CHECK: buffer_load_dwordx295; CHECK-NOT: s_setprio96; CHECK: s_cbranch_scc1 [[LOOP]]97; CHECK-NEXT: {{.*}}: ; %exit98; CHECK-NEXT: s_setprio 099define amdgpu_ps <2 x float> @loop(ptr addrspace(8) inreg %p) "amdgpu-wave-priority-threshold"="2" {100entry:101 br label %loop102 103loop:104 %i = phi i32 [0, %entry], [%i2, %loop]105 %sum = phi <2 x float> [<float 0.0, float 0.0>, %entry], [%sum2, %loop]106 107 %i2 = add i32 %i, 1108 109 %v = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 %i, i32 0, i32 0, i32 0)110 %sum2 = fadd <2 x float> %sum, %v111 112 %cond = icmp ult i32 %i2, 5113 br i1 %cond, label %loop, label %exit114 115exit:116 ret <2 x float> %sum2117}118 119; CHECK-LABEL: edge_split:120; CHECK: s_setprio 3121; CHECK: buffer_load_dwordx2122; CHECK-NOT: s_setprio123; CHECK: s_cbranch_scc1 [[ANOTHER_LOAD:.*]]124; CHECK: {{.*}}: ; %loop.preheader125; CHECK-NEXT: s_setprio 0126; CHECK: [[LOOP:.*]]: ; %loop127; CHECK-NOT: s_setprio128; CHECK: s_cbranch_scc1 [[LOOP]]129; CHECK {{.*}}: ; %exit130; CHECK-NOT: s_setprio131; CHECK: s_branch [[RET:.*]]132; CHECK: [[ANOTHER_LOAD]]: ; %another_load133; CHECK: buffer_load_dwordx2134; CHECK-NEXT: s_setprio 0135; CHECK: s_branch [[RET]]136; CHECK: [[RET]]:137define amdgpu_ps <2 x float> @edge_split(ptr addrspace(8) inreg %p, i32 inreg %x) "amdgpu-wave-priority-threshold"="2" {138entry:139 %v = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 0, i32 0, i32 0, i32 0)140 %cond = icmp ne i32 %x, 0141 br i1 %cond, label %loop, label %another_load142 143loop:144 %i = phi i32 [0, %entry], [%i2, %loop]145 %mul = phi <2 x float> [%v, %entry], [%mul2, %loop]146 147 %i2 = add i32 %i, 1148 %mul2 = fmul <2 x float> %mul, %v149 150 %cond2 = icmp ult i32 %i2, 5151 br i1 %cond2, label %loop, label %exit152 153exit:154 ret <2 x float> %mul2155 156another_load:157 %v2 = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 0, i32 0, i32 1, i32 0)158 %sum = fadd <2 x float> %v, %v2159 ret <2 x float> %sum160}161 162; CHECK-LABEL: valu_insts_threshold:163; CHECK: s_setprio 3164; CHECK: buffer_load_dwordx2165; CHECK-NEXT: s_setprio 0166; CHECK-COUNT-4: v_add_f32_e32167; CHECK: s_cbranch_scc0 [[A:.*]]168; CHECK: {{.*}}: ; %b169; CHECK-NEXT: buffer_load_dwordx2170; CHECK: s_branch [[END:.*]]171; CHECK: [[A]]: ; %a172; CHECK: s_branch [[END]]173; CHECK: [[END]]:174define amdgpu_ps <2 x float> @valu_insts_threshold(ptr addrspace(8) inreg %p, i32 inreg %i) "amdgpu-wave-priority-threshold"="4" {175 %v = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 0, i32 0, i32 0, i32 0)176 %add = fadd <2 x float> %v, %v177 %add2 = fadd <2 x float> %add, %add178 179 %cond = icmp eq i32 %i, 0180 br i1 %cond, label %a, label %b181 182a:183 ret <2 x float> %add2184 185b:186 %v2 = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 0, i32 1, i32 0, i32 0)187 %sub = fsub <2 x float> %add2, %v2188 ret <2 x float> %sub189}190 191; CHECK-LABEL: valu_insts_threshold2:192; CHECK-NOT: s_setprio193; CHECK: ; -- End function194define amdgpu_ps <2 x float> @valu_insts_threshold2(ptr addrspace(8) inreg %p, i32 inreg %i) "amdgpu-wave-priority-threshold"="5" {195 %v = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 0, i32 0, i32 0, i32 0)196 %add = fadd <2 x float> %v, %v197 %add2 = fadd <2 x float> %add, %add198 199 %cond = icmp eq i32 %i, 0200 br i1 %cond, label %a, label %b201 202a:203 ret <2 x float> %add2204 205b:206 %v2 = call <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8) %p, i32 0, i32 1, i32 0, i32 0)207 %sub = fsub <2 x float> %add2, %v2208 ret <2 x float> %sub209}210 211declare <2 x float> @llvm.amdgcn.struct.ptr.buffer.load.v2f32(ptr addrspace(8), i32, i32, i32, i32) nounwind212