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.
126 lines
4.5 KiB
HLSL
126 lines
4.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() {
|
|
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: while.cond:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3:#[0-9]+]] [ "convergencectrl"(token [[T1]]) ]
|
|
|
|
void test2() {
|
|
while (cond()) {
|
|
foo();
|
|
}
|
|
}
|
|
// CHECK-LABEL: define hidden spir_func void @_Z5test2v()
|
|
// CHECK-SAME: [[A0]] {
|
|
// CHECK: entry:
|
|
// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
|
|
// CHECK: while.cond:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: while.body:
|
|
// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
|
|
void test3() {
|
|
while (cond()) {
|
|
if (cond())
|
|
break;
|
|
foo();
|
|
}
|
|
}
|
|
// CHECK-LABEL: define hidden spir_func void @_Z5test3v()
|
|
// CHECK-SAME: [[A0]] {
|
|
// CHECK: entry:
|
|
// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
|
|
// CHECK: while.cond:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: if.then:
|
|
// CHECK: br label %while.end
|
|
// CHECK: if.end:
|
|
// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: br label %while.cond
|
|
|
|
void test4() {
|
|
while (cond()) {
|
|
if (cond()) {
|
|
foo();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
// CHECK-LABEL: define hidden spir_func void @_Z5test4v()
|
|
// CHECK-SAME: [[A0]] {
|
|
// CHECK: entry:
|
|
// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
|
|
// CHECK: while.cond:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: if.then:
|
|
// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: br label %while.end
|
|
// CHECK: if.end:
|
|
// CHECK: br label %while.cond
|
|
|
|
void test5() {
|
|
while (cond()) {
|
|
while (cond()) {
|
|
if (cond()) {
|
|
foo();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// CHECK-LABEL: define hidden spir_func void @_Z5test5v()
|
|
// CHECK-SAME: [[A0]] {
|
|
// CHECK: entry:
|
|
// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
|
|
// CHECK: while.cond:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: while.cond2:
|
|
// CHECK: [[T2:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T2]]) ]
|
|
// CHECK: if.then:
|
|
// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T2]]) ]
|
|
// CHECK: br label %while.end
|
|
|
|
void test6() {
|
|
while (cond()) {
|
|
while (cond()) {
|
|
}
|
|
|
|
if (cond()) {
|
|
foo();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
// CHECK-LABEL: define hidden spir_func void @_Z5test6v()
|
|
// CHECK-SAME: [[A0]] {
|
|
// CHECK: entry:
|
|
// CHECK: [[T0:%[0-9]+]] = call token @llvm.experimental.convergence.entry()
|
|
// CHECK: while.cond:
|
|
// CHECK: [[T1:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T0]]) ]
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: while.cond2:
|
|
// CHECK: [[T2:%[0-9]+]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: call spir_func noundef i1 @_Z4condv() [[A3]] [ "convergencectrl"(token [[T2]]) ]
|
|
// CHECK: if.then:
|
|
// CHECK: call spir_func void @_Z3foov() [[A3]] [ "convergencectrl"(token [[T1]]) ]
|
|
// CHECK: br label %while.end
|
|
|
|
// CHECK-DAG: attributes [[A0]] = { {{.*}}convergent{{.*}} }
|
|
// CHECK-DAG: attributes [[A3]] = { {{.*}}convergent{{.*}} }
|