1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}test_kill_depth_0_imm_pos: 4*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#0: 5*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 6*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @test_kill_depth_0_imm_pos() #0 { 7*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float 0.0) 8*9880d681SAndroid Build Coastguard Worker ret void 9*9880d681SAndroid Build Coastguard Worker} 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}test_kill_depth_0_imm_neg: 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#0: 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_mov_b64 exec, 0 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 16*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @test_kill_depth_0_imm_neg() #0 { 17*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float -0.0) 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; FIXME: Ideally only one would be emitted 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}test_kill_depth_0_imm_neg_x2: 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#0: 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_mov_b64 exec, 0 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_mov_b64 exec, 0 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#2: 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 29*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @test_kill_depth_0_imm_neg_x2() #0 { 30*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float -0.0) 31*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float -1.0) 32*9880d681SAndroid Build Coastguard Worker ret void 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}test_kill_depth_var: 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#0: 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v0 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 40*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @test_kill_depth_var(float %x) #0 { 41*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float %x) 42*9880d681SAndroid Build Coastguard Worker ret void 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; FIXME: Ideally only one would be emitted 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}test_kill_depth_var_x2_same: 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#0: 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v0 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v0 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#2: 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 53*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @test_kill_depth_var_x2_same(float %x) #0 { 54*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float %x) 55*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float %x) 56*9880d681SAndroid Build Coastguard Worker ret void 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}test_kill_depth_var_x2: 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#0: 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v0 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v1 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#2: 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 66*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @test_kill_depth_var_x2(float %x, float %y) #0 { 67*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float %x) 68*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float %y) 69*9880d681SAndroid Build Coastguard Worker ret void 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}test_kill_depth_var_x2_instructions: 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#0: 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_cmpx_le_f32_e32 vcc, 0, v0 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 76*9880d681SAndroid Build Coastguard Worker; CHECK: v_mov_b32_e64 v7, -1 77*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmpx_le_f32_e32 vcc, 0, v7 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#2: 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 80*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @test_kill_depth_var_x2_instructions(float %x) #0 { 81*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float %x) 82*9880d681SAndroid Build Coastguard Worker %y = call float asm sideeffect "v_mov_b32_e64 v7, -1", "={VGPR7}"() 83*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float %y) 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; FIXME: why does the skip depend on the asm length in the same block? 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}test_kill_control_flow: 90*9880d681SAndroid Build Coastguard Worker; CHECK: s_cmp_lg_i32 s{{[0-9]+}}, 0 91*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_scc1 [[RETURN_BB:BB[0-9]+_[0-9]+]] 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 94*9880d681SAndroid Build Coastguard Worker; CHECK: v_mov_b32_e64 v7, -1 95*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 96*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 97*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 98*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 99*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 100*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 101*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 102*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 103*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 104*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmpx_le_f32_e32 vcc, 0, v7 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_cbranch_execnz [[SPLIT_BB:BB[0-9]+_[0-9]+]] 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#3: 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: exp 0, 9, 0, 1, 1, v0, v0, v0, v0 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: {{^}}[[SPLIT_BB]]: 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 114*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @test_kill_control_flow(i32 inreg %arg) #0 { 115*9880d681SAndroid Build Coastguard Workerentry: 116*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %arg, 0 117*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb, label %exit 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerbb: 120*9880d681SAndroid Build Coastguard Worker %var = call float asm sideeffect " 121*9880d681SAndroid Build Coastguard Worker v_mov_b32_e64 v7, -1 122*9880d681SAndroid Build Coastguard Worker v_nop_e64 123*9880d681SAndroid Build Coastguard Worker v_nop_e64 124*9880d681SAndroid Build Coastguard Worker v_nop_e64 125*9880d681SAndroid Build Coastguard Worker v_nop_e64 126*9880d681SAndroid Build Coastguard Worker v_nop_e64 127*9880d681SAndroid Build Coastguard Worker v_nop_e64 128*9880d681SAndroid Build Coastguard Worker v_nop_e64 129*9880d681SAndroid Build Coastguard Worker v_nop_e64 130*9880d681SAndroid Build Coastguard Worker v_nop_e64 131*9880d681SAndroid Build Coastguard Worker v_nop_e64", "={VGPR7}"() 132*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float %var) 133*9880d681SAndroid Build Coastguard Worker br label %exit 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerexit: 136*9880d681SAndroid Build Coastguard Worker ret void 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}test_kill_control_flow_remainder: 140*9880d681SAndroid Build Coastguard Worker; CHECK: s_cmp_lg_i32 s{{[0-9]+}}, 0 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_cbranch_scc1 [[RETURN_BB:BB[0-9]+_[0-9]+]] 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: ; %bb 144*9880d681SAndroid Build Coastguard Worker; CHECK: v_mov_b32_e64 v7, -1 145*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 146*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 147*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 148*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 149*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 150*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 151*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 152*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 153*9880d681SAndroid Build Coastguard Worker; CHECK: ;;#ASMEND 154*9880d681SAndroid Build Coastguard Worker; CHECK: v_mov_b32_e64 v8, -1 155*9880d681SAndroid Build Coastguard Worker; CHECK: ;;#ASMEND 156*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmpx_le_f32_e32 vcc, 0, v7 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_cbranch_execnz [[SPLIT_BB:BB[0-9]+_[0-9]+]] 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#4: 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: exp 0, 9, 0, 1, 1, v0, v0, v0, v0 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: {{^}}[[SPLIT_BB]]: 164*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword v8 165*9880d681SAndroid Build Coastguard Worker; CHECK: v_mov_b32_e64 v9, -2 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}BB{{[0-9]+_[0-9]+}}: 168*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword v9 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_endpgm 170*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @test_kill_control_flow_remainder(i32 inreg %arg) #0 { 171*9880d681SAndroid Build Coastguard Workerentry: 172*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %arg, 0 173*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb, label %exit 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerbb: 176*9880d681SAndroid Build Coastguard Worker %var = call float asm sideeffect " 177*9880d681SAndroid Build Coastguard Worker v_mov_b32_e64 v7, -1 178*9880d681SAndroid Build Coastguard Worker v_nop_e64 179*9880d681SAndroid Build Coastguard Worker v_nop_e64 180*9880d681SAndroid Build Coastguard Worker v_nop_e64 181*9880d681SAndroid Build Coastguard Worker v_nop_e64 182*9880d681SAndroid Build Coastguard Worker v_nop_e64 183*9880d681SAndroid Build Coastguard Worker v_nop_e64 184*9880d681SAndroid Build Coastguard Worker v_nop_e64 185*9880d681SAndroid Build Coastguard Worker v_nop_e64 186*9880d681SAndroid Build Coastguard Worker v_nop_e64 187*9880d681SAndroid Build Coastguard Worker v_nop_e64 188*9880d681SAndroid Build Coastguard Worker v_nop_e64", "={VGPR7}"() 189*9880d681SAndroid Build Coastguard Worker %live.across = call float asm sideeffect "v_mov_b32_e64 v8, -1", "={VGPR8}"() 190*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float %var) 191*9880d681SAndroid Build Coastguard Worker store volatile float %live.across, float addrspace(1)* undef 192*9880d681SAndroid Build Coastguard Worker %live.out = call float asm sideeffect "v_mov_b32_e64 v9, -2", "={VGPR9}"() 193*9880d681SAndroid Build Coastguard Worker br label %exit 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerexit: 196*9880d681SAndroid Build Coastguard Worker %phi = phi float [ 0.0, %entry ], [ %live.out, %bb ] 197*9880d681SAndroid Build Coastguard Worker store float %phi, float addrspace(1)* undef 198*9880d681SAndroid Build Coastguard Worker ret void 199*9880d681SAndroid Build Coastguard Worker} 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}test_kill_divergent_loop: 202*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmp_eq_i32_e32 vcc, 0, v0 203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_and_saveexec_b64 [[SAVEEXEC:s\[[0-9]+:[0-9]+\]]], vcc 204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_xor_b64 [[SAVEEXEC]], exec, [[SAVEEXEC]] 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_cbranch_execz [[EXIT:BB[0-9]+_[0-9]+]] 206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; mask branch [[EXIT]] 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP_BB:BB[0-9]+_[0-9]+]]: 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Worker; CHECK: v_mov_b32_e64 v7, -1 211*9880d681SAndroid Build Coastguard Worker; CHECK: v_nop_e64 212*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmpx_le_f32_e32 vcc, 0, v7 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#3: 215*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dword [[LOAD:v[0-9]+]] 216*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmp_eq_i32_e32 vcc, 0, [[LOAD]] 217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_and_b64 vcc, exec, vcc 218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_cbranch_vccnz [[LOOP_BB]] 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: {{^}}[[EXIT]]: 221*9880d681SAndroid Build Coastguard Worker; CHECK: s_or_b64 exec, exec, [[SAVEEXEC]] 222*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword 223*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm 224*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @test_kill_divergent_loop(i32 %arg) #0 { 225*9880d681SAndroid Build Coastguard Workerentry: 226*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %arg, 0 227*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb, label %exit 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerbb: 230*9880d681SAndroid Build Coastguard Worker %var = call float asm sideeffect " 231*9880d681SAndroid Build Coastguard Worker v_mov_b32_e64 v7, -1 232*9880d681SAndroid Build Coastguard Worker v_nop_e64 233*9880d681SAndroid Build Coastguard Worker v_nop_e64 234*9880d681SAndroid Build Coastguard Worker v_nop_e64 235*9880d681SAndroid Build Coastguard Worker v_nop_e64 236*9880d681SAndroid Build Coastguard Worker v_nop_e64 237*9880d681SAndroid Build Coastguard Worker v_nop_e64 238*9880d681SAndroid Build Coastguard Worker v_nop_e64 239*9880d681SAndroid Build Coastguard Worker v_nop_e64 240*9880d681SAndroid Build Coastguard Worker v_nop_e64 241*9880d681SAndroid Build Coastguard Worker v_nop_e64", "={VGPR7}"() 242*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.kill(float %var) 243*9880d681SAndroid Build Coastguard Worker %vgpr = load volatile i32, i32 addrspace(1)* undef 244*9880d681SAndroid Build Coastguard Worker %loop.cond = icmp eq i32 %vgpr, 0 245*9880d681SAndroid Build Coastguard Worker br i1 %loop.cond, label %bb, label %exit 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerexit: 248*9880d681SAndroid Build Coastguard Worker store volatile i32 8, i32 addrspace(1)* undef 249*9880d681SAndroid Build Coastguard Worker ret void 250*9880d681SAndroid Build Coastguard Worker} 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.AMDGPU.kill(float) #0 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 256