126 lines · plain
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 %s3 4bool cond();5void foo();6 7void test1() {8 while (cond()) {9 }10}11// CHECK-LABEL: define hidden 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: while.cond:16// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]17// CHECK: call spir_func noundef i1 @_Z4condv() [[A3:#[0-9]+]] [ "convergencectrl"(token [[T1]]) ]18 19void test2() {20 while (cond()) {21 foo();22 }23}24// CHECK-LABEL: define hidden spir_func void @_Z5test2v()25// CHECK-SAME: [[A0]] {26// CHECK: entry:27// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()28// CHECK: while.cond:29// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]30// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]31// CHECK: while.body:32// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]33 34void test3() {35 while (cond()) {36 if (cond())37 break;38 foo();39 }40}41// CHECK-LABEL: define hidden spir_func void @_Z5test3v()42// CHECK-SAME: [[A0]] {43// CHECK: entry:44// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()45// CHECK: while.cond:46// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]47// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]48// CHECK: if.then:49// CHECK: br label %while.end50// CHECK: if.end:51// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]52// CHECK: br label %while.cond53 54void test4() {55 while (cond()) {56 if (cond()) {57 foo();58 break;59 }60 }61}62// CHECK-LABEL: define hidden spir_func void @_Z5test4v()63// CHECK-SAME: [[A0]] {64// CHECK: entry:65// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()66// CHECK: while.cond:67// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]68// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]69// CHECK: if.then:70// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]71// CHECK: br label %while.end72// CHECK: if.end:73// CHECK: br label %while.cond74 75void test5() {76 while (cond()) {77 while (cond()) {78 if (cond()) {79 foo();80 break;81 }82 }83 }84}85// CHECK-LABEL: define hidden spir_func void @_Z5test5v()86// CHECK-SAME: [[A0]] {87// CHECK: entry:88// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()89// CHECK: while.cond:90// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]91// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]92// CHECK: while.cond2:93// CHECK: [[T2:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T1]]) ]94// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T2]]) ]95// CHECK: if.then:96// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T2]]) ]97// CHECK: br label %while.end98 99void test6() {100 while (cond()) {101 while (cond()) {102 }103 104 if (cond()) {105 foo();106 break;107 }108 }109}110// CHECK-LABEL: define hidden spir_func void @_Z5test6v()111// CHECK-SAME: [[A0]] {112// CHECK: entry:113// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()114// CHECK: while.cond:115// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]116// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]117// CHECK: while.cond2:118// CHECK: [[T2:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T1]]) ]119// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T2]]) ]120// CHECK: if.then:121// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]122// CHECK: br label %while.end123 124// CHECK-DAG: attributes [[A0]] = { {{.*}}convergent{{.*}} }125// CHECK-DAG: attributes [[A3]] = { {{.*}}convergent{{.*}} }126