xref: /llvm-project/clang/test/CodeGenHLSL/convergence/do.while.hlsl (revision c86edd03adaaa49b70af8d74ab5e2a09c9daab37)
1// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -triple \
2// RUN:   spirv-pc-vulkan-library %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
3
4bool cond();
5void foo();
6
7void test1() {
8  do {
9  } while (cond());
10}
11// CHECK-LABEL: define spir_func void @_Z5test1v()
12// CHECK-SAME: [[A0:#[0-9]+]] {
13// CHECK: entry:
14// CHECK:   [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
15// CHECK: do.body:
16// CHECK:   [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
17// CHECK: do.cond:
18// CHECK:                    call spir_func noundef i1 @_Z4condv() [[A3:#[0-9]+]] [ "convergencectrl"(token [[T1]]) ]
19
20void test2() {
21  do {
22    foo();
23  } while (cond());
24}
25// CHECK-LABEL: define spir_func void @_Z5test2v()
26// CHECK-SAME: [[A0]] {
27// CHECK: entry:
28// CHECK:   [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
29// CHECK: do.body:
30// CHECK:   [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
31// CHECK:                    call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]
32// CHECK: do.cond:
33// CHECK:                    call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
34
35void test3() {
36  do {
37    if (cond())
38      foo();
39  } while (cond());
40}
41// CHECK-LABEL: define spir_func void @_Z5test3v()
42// CHECK-SAME: [[A0]] {
43// CHECK: entry:
44// CHECK:   [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
45// CHECK: do.body:
46// CHECK:   [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
47// CHECK: if.then:
48// CHECK:                    call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]
49// CHECK: do.cond:
50// CHECK:                    call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
51
52void test4() {
53  do {
54    if (cond()) {
55      foo();
56      break;
57    }
58  } while (cond());
59}
60// CHECK-LABEL: define spir_func void @_Z5test4v()
61// CHECK-SAME: [[A0]] {
62// CHECK: entry:
63// CHECK:   [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
64// CHECK: do.body:
65// CHECK:   [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
66// CHECK: if.then:
67// CHECK:                    call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]
68// CHECK: do.cond:
69// CHECK:                    call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
70
71void test5() {
72  do {
73    while (cond()) {
74      if (cond()) {
75        foo();
76        break;
77      }
78    }
79  } while (cond());
80}
81// CHECK-LABEL: define spir_func void @_Z5test5v()
82// CHECK-SAME: [[A0]] {
83// CHECK: entry:
84// CHECK:   [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
85// CHECK: do.body:
86// CHECK:   [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
87// CHECK: while.cond:
88// CHECK:   [[T2:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T1]]) ]
89// CHECK: if.then:
90// CHECK:                    call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T2]]) ]
91// CHECK: do.cond:
92// CHECK:                    call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
93
94// CHECK-DAG: attributes [[A0]] = { {{.*}}convergent{{.*}} }
95// CHECK-DAG: attributes [[A3]] = { {{.*}}convergent{{.*}} }
96