[clang] [DXIL] Don't generate per-variable guards for DirectX (PR #106096)
Greg Roth via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 27 10:16:34 PDT 2024
https://github.com/pow2clk updated https://github.com/llvm/llvm-project/pull/106096
>From a7242d7183b9a65c7e205c80f3a2bfe3866fcfb7 Mon Sep 17 00:00:00 2001
From: Greg Roth <grroth at microsoft.com>
Date: Fri, 23 Aug 2024 16:00:01 -0600
Subject: [PATCH 1/2] [DXIL] Don't generate per-variable guards for DirectX
Thread init guards are generated for local static variables when
using the Microsoft CXX ABI. This ABI is also used for HLSL generation,
but DXIL doesn't need the corresponding _Init_thread_header/footer
calls and doesn't really have a way to handle them in its output
targets.
This modifies the language ops when the target is DXIL to exclude this
so that they won't be generated and an alternate guardvar method is used.
Done to facilitate testing for #89806, but isn't really related
---
clang/lib/Basic/Targets/DirectX.h | 7 ++++
clang/test/CodeGenHLSL/static-local-ctor.hlsl | 37 +++++++++++++++++++
2 files changed, 44 insertions(+)
create mode 100644 clang/test/CodeGenHLSL/static-local-ctor.hlsl
diff --git a/clang/lib/Basic/Targets/DirectX.h b/clang/lib/Basic/Targets/DirectX.h
index a084e2823453fc..cf7ea5e83503dc 100644
--- a/clang/lib/Basic/Targets/DirectX.h
+++ b/clang/lib/Basic/Targets/DirectX.h
@@ -94,6 +94,13 @@ class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo {
BuiltinVaListKind getBuiltinVaListKind() const override {
return TargetInfo::VoidPtrBuiltinVaList;
}
+
+ void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override {
+ TargetInfo::adjust(Diags, Opts);
+ // The static values this addresses do not apply outside of the same thread
+ // This protection is neither available nor needed
+ Opts.ThreadsafeStatics = false;
+ }
};
} // namespace targets
diff --git a/clang/test/CodeGenHLSL/static-local-ctor.hlsl b/clang/test/CodeGenHLSL/static-local-ctor.hlsl
new file mode 100644
index 00000000000000..d19f843b6f25c3
--- /dev/null
+++ b/clang/test/CodeGenHLSL/static-local-ctor.hlsl
@@ -0,0 +1,37 @@
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -emit-llvm -o - -disable-llvm-passes %s | FileCheck %s
+
+// Verify that no per variable _Init_thread instructions are emitted for non-trivial static locals
+// These would normally be emitted by the MicrosoftCXXABI, but the DirectX backend should exlude them
+// Instead, check for the guardvar oparations that should protect the constructor initialization should
+// only take place once.
+
+RWBuffer<int> buf[10];
+
+void InitBuf(RWBuffer<int> buf) {
+ for (unsigned i; i < 100; i++)
+ buf[i] = 0;
+}
+
+// CHECK-NOT: _Init_thread_epoch
+// CHECK: define internal void @"?main@@YAXXZ"
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[Tmp1:%.*]] = alloca %"class.hlsl::RWBuffer"
+// CHECK-NEXT: [[Tmp2:%.*]] = load i32, ptr
+// CHECK-NEXT: [[Tmp3:%.*]] = and i32 [[Tmp2]], 1
+// CHECK-NEXT: [[Tmp4:%.*]] = icmp eq i32 [[Tmp3]], 0
+// CHECK-NEXT: br i1 [[Tmp4]]
+// CHECK-NOT: _Init_thread_header
+// CHECK: init:
+// CHECK-NEXT: = or i32 [[Tmp2]], 1
+// CHECK-NOT: _Init_thread_footer
+
+
+[shader("compute")]
+[numthreads(1,1,1)]
+void main() {
+ // A non-trivially initialized static local will get checks to verify that it is generated just once
+ static RWBuffer<int> mybuf;
+ mybuf = buf[0];
+ InitBuf(mybuf);
+}
+
>From b9d72573d6502a754312974b0839274d9d76219e Mon Sep 17 00:00:00 2001
From: Greg Roth <grroth at microsoft.com>
Date: Tue, 27 Aug 2024 11:15:39 -0600
Subject: [PATCH 2/2] minor improvements to constructor test
---
clang/test/CodeGenHLSL/static-local-ctor.hlsl | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/test/CodeGenHLSL/static-local-ctor.hlsl b/clang/test/CodeGenHLSL/static-local-ctor.hlsl
index d19f843b6f25c3..f55f6808672dea 100644
--- a/clang/test/CodeGenHLSL/static-local-ctor.hlsl
+++ b/clang/test/CodeGenHLSL/static-local-ctor.hlsl
@@ -8,7 +8,7 @@
RWBuffer<int> buf[10];
void InitBuf(RWBuffer<int> buf) {
- for (unsigned i; i < 100; i++)
+ for (unsigned int i = 0; i < 100; i++)
buf[i] = 0;
}
@@ -29,7 +29,7 @@ void InitBuf(RWBuffer<int> buf) {
[shader("compute")]
[numthreads(1,1,1)]
void main() {
- // A non-trivially initialized static local will get checks to verify that it is generated just once
+ // A non-trivially constructed static local will get checks to verify that it is generated just once
static RWBuffer<int> mybuf;
mybuf = buf[0];
InitBuf(mybuf);
More information about the cfe-commits
mailing list