Implements https://github.com/llvm/wg-hlsl/blob/main/proposals/0026-symbol-visibility.md. The change is to stop using the `hlsl.export` attribute. Instead, symbols with "program linkage" in HLSL will have export linkage with default visibility, and symbols with "external linkage" in HLSL will have export linkage with hidden visibility.
96 lines
3.5 KiB
HLSL
96 lines
3.5 KiB
HLSL
// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -triple \
|
|
// RUN: spirv-pc-vulkan-library %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
|
|
|
|
bool cond();
|
|
void foo();
|
|
|
|
void test1() {
|
|
do {
|
|
} while (cond());
|
|
}
|
|
// CHECK-LABEL: define hidden spir_func void @_Z5test1v()
|
|
// CHECK-SAME: [[A0:#[0-9]+]] {
|
|
// CHECK: entry:
|
|
// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
|
|
// CHECK: do.body:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: do.cond:
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3:#[0-9]+]] [ "convergencectrl"(token [[T1]]) ]
|
|
|
|
void test2() {
|
|
do {
|
|
foo();
|
|
} while (cond());
|
|
}
|
|
// CHECK-LABEL: define hidden spir_func void @_Z5test2v()
|
|
// CHECK-SAME: [[A0]] {
|
|
// CHECK: entry:
|
|
// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
|
|
// CHECK: do.body:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: do.cond:
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
|
|
void test3() {
|
|
do {
|
|
if (cond())
|
|
foo();
|
|
} while (cond());
|
|
}
|
|
// CHECK-LABEL: define hidden spir_func void @_Z5test3v()
|
|
// CHECK-SAME: [[A0]] {
|
|
// CHECK: entry:
|
|
// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
|
|
// CHECK: do.body:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: if.then:
|
|
// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: do.cond:
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
|
|
void test4() {
|
|
do {
|
|
if (cond()) {
|
|
foo();
|
|
break;
|
|
}
|
|
} while (cond());
|
|
}
|
|
// CHECK-LABEL: define hidden spir_func void @_Z5test4v()
|
|
// CHECK-SAME: [[A0]] {
|
|
// CHECK: entry:
|
|
// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
|
|
// CHECK: do.body:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: if.then:
|
|
// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: do.cond:
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
|
|
void test5() {
|
|
do {
|
|
while (cond()) {
|
|
if (cond()) {
|
|
foo();
|
|
break;
|
|
}
|
|
}
|
|
} while (cond());
|
|
}
|
|
// CHECK-LABEL: define hidden spir_func void @_Z5test5v()
|
|
// CHECK-SAME: [[A0]] {
|
|
// CHECK: entry:
|
|
// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
|
|
// CHECK: do.body:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: while.cond:
|
|
// CHECK: [[T2:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: if.then:
|
|
// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T2]]) ]
|
|
// CHECK: do.cond:
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
|
|
// CHECK-DAG: attributes [[A0]] = { {{.*}}convergent{{.*}} }
|
|
// CHECK-DAG: attributes [[A3]] = { {{.*}}convergent{{.*}} }
|