xref: /llvm-project/llvm/test/CodeGen/SPIRV/structurizer/do-continue.ll (revision 53326ee0cf45fce3f80e2e98638dd27edb20c516)
11ed65febSNathan Gauër; RUN: llc -mtriple=spirv-unknown-vulkan-compute -O0 %s -o - | FileCheck %s --match-full-lines
2cba70550SNathan Gauër; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan-compute %s -o - -filetype=obj | spirv-val %}
31ed65febSNathan Gauër
41ed65febSNathan Gauërtarget datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
51ed65febSNathan Gauërtarget triple = "spirv-unknown-vulkan1.3-compute"
61ed65febSNathan Gauër
71ed65febSNathan Gauërdefine spir_func noundef i32 @_Z3foov() #0 {
81ed65febSNathan Gauërentry:
91ed65febSNathan Gauër  %0 = call token @llvm.experimental.convergence.entry()
101ed65febSNathan Gauër  ret i32 1
111ed65febSNathan Gauër}
121ed65febSNathan Gauër
131ed65febSNathan Gauërdefine internal spir_func void @main() #2 {
141ed65febSNathan Gauër; CHECK: %[[#entry:]] = OpLabel
15cba70550SNathan Gauër; CHECK:                OpBranch %[[#do_header:]]
161ed65febSNathan Gauërentry:
171ed65febSNathan Gauër  %0 = call token @llvm.experimental.convergence.entry()
18cba70550SNathan Gauër  %var = alloca i32, align 4
19cba70550SNathan Gauër  br label %do_header
201ed65febSNathan Gauër
21cba70550SNathan Gauër; Here a the loop header had to be split in two:
22cba70550SNathan Gauër; - 1 header for the loop
23cba70550SNathan Gauër; - 1 header for the condition.
24*53326ee0SNathan Gauër
251ed65febSNathan Gauër; CHECK: %[[#do_header:]] = OpLabel
26cba70550SNathan Gauër; CHECK:                    OpLoopMerge %[[#do_merge:]] %[[#do_latch:]] None
27cba70550SNathan Gauër; CHECK:                    OpBranch %[[#new_header:]]
281ed65febSNathan Gauër
29cba70550SNathan Gauër; CHECK: %[[#new_header]] = OpLabel
30cba70550SNathan Gauër; CHECK:                    OpSelectionMerge %[[#if_merge:]] None
31cba70550SNathan Gauër; CHECK:                    OpBranchConditional %[[#]] %[[#if_then:]] %[[#if_end:]]
32cba70550SNathan Gauërdo_header:
331ed65febSNathan Gauër  %1 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]
34cba70550SNathan Gauër  store i32 0, ptr %var
35cba70550SNathan Gauër  br i1 true, label %if.then, label %if.end
361ed65febSNathan Gauër
37cba70550SNathan Gauër; CHECK: %[[#if_end]] = OpLabel
38cba70550SNathan Gauër; CHECK:                OpBranch %[[#if_merge]]
39cba70550SNathan Gauërif.end:
40cba70550SNathan Gauër  store i32 0, ptr %var
41cba70550SNathan Gauër  br label %do_latch
421ed65febSNathan Gauër
43*53326ee0SNathan Gauër; CHECK: %[[#if_then]] = OpLabel
44*53326ee0SNathan Gauër; CHECK:                 OpBranch %[[#if_merge]]
45*53326ee0SNathan Gauërif.then:
46*53326ee0SNathan Gauër  store i32 0, ptr %var
47*53326ee0SNathan Gauër  br label %do_latch
48*53326ee0SNathan Gauër
49cba70550SNathan Gauër; CHECK: %[[#if_merge]] = OpLabel
50cba70550SNathan Gauër; CHECK:                  OpBranchConditional %[[#]] %[[#do_latch]] %[[#do_merge]]
51cba70550SNathan Gauër
52cba70550SNathan Gauër; CHECK: %[[#do_merge]] = OpLabel
53cba70550SNathan Gauër; CHECK:                  OpBranch %[[#do2_header:]]
541ed65febSNathan Gauërdo.end:
55cba70550SNathan Gauër  store i32 0, ptr %var
56cba70550SNathan Gauër  br label %do2_header
571ed65febSNathan Gauër
58cba70550SNathan Gauër; CHECK: %[[#do2_header]] = OpLabel
59cba70550SNathan Gauër; CHECK:                    OpLoopMerge %[[#do2_merge:]] %[[#do2_continue:]] None
60cba70550SNathan Gauër; CHECK:                    OpBranch %[[#do3_header:]]
61cba70550SNathan Gauërdo2_header:
621ed65febSNathan Gauër  %6 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]
63cba70550SNathan Gauër  store i32 0, ptr %var
64cba70550SNathan Gauër  br label %do3_header
651ed65febSNathan Gauër
66cba70550SNathan Gauër; CHECK: %[[#do3_header]] = OpLabel
67cba70550SNathan Gauër; CHECK:                  OpLoopMerge %[[#do3_merge:]] %[[#do3_continue:]] None
68cba70550SNathan Gauër; CHECK:                  OpBranch %[[#do3_body:]]
69cba70550SNathan Gauërdo3_header:
701ed65febSNathan Gauër  %8 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %6) ]
71cba70550SNathan Gauër  store i32 0, ptr %var
72cba70550SNathan Gauër  br label %do3_continue
731ed65febSNathan Gauër
74cba70550SNathan Gauër; CHECK: %[[#do3_body]] = OpLabel
75cba70550SNathan Gauër; CHECK:                  OpBranchConditional %[[#]] %[[#do3_continue]] %[[#do3_merge]]
761ed65febSNathan Gauër
77cba70550SNathan Gauër; CHECK: %[[#do3_merge]] = OpLabel
78cba70550SNathan Gauër; CHECK:                   OpBranch %[[#do2_new_latch:]]
79cba70550SNathan Gauërdo3_merge:
80cba70550SNathan Gauër  store i32 0, ptr %var
81cba70550SNathan Gauër  br label %do2_continue
821ed65febSNathan Gauër
83cba70550SNathan Gauër; CHECK: %[[#do2_new_latch]] = OpLabel
84cba70550SNathan Gauër; CHECK:                       OpBranchConditional %[[#]] %[[#do2_continue]] %[[#do2_merge]]
85cba70550SNathan Gauër
86*53326ee0SNathan Gauër; CHECK: %[[#do2_merge]] = OpLabel
87*53326ee0SNathan Gauër; CHECK:                   OpReturn
88*53326ee0SNathan Gauërdo2_merge:
89*53326ee0SNathan Gauër  ret void
90*53326ee0SNathan Gauër
91cba70550SNathan Gauër; CHECK: %[[#do2_continue]] = OpLabel
92cba70550SNathan Gauër; CHECK:                      OpBranch %[[#do2_header]]
93cba70550SNathan Gauërdo2_continue:
94cba70550SNathan Gauër  store i32 0, ptr %var
95cba70550SNathan Gauër  br i1 true, label %do2_header, label %do2_merge
96cba70550SNathan Gauër
97*53326ee0SNathan Gauër; CHECK: %[[#do3_continue]] = OpLabel
98*53326ee0SNathan Gauër; CHECK:                      OpBranch %[[#do3_header]]
99*53326ee0SNathan Gauërdo3_continue:
100*53326ee0SNathan Gauër  store i32 0, ptr %var
101*53326ee0SNathan Gauër  br i1 true, label %do3_header, label %do3_merge
102*53326ee0SNathan Gauër
103*53326ee0SNathan Gauër; CHECK: %[[#do_latch]] = OpLabel
104*53326ee0SNathan Gauër; CHECK:                  OpBranch %[[#do_header]]
105*53326ee0SNathan Gauërdo_latch:
106*53326ee0SNathan Gauër  store i32 0, ptr %var
107*53326ee0SNathan Gauër  br i1 true, label %do_header, label %do.end
1081ed65febSNathan Gauër}
1091ed65febSNathan Gauër
1101ed65febSNathan Gauërdeclare token @llvm.experimental.convergence.entry() #1
1111ed65febSNathan Gauërdeclare token @llvm.experimental.convergence.loop() #1
1121ed65febSNathan Gauër
1131ed65febSNathan Gauërattributes #0 = { convergent noinline nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
1141ed65febSNathan Gauërattributes #1 = { convergent nocallback nofree nosync nounwind willreturn memory(none) }
1151ed65febSNathan Gauërattributes #2 = { convergent noinline norecurse nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
1161ed65febSNathan Gauërattributes #3 = { convergent norecurse "frame-pointer"="all" "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
1171ed65febSNathan Gauër
1181ed65febSNathan Gauër!llvm.module.flags = !{!0, !1, !2}
1191ed65febSNathan Gauër
1201ed65febSNathan Gauër!0 = !{i32 1, !"wchar_size", i32 4}
1211ed65febSNathan Gauër!1 = !{i32 4, !"dx.disable_optimizations", i32 1}
1221ed65febSNathan Gauër!2 = !{i32 7, !"frame-pointer", i32 2}
123