; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=amdgcn -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck -enable-var-scope %s

; Although it's modeled without any control flow in order to get better code
; out of the structurizer, @llvm.amdgcn.kill actually ends the thread that calls
; it with "true". In case it's called in a provably infinite loop, we still
; need to successfully exit and export something, even if we can't know where
; to jump to in the LLVM IR. Therefore we insert a null export ourselves in
; this case right before the s_endpgm to avoid GPU hangs, which is what this
; tests.

; FIXME: Immediate value 0x41200000 should be folded into the v_cmp instruction.
define amdgpu_ps void @return_void(float %0) #0 {
; CHECK-LABEL: return_void:
; CHECK:       ; %bb.0: ; %main_body
; CHECK-NEXT:    s_mov_b64 s[0:1], exec
; CHECK-NEXT:    s_mov_b32 s2, 0x41200000
; CHECK-NEXT:    v_cmp_ngt_f32_e32 vcc, s2, v0
; CHECK-NEXT:    s_and_saveexec_b64 s[2:3], vcc
; CHECK-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
; CHECK-NEXT:    s_cbranch_execz .LBB0_3
; CHECK-NEXT:  .LBB0_1: ; %loop
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    s_andn2_b64 s[0:1], s[0:1], exec
; CHECK-NEXT:    s_cbranch_scc0 .LBB0_6
; CHECK-NEXT:  ; %bb.2: ; %loop
; CHECK-NEXT:    ; in Loop: Header=BB0_1 Depth=1
; CHECK-NEXT:    s_mov_b64 exec, 0
; CHECK-NEXT:    s_mov_b64 vcc, 0
; CHECK-NEXT:    s_branch .LBB0_1
; CHECK-NEXT:  .LBB0_3: ; %Flow1
; CHECK-NEXT:    s_andn2_saveexec_b64 s[0:1], s[2:3]
; CHECK-NEXT:    s_cbranch_execz .LBB0_5
; CHECK-NEXT:  ; %bb.4: ; %end
; CHECK-NEXT:    v_mov_b32_e32 v0, 1.0
; CHECK-NEXT:    v_mov_b32_e32 v1, 0
; CHECK-NEXT:    exp mrt0 v1, v1, v1, v0 done vm
; CHECK-NEXT:  .LBB0_5: ; %UnifiedReturnBlock
; CHECK-NEXT:    s_endpgm
; CHECK-NEXT:  .LBB0_6:
; CHECK-NEXT:    s_mov_b64 exec, 0
; CHECK-NEXT:    exp null off, off, off, off done vm
; CHECK-NEXT:    s_endpgm
main_body:
  %cmp = fcmp olt float %0, 1.000000e+01
  br i1 %cmp, label %end, label %loop

loop:
  call void @llvm.amdgcn.kill(i1 false) #3
  br label %loop

end:
  call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 0., float 0., float 0., float 1., i1 true, i1 true) #3
  ret void
}

define amdgpu_ps void @return_void_compr(float %0) #0 {
; CHECK-LABEL: return_void_compr:
; CHECK:       ; %bb.0: ; %main_body
; CHECK-NEXT:    s_mov_b64 s[0:1], exec
; CHECK-NEXT:    s_mov_b32 s2, 0x41200000
; CHECK-NEXT:    v_cmp_ngt_f32_e32 vcc, s2, v0
; CHECK-NEXT:    s_and_saveexec_b64 s[2:3], vcc
; CHECK-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
; CHECK-NEXT:    s_cbranch_execz .LBB1_3
; CHECK-NEXT:  .LBB1_1: ; %loop
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    s_andn2_b64 s[0:1], s[0:1], exec
; CHECK-NEXT:    s_cbranch_scc0 .LBB1_6
; CHECK-NEXT:  ; %bb.2: ; %loop
; CHECK-NEXT:    ; in Loop: Header=BB1_1 Depth=1
; CHECK-NEXT:    s_mov_b64 exec, 0
; CHECK-NEXT:    s_mov_b64 vcc, 0
; CHECK-NEXT:    s_branch .LBB1_1
; CHECK-NEXT:  .LBB1_3: ; %Flow1
; CHECK-NEXT:    s_andn2_saveexec_b64 s[0:1], s[2:3]
; CHECK-NEXT:    s_cbranch_execz .LBB1_5
; CHECK-NEXT:  ; %bb.4: ; %end
; CHECK-NEXT:    v_mov_b32_e32 v0, 0
; CHECK-NEXT:    exp mrt0 v0, off, v0, off done compr vm
; CHECK-NEXT:  .LBB1_5: ; %UnifiedReturnBlock
; CHECK-NEXT:    s_endpgm
; CHECK-NEXT:  .LBB1_6:
; CHECK-NEXT:    s_mov_b64 exec, 0
; CHECK-NEXT:    exp null off, off, off, off done vm
; CHECK-NEXT:    s_endpgm
main_body:
  %cmp = fcmp olt float %0, 1.000000e+01
  br i1 %cmp, label %end, label %loop

loop:
  call void @llvm.amdgcn.kill(i1 false) #3
  br label %loop

end:
  call void @llvm.amdgcn.exp.compr.v2i16(i32 0, i32 5, <2 x i16> < i16 0, i16 0 >, <2 x i16> < i16 0, i16 0 >, i1 true, i1 true) #3
  ret void
}

; test the case where there's only a kill in an infinite loop
define amdgpu_ps void @only_kill() #0 {
; CHECK-LABEL: only_kill:
; CHECK:       ; %bb.0: ; %main_body
; CHECK-NEXT:    s_mov_b64 s[0:1], exec
; CHECK-NEXT:  .LBB2_1: ; %loop
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    s_andn2_b64 s[0:1], s[0:1], exec
; CHECK-NEXT:    s_cbranch_scc0 .LBB2_4
; CHECK-NEXT:  ; %bb.2: ; %loop
; CHECK-NEXT:    ; in Loop: Header=BB2_1 Depth=1
; CHECK-NEXT:    s_mov_b64 exec, 0
; CHECK-NEXT:    s_mov_b64 vcc, exec
; CHECK-NEXT:    s_cbranch_execnz .LBB2_1
; CHECK-NEXT:  ; %bb.3: ; %DummyReturnBlock
; CHECK-NEXT:    s_endpgm
; CHECK-NEXT:  .LBB2_4:
; CHECK-NEXT:    s_mov_b64 exec, 0
; CHECK-NEXT:    exp null off, off, off, off done vm
; CHECK-NEXT:    s_endpgm
main_body:
  br label %loop

loop:
  call void @llvm.amdgcn.kill(i1 false) #3
  br label %loop
}

; Check that the epilog is the final block
define amdgpu_ps float @return_nonvoid(float %0) #0 {
; CHECK-LABEL: return_nonvoid:
; CHECK:       ; %bb.0: ; %main_body
; CHECK-NEXT:    s_mov_b64 s[0:1], exec
; CHECK-NEXT:    s_mov_b32 s2, 0x41200000
; CHECK-NEXT:    v_cmp_ngt_f32_e32 vcc, s2, v0
; CHECK-NEXT:    s_and_saveexec_b64 s[2:3], vcc
; CHECK-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
; CHECK-NEXT:    s_cbranch_execz .LBB3_3
; CHECK-NEXT:  .LBB3_1: ; %loop
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    s_andn2_b64 s[0:1], s[0:1], exec
; CHECK-NEXT:    s_cbranch_scc0 .LBB3_4
; CHECK-NEXT:  ; %bb.2: ; %loop
; CHECK-NEXT:    ; in Loop: Header=BB3_1 Depth=1
; CHECK-NEXT:    s_mov_b64 exec, 0
; CHECK-NEXT:    s_mov_b64 vcc, exec
; CHECK-NEXT:    s_cbranch_execnz .LBB3_1
; CHECK-NEXT:  .LBB3_3: ; %Flow1
; CHECK-NEXT:    s_or_b64 exec, exec, s[2:3]
; CHECK-NEXT:    v_mov_b32_e32 v0, 0
; CHECK-NEXT:    s_branch .LBB3_5
; CHECK-NEXT:  .LBB3_4:
; CHECK-NEXT:    s_mov_b64 exec, 0
; CHECK-NEXT:    exp null off, off, off, off done vm
; CHECK-NEXT:    s_endpgm
; CHECK-NEXT:  .LBB3_5:
main_body:
  %cmp = fcmp olt float %0, 1.000000e+01
  br i1 %cmp, label %end, label %loop

loop:
  call void @llvm.amdgcn.kill(i1 false) #3
  br label %loop

end:
  ret float 0.
}

declare void @llvm.amdgcn.kill(i1) #0
declare void @llvm.amdgcn.exp.f32(i32 immarg, i32 immarg, float, float, float, float, i1 immarg, i1 immarg) #0
declare void @llvm.amdgcn.exp.compr.v2i16(i32 immarg, i32 immarg, <2 x i16>, <2 x i16>, i1 immarg, i1 immarg) #0

attributes #0 = { nounwind }
