xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/multilevel-break.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -mtriple=amdgcn-- -structurizecfg -si-annotate-control-flow < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}define amdgpu_vs void @main
4*9880d681SAndroid Build Coastguard Worker; CHECK: main_body:
5*9880d681SAndroid Build Coastguard Worker; CHECK: LOOP.outer:
6*9880d681SAndroid Build Coastguard Worker; CHECK: LOOP:
7*9880d681SAndroid Build Coastguard Worker; CHECK:     [[if:%[0-9]+]] = call { i1, i64 } @llvm.amdgcn.if(
8*9880d681SAndroid Build Coastguard Worker; CHECK:     [[if_exec:%[0-9]+]] = extractvalue { i1, i64 } [[if]], 1
9*9880d681SAndroid Build Coastguard Worker;
10*9880d681SAndroid Build Coastguard Worker; CHECK: Flow:
11*9880d681SAndroid Build Coastguard Worker;
12*9880d681SAndroid Build Coastguard Worker; Ensure two else.break calls, for both the inner and outer loops
13*9880d681SAndroid Build Coastguard Worker;
14*9880d681SAndroid Build Coastguard Worker; CHECK:        call i64 @llvm.amdgcn.else.break(i64 [[if_exec]],
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   call i64 @llvm.amdgcn.else.break(i64 [[if_exec]],
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   call void @llvm.amdgcn.end.cf
17*9880d681SAndroid Build Coastguard Worker;
18*9880d681SAndroid Build Coastguard Worker; CHECK: Flow1:
19*9880d681SAndroid Build Coastguard Workerdefine amdgpu_vs void @main(<4 x float> %vec, i32 %ub, i32 %cont) {
20*9880d681SAndroid Build Coastguard Workermain_body:
21*9880d681SAndroid Build Coastguard Worker  br label %LOOP.outer
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard WorkerLOOP.outer:                                       ; preds = %ENDIF, %main_body
24*9880d681SAndroid Build Coastguard Worker  %tmp43 = phi i32 [ 0, %main_body ], [ %tmp47, %ENDIF ]
25*9880d681SAndroid Build Coastguard Worker  br label %LOOP
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard WorkerLOOP:                                             ; preds = %ENDIF, %LOOP.outer
28*9880d681SAndroid Build Coastguard Worker  %tmp45 = phi i32 [ %tmp43, %LOOP.outer ], [ %tmp47, %ENDIF ]
29*9880d681SAndroid Build Coastguard Worker  %tmp47 = add i32 %tmp45, 1
30*9880d681SAndroid Build Coastguard Worker  %tmp48 = icmp slt i32 %tmp45, %ub
31*9880d681SAndroid Build Coastguard Worker  br i1 %tmp48, label %ENDIF, label %IF
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard WorkerIF:                                               ; preds = %LOOP
34*9880d681SAndroid Build Coastguard Worker  ret void
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard WorkerENDIF:                                            ; preds = %LOOP
37*9880d681SAndroid Build Coastguard Worker  %tmp51 = icmp eq i32 %tmp47, %cont
38*9880d681SAndroid Build Coastguard Worker  br i1 %tmp51, label %LOOP, label %LOOP.outer
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone }
42