[DirectX backend] When cleanup module flags only remove unused flags.
authorpython3kgae <python3kgae@outlook.com>
Tue, 17 May 2022 23:57:18 +0000 (16:57 -0700)
committerpython3kgae <python3kgae@outlook.com>
Thu, 19 May 2022 21:50:11 +0000 (14:50 -0700)
Only remove dx.valver from module flags when cleanup module flags in DXILTranslateMetadataPass.

Reviewed By: beanz

Differential Revision: https://reviews.llvm.org/D125842

llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
llvm/test/CodeGen/DirectX/dxil_ver.ll

index 1dbe424..e587dd5 100644 (file)
@@ -9,8 +9,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "DirectX.h"
+#include "llvm/ADT/StringSet.h"
 #include "llvm/ADT/Triple.h"
 #include "llvm/IR/Constants.h"
+#include "llvm/IR/Metadata.h"
 #include "llvm/IR/Module.h"
 #include "llvm/Pass.h"
 
@@ -56,10 +58,32 @@ static VersionTuple loadDXILValidatorVersion(MDNode *ValVerMD) {
   return VersionTuple(Major, Minor);
 }
 
-static void cleanModule(Module &M) {
-  M.getOrInsertModuleFlagsMetadata()->eraseFromParent();
+static void cleanModuleFlags(Module &M) {
+  constexpr StringLiteral DeadKeys[] = {ValVerKey};
+  // Collect DeadKeys in ModuleFlags.
+  StringSet<> DeadKeySet;
+  for (auto &Key : DeadKeys) {
+    if (M.getModuleFlag(Key))
+      DeadKeySet.insert(Key);
+  }
+  if (DeadKeySet.empty())
+    return;
+
+  SmallVector<Module::ModuleFlagEntry, 8> ModuleFlags;
+  M.getModuleFlagsMetadata(ModuleFlags);
+  NamedMDNode *MDFlags = M.getModuleFlagsMetadata();
+  MDFlags->eraseFromParent();
+  // Add ModuleFlag which not dead.
+  for (auto &Flag : ModuleFlags) {
+    StringRef Key = Flag.Key->getString();
+    if (DeadKeySet.contains(Key))
+      continue;
+    M.addModuleFlag(Flag.Behavior, Key, Flag.Val);
+  }
 }
 
+static void cleanModule(Module &M) { cleanModuleFlags(M); }
+
 namespace {
 class DXILTranslateMetadata : public ModulePass {
 public:
index 3c851ad..dcc9b6a 100644 (file)
@@ -2,8 +2,14 @@
 target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64"
 target triple = "dxil-pc-shadermodel6.3-library"
 
+; Make sure dx.valver metadata is generated.
 ; CHECK:!dx.valver = !{![[valver:[0-9]+]]}
+; Make sure module flags still exist and only have 1 operand left.
+; CHECK:!llvm.module.flags = !{{{![0-9]}}}
+; Make sure validator version is 1.1.
 ; CHECK:![[valver]] = !{i32 1, i32 1}
+; Make sure wchar_size still exist.
+; CHECK:!{i32 1, !"wchar_size", i32 4}
 
 !llvm.module.flags = !{!0, !1}
 !llvm.ident = !{!3}