xref: /llvm-project/llvm/test/CodeGen/SPIRV/structurizer/cf.do.nested.ll (revision cba70550ccf55c6ad3daa621bb8caf3c4ca6cbd7)
1*1ed65febSNathan Gauër; RUN: %if spirv-tools %{ llc -mtriple=spirv-unknown-vulkan-compute -O0 %s -o - | spirv-as --preserve-numeric-ids - -o - | spirv-val %}
2*1ed65febSNathan Gauër;
3*1ed65febSNathan Gauër; Source HLSL:
4*1ed65febSNathan Gauër;
5*1ed65febSNathan Gauër; int process() {
6*1ed65febSNathan Gauër;   int val=0, i=0, j=0, k=0;
7*1ed65febSNathan Gauër;
8*1ed65febSNathan Gauër;   do {
9*1ed65febSNathan Gauër;     val = val + i;
10*1ed65febSNathan Gauër;
11*1ed65febSNathan Gauër;     do {
12*1ed65febSNathan Gauër;       do {
13*1ed65febSNathan Gauër;         ++k;
14*1ed65febSNathan Gauër;       } while (k < 30);
15*1ed65febSNathan Gauër;
16*1ed65febSNathan Gauër;       ++j;
17*1ed65febSNathan Gauër;     } while (j < 20);
18*1ed65febSNathan Gauër;
19*1ed65febSNathan Gauër;     ++i;
20*1ed65febSNathan Gauër;
21*1ed65febSNathan Gauër;   } while (i < 10);
22*1ed65febSNathan Gauër;
23*1ed65febSNathan Gauër;   return val + i + j + k;
24*1ed65febSNathan Gauër; }
25*1ed65febSNathan Gauër;
26*1ed65febSNathan Gauër; [numthreads(1, 1, 1)]
27*1ed65febSNathan Gauër; void main() {
28*1ed65febSNathan Gauër;   process();
29*1ed65febSNathan Gauër; }
30*1ed65febSNathan Gauër
31*1ed65febSNathan 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"
32*1ed65febSNathan Gauërtarget triple = "spirv-unknown-vulkan1.3-compute"
33*1ed65febSNathan Gauër
34*1ed65febSNathan Gauër; Function Attrs: convergent noinline nounwind optnone
35*1ed65febSNathan Gauërdefine spir_func noundef i32 @_Z7processv() #0 {
36*1ed65febSNathan Gauërentry:
37*1ed65febSNathan Gauër  %0 = call token @llvm.experimental.convergence.entry()
38*1ed65febSNathan Gauër  %val = alloca i32, align 4
39*1ed65febSNathan Gauër  %i = alloca i32, align 4
40*1ed65febSNathan Gauër  %j = alloca i32, align 4
41*1ed65febSNathan Gauër  %k = alloca i32, align 4
42*1ed65febSNathan Gauër  store i32 0, ptr %val, align 4
43*1ed65febSNathan Gauër  store i32 0, ptr %i, align 4
44*1ed65febSNathan Gauër  store i32 0, ptr %j, align 4
45*1ed65febSNathan Gauër  store i32 0, ptr %k, align 4
46*1ed65febSNathan Gauër  br label %do.body
47*1ed65febSNathan Gauër
48*1ed65febSNathan Gauërdo.body:                                          ; preds = %do.cond8, %entry
49*1ed65febSNathan Gauër  %1 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]
50*1ed65febSNathan Gauër  %2 = load i32, ptr %val, align 4
51*1ed65febSNathan Gauër  %3 = load i32, ptr %i, align 4
52*1ed65febSNathan Gauër  %add = add nsw i32 %2, %3
53*1ed65febSNathan Gauër  store i32 %add, ptr %val, align 4
54*1ed65febSNathan Gauër  br label %do.body1
55*1ed65febSNathan Gauër
56*1ed65febSNathan Gauërdo.body1:                                         ; preds = %do.cond4, %do.body
57*1ed65febSNathan Gauër  %4 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %1) ]
58*1ed65febSNathan Gauër  br label %do.body2
59*1ed65febSNathan Gauër
60*1ed65febSNathan Gauërdo.body2:                                         ; preds = %do.cond, %do.body1
61*1ed65febSNathan Gauër  %5 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %4) ]
62*1ed65febSNathan Gauër  %6 = load i32, ptr %k, align 4
63*1ed65febSNathan Gauër  %inc = add nsw i32 %6, 1
64*1ed65febSNathan Gauër  store i32 %inc, ptr %k, align 4
65*1ed65febSNathan Gauër  br label %do.cond
66*1ed65febSNathan Gauër
67*1ed65febSNathan Gauërdo.cond:                                          ; preds = %do.body2
68*1ed65febSNathan Gauër  %7 = load i32, ptr %k, align 4
69*1ed65febSNathan Gauër  %cmp = icmp slt i32 %7, 30
70*1ed65febSNathan Gauër  br i1 %cmp, label %do.body2, label %do.end
71*1ed65febSNathan Gauër
72*1ed65febSNathan Gauërdo.end:                                           ; preds = %do.cond
73*1ed65febSNathan Gauër  %8 = load i32, ptr %j, align 4
74*1ed65febSNathan Gauër  %inc3 = add nsw i32 %8, 1
75*1ed65febSNathan Gauër  store i32 %inc3, ptr %j, align 4
76*1ed65febSNathan Gauër  br label %do.cond4
77*1ed65febSNathan Gauër
78*1ed65febSNathan Gauërdo.cond4:                                         ; preds = %do.end
79*1ed65febSNathan Gauër  %9 = load i32, ptr %j, align 4
80*1ed65febSNathan Gauër  %cmp5 = icmp slt i32 %9, 20
81*1ed65febSNathan Gauër  br i1 %cmp5, label %do.body1, label %do.end6
82*1ed65febSNathan Gauër
83*1ed65febSNathan Gauërdo.end6:                                          ; preds = %do.cond4
84*1ed65febSNathan Gauër  %10 = load i32, ptr %i, align 4
85*1ed65febSNathan Gauër  %inc7 = add nsw i32 %10, 1
86*1ed65febSNathan Gauër  store i32 %inc7, ptr %i, align 4
87*1ed65febSNathan Gauër  br label %do.cond8
88*1ed65febSNathan Gauër
89*1ed65febSNathan Gauërdo.cond8:                                         ; preds = %do.end6
90*1ed65febSNathan Gauër  %11 = load i32, ptr %i, align 4
91*1ed65febSNathan Gauër  %cmp9 = icmp slt i32 %11, 10
92*1ed65febSNathan Gauër  br i1 %cmp9, label %do.body, label %do.end10
93*1ed65febSNathan Gauër
94*1ed65febSNathan Gauërdo.end10:                                         ; preds = %do.cond8
95*1ed65febSNathan Gauër  %12 = load i32, ptr %val, align 4
96*1ed65febSNathan Gauër  %13 = load i32, ptr %i, align 4
97*1ed65febSNathan Gauër  %add11 = add nsw i32 %12, %13
98*1ed65febSNathan Gauër  %14 = load i32, ptr %j, align 4
99*1ed65febSNathan Gauër  %add12 = add nsw i32 %add11, %14
100*1ed65febSNathan Gauër  %15 = load i32, ptr %k, align 4
101*1ed65febSNathan Gauër  %add13 = add nsw i32 %add12, %15
102*1ed65febSNathan Gauër  ret i32 %add13
103*1ed65febSNathan Gauër}
104*1ed65febSNathan Gauër
105*1ed65febSNathan Gauër; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none)
106*1ed65febSNathan Gauërdeclare token @llvm.experimental.convergence.entry() #1
107*1ed65febSNathan Gauër
108*1ed65febSNathan Gauër; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none)
109*1ed65febSNathan Gauërdeclare token @llvm.experimental.convergence.loop() #1
110*1ed65febSNathan Gauër
111*1ed65febSNathan Gauër; Function Attrs: convergent noinline norecurse nounwind optnone
112*1ed65febSNathan Gauërdefine internal spir_func void @main() #2 {
113*1ed65febSNathan Gauërentry:
114*1ed65febSNathan Gauër  %0 = call token @llvm.experimental.convergence.entry()
115*1ed65febSNathan Gauër  %call1 = call spir_func noundef i32 @_Z7processv() #4 [ "convergencectrl"(token %0) ]
116*1ed65febSNathan Gauër  ret void
117*1ed65febSNathan Gauër}
118*1ed65febSNathan Gauër
119*1ed65febSNathan Gauër; Function Attrs: convergent norecurse
120*1ed65febSNathan Gauërdefine void @main.1() #3 {
121*1ed65febSNathan Gauërentry:
122*1ed65febSNathan Gauër  call void @main()
123*1ed65febSNathan Gauër  ret void
124*1ed65febSNathan Gauër}
125*1ed65febSNathan Gauër
126*1ed65febSNathan Gauërattributes #0 = { convergent noinline nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
127*1ed65febSNathan Gauërattributes #1 = { convergent nocallback nofree nosync nounwind willreturn memory(none) }
128*1ed65febSNathan Gauërattributes #2 = { convergent noinline norecurse nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
129*1ed65febSNathan 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" }
130*1ed65febSNathan Gauërattributes #4 = { convergent }
131*1ed65febSNathan Gauër
132*1ed65febSNathan Gauër!llvm.module.flags = !{!0, !1, !2}
133*1ed65febSNathan Gauër
134*1ed65febSNathan Gauër!0 = !{i32 1, !"wchar_size", i32 4}
135*1ed65febSNathan Gauër!1 = !{i32 4, !"dx.disable_optimizations", i32 1}
136*1ed65febSNathan Gauër!2 = !{i32 7, !"frame-pointer", i32 2}
137*1ed65febSNathan Gauër
138