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