# RUN: not --crash llc -mtriple=amdgcn -run-pass=none -verify-machineinstrs -o /dev/null %s 2>&1 | FileCheck %s
---
name: cycles
body: |
bb.0:
%0:sgpr_64 = CONVERGENCECTRL_ANCHOR
%1:sgpr_64 = IMPLICIT_DEF
S_CBRANCH_EXECZ %bb.9, implicit $exec
S_BRANCH %bb.1
bb.1:
S_CBRANCH_EXECZ %bb.8, implicit $exec
S_BRANCH %bb.5
bb.2:
S_CBRANCH_EXECZ %bb.3, implicit $exec
S_BRANCH %bb.4
bb.3:
; CHECK: Cycle heart must dominate all blocks in the cycle.
; Irreducible cycle: entries(bb.4 bb.3)
%3:sgpr_64 = CONVERGENCECTRL_LOOP %0:sgpr_64
S_BRANCH %bb.4
bb.4:
S_BRANCH %bb.3
bb.5:
S_CBRANCH_EXECZ %bb.6, implicit $exec
S_BRANCH %bb.2
bb.6:
S_BRANCH %bb.7
bb.7:
; CHECK: Cycle heart must dominate all blocks in the cycle.
; Reducible cycle: entries(bb.6) bb.7
%4:sgpr_64 = CONVERGENCECTRL_LOOP %0:sgpr_64
S_BRANCH %bb.6
bb.8:
; CHECK: Two static convergence token uses in a cycle that does not contain either token's definition.
%5:sgpr_64 = CONVERGENCECTRL_LOOP %0:sgpr_64
%6:sgpr_64 = CONVERGENCECTRL_LOOP %0:sgpr_64
S_BRANCH %bb.8
bb.9:
; CHECK: Convergence token used by an instruction other than llvm.experimental.convergence.loop in a cycle that does not contain the token's definition.
%7:sgpr_64 = G_SI_CALL %1:sgpr_64, 3, implicit %0:sgpr_64
S_BRANCH %bb.9
...