diff --git a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp index 1dbe424058a66..e587dd53c62ad 100644 --- a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp +++ b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp @@ -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 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: diff --git a/llvm/test/CodeGen/DirectX/dxil_ver.ll b/llvm/test/CodeGen/DirectX/dxil_ver.ll index 3c851ad95ffd8..dcc9b6a797f6a 100644 --- a/llvm/test/CodeGen/DirectX/dxil_ver.ll +++ b/llvm/test/CodeGen/DirectX/dxil_ver.ll @@ -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}