llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-directx

Author: Joshua Batista (bob80905)

<details>
<summary>Changes</summary>

This PR introduces a Metadata Node Kind whitelist. The purpose is to prevent 
newer Metadata Node Kinds to be used and inserted into the outputted DXIL 
module. The Github DXC validator doesn't support these newer Metadata Node 
Kinds, so we need to filter them out. 
In Github DXC, `lib\HLSL\DxilPreparePasses.cpp:814`, there is a loop:
```
for (unsigned I = LLVMContext::MD_fpmath + 1;
     I &lt;= LLVMContext::MD_dereferenceable_or_null; ++I) {
  IllegalMDSet.insert(I);
}
```
that loops up to and including the last metadata node kind that should be 
disallowed in the current context. I believe this code shows that there are no 
other metadata nodes to be allowed, setting aside the explicit list shown in 
`lib\IR\LLVMContext.cpp:34`
So, given that this is the world of acceptable metadata node kinds, we 
introduce this restrictive whitelist into LLVM and strip all metadata that 
isn't found in the list.

The accompanying test would add the loop.llvm.mustprogress metadata node kind, 
but thanks to the whitelist, filters it out, and so the whitelist is proven to 
work.

---
Full diff: https://github.com/llvm/llvm-project/pull/136386.diff


2 Files Affected:

- (added) clang/test/CodeGenHLSL/metadata-stripping.hlsl (+13) 
- (modified) llvm/lib/Target/DirectX/DXILPrepare.cpp (+20) 


``````````diff
diff --git a/clang/test/CodeGenHLSL/metadata-stripping.hlsl 
b/clang/test/CodeGenHLSL/metadata-stripping.hlsl
new file mode 100644
index 0000000000000..0178f5efe4c01
--- /dev/null
+++ b/clang/test/CodeGenHLSL/metadata-stripping.hlsl
@@ -0,0 +1,13 @@
+// RUN: %clang --driver-mode=dxc -T cs_6_0 -Fo x.dxil %s | FileCheck %s
+// CHECK-NOT: llvm.loop.mustprogress
+
+StructuredBuffer<uint4> X : register(t0);
+StructuredBuffer<float4> In : register(t1);
+RWStructuredBuffer<float4> Out : register(u0);
+
+[numthreads(1, 1, 1)]
+void main(uint3 dispatch_thread_id : SV_DispatchThreadID) {
+  for (uint I = 0; I < X[dispatch_thread_id].x; ++I) {
+    Out[dispatch_thread_id] = In[dispatch_thread_id];
+  }
+}
diff --git a/llvm/lib/Target/DirectX/DXILPrepare.cpp 
b/llvm/lib/Target/DirectX/DXILPrepare.cpp
index de97de209048b..c54a5ac5c1227 100644
--- a/llvm/lib/Target/DirectX/DXILPrepare.cpp
+++ b/llvm/lib/Target/DirectX/DXILPrepare.cpp
@@ -189,6 +189,26 @@ class DXILPrepareModule : public ModulePass {
       for (auto &BB : F) {
         IRBuilder<> Builder(&BB);
         for (auto &I : make_early_inc_range(BB)) {
+
+          // TODO: Audit this list - is it enough? Too much?
+          static unsigned DXILCompatibleMDs[] = {
+              LLVMContext::MD_dbg,
+              LLVMContext::MD_tbaa,
+              LLVMContext::MD_prof,
+              LLVMContext::MD_fpmath,
+              LLVMContext::MD_range,
+              LLVMContext::MD_tbaa_struct,
+              LLVMContext::MD_invariant_load,
+              LLVMContext::MD_alias_scope,
+              LLVMContext::MD_noalias,
+              LLVMContext::MD_nontemporal,
+              LLVMContext::MD_mem_parallel_loop_access,
+              LLVMContext::MD_nonnull,
+              LLVMContext::MD_dereferenceable,
+              LLVMContext::MD_dereferenceable_or_null,
+          };
+          I.dropUnknownNonDebugMetadata(DXILCompatibleMDs);
+
           if (I.getOpcode() == Instruction::FNeg) {
             Builder.SetInsertPoint(&I);
             Value *In = I.getOperand(0);

``````````

</details>


https://github.com/llvm/llvm-project/pull/136386
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to