xref: /llvm-project/llvm/test/MachineVerifier/convergencectrl/AMDGPU/basic.mir (revision 66bd3cd75b32ccfa8d228c200cf4fbf72d49fd1f)
1# RUN: not --crash llc -mtriple=amdgcn -run-pass=none -verify-machineinstrs -o /dev/null %s 2>&1 | FileCheck %s
2---
3name:            basic
4tracksRegLiveness: true
5body:             |
6  bb.0:
7    successors: %bb.1, %bb.2;
8    %0:sgpr_64 = CONVERGENCECTRL_ANCHOR
9    ; CHECK: Entry intrinsic cannot be preceded by a convergent operation in the same basic block.
10    ; CHECK: CONVERGENCECTRL_ENTRY
11    %1:sgpr_64 = CONVERGENCECTRL_ENTRY
12    ; CHECK: Loop intrinsic cannot be preceded by a convergent operation in the same basic block.
13    ; CHECK: CONVERGENCECTRL_LOOP
14    %2:sgpr_64 = CONVERGENCECTRL_LOOP %0:sgpr_64
15    S_CBRANCH_EXECZ %bb.1, implicit $exec
16    S_BRANCH %bb.2
17
18  bb.1:
19    successors: %bb.2;
20    ; CHECK: Entry intrinsic can occur only in the entry block.
21    ; CHECK: CONVERGENCECTRL_ENTRY
22    %5:sgpr_64 = CONVERGENCECTRL_ENTRY
23
24  bb.2:
25    ; CHECK: Convergence control tokens can only be used by convergent operations.
26    ; CHECK: G_PHI
27    %6:sgpr_64 = G_PHI %0:sgpr_64, %bb.0, %0:sgpr_64, %bb.1
28    %7:sgpr_64 = CONVERGENCECTRL_ANCHOR
29    %8:sgpr_64 = IMPLICIT_DEF
30    %4:sgpr_64 = SI_CALL %8:sgpr_64, 1, implicit %7:sgpr_64
31    ; CHECK: An operation can use at most one convergence control token.
32    ; CHECK: SI_CALL %{{[0-9]}}:sgpr_64, 2
33    %9:sgpr_64 = SI_CALL %8:sgpr_64, 2, implicit %7:sgpr_64, implicit %7:sgpr_64
34    ; CHECK: Cannot mix controlled and uncontrolled convergence in the same function.
35    ; CHECK: SI_CALL %{{[0-9]}}:sgpr_64, 3
36    %10:sgpr_64 = SI_CALL %8:sgpr_64, 3
37...
38