<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/134575>134575</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [DirectX] Strip loop metadata that will trip up the validator when generating DXIL
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:DirectX
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          bogner
      </td>
    </tr>
</table>

<pre>
    Compiling [particle_life](https://github.com/damyanp/dplife/blob/main/src/particle_life/particle_life.hlsl) with clang fails the validator with an error about `llvm.loop.mustprogress` being invalid. This particular metadata node is newer than the version of LLVM that DXIL is based off of, so it makes sense that it's a problem.

We need to strip metadata that the DXIL validator (and thus, potentially, DXIL drivers) isn't aware of. This may be as simple as the following:

```diff
--- a/llvm/lib/Target/DirectX/DXILPrepare.cpp
+++ b/llvm/lib/Target/DirectX/DXILPrepare.cpp
@@ -189,6 +189,26 @@ public:
 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);
```

Here, we strip anything that isn't listed in DXC's set of pinned metadata names in `LLVMContext.h`. We need to determine if this is the right granularity.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVt9v27gP_2uUF6KGK8f58ZCHpPka3wDtNtx6u74FtEXbusmSIcnL5b8_0E6XrrtrsROMVorIDymK_FAYgm4s0UbkO5HvZzjE1vlN6RpLflY6dd7cua7XRtsGRL7r0UddGToaXZPI90Ku2hj7ILKtkIWQRaNjO5RJ5TohC4XdGW3Ps35UkEVpXClk0aG2QhbBV0IWP4K-WietCUbINZx0bKEyaBuoUZsAsSX4hkYrjM5P22iBvHcesHRDBLFIjfnWJca5PumGEHvvGk8hiEUKJfGZtB0hEnhsdYDJ8mDQQ0cRFUYE6xSBDmDpRB5ii3ayTD5oZ8HVcH__5YE3IuyfDvcsW2IgBa6uwdVC3kFwoCN0-JUCBLKBJnEdhVwGQOi9Kw11iUi3It3-QWCJFEQHIXrdX30Ztdj6aOh6eCFXaBXEdghsrneRbNRozJmXo7Dyml3mSOpghVxGwBN6AldfDt_hGUoCDBB015txxrZqZ4w7advwJY8OikU6fUrXtUi3Nzc3gEIWHGz-p_mKH9E3FIUs9tpTFZ949nS4_-SpR09J1feMJHfTB-V_05-nYp7Cze1qLeTdAoTcTVO5gMteP5RGV5PvUF-CNUQHQi52OxDZFgqOiljuWOJ5HH7bDdoo8iK7E9n_4HklV6OekGuR_aDwCvowIvOVHwm9OR-1rY4ebUNCrib970Y5BOPf72AwVRM8ftx_ZJztoDTfvA5gdIhww1mmI5B1Q9OKrIBH56AbKp6_xgoRo65gsGOtqzEfuKox6tLQwz5MxQ8i218dgh8Gp_ids5H-ihzJbPuwP6qyEfLuIv1PArFEvEq8i9f7sVjeAKz7DmP7C5CXeL_n5DFEP1TxbUFmCq_RxqNxqN6WRaMxHEPlevoFb60b9d6GtrzueufRvC3YUXfs0aMxZI7MgEesKua-9-DtYMwveK3IU02ebEVYmnei_Ur46PzxX8yJ5X4qMP71kCjv-t_tV-tO9oOzeyqH5uHCikKufs7o5_KcSuvFEXTNVXpIGoof-8opGit6zcnP-X-wUy5oZyeniw_UvKCHCw0knykebCAfPzlt48QKh59JgccXNAOBkNuDHUvsYps8WiXkKr36-kyrE8v-nzxHE050aQNoz7HlpjU1jwuLMx-QAm1h_3Q39pNAkdtSry1X-7WRYUeB5cQifXE3SSsWaQIvmo6iSL7TljhYI-foqRN43bQRGo-WW6SO52SmNplaZ2uc0eZ2Oc_W69XyVs7aDa5X-RpVntbLMlsrWc9puV5nNea0wCpbzPRGpjJP5-kynaf5rUxqXC2zMsdqld-mS8ncTR1qk4wt3PlmpkMYaHObzfNlPjNYkgnju0XKEquvZJXItt-bheTnjN-w8k05NEHMU45UuMJFHc348HnWyffweQw0V8urpnvSxsC4OfSvXx4tWWjIksfIt8PJOBu82bzxMnrudOxd792fxOxTjAcMQhaXM37byL8DAAD__48P9TA">