diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -42,16 +42,18 @@ IRBuilder<> B(M.getContext()); MDNode *Val = MDNode::get(Ctx, {ConstantAsMetadata::get(B.getInt32(Major)), ConstantAsMetadata::get(B.getInt32(Minor))}); - StringRef DxilValKey = "dx.valver"; - M.addModuleFlag(llvm::Module::ModFlagBehavior::AppendUnique, DxilValKey, Val); + StringRef DXILValKey = "dx.valver"; + auto *DXILValMD = M.getOrInsertNamedMetadata(DXILValKey); + DXILValMD->addOperand(Val); } } // namespace void CGHLSLRuntime::finishCodeGen() { auto &TargetOpts = CGM.getTarget().getTargetOpts(); - llvm::Module &M = CGM.getModule(); - addDxilValVersion(TargetOpts.DxilValidatorVersion, M); + Triple T(M.getTargetTriple()); + if (T.getArch() == Triple::ArchType::dxil) + addDxilValVersion(TargetOpts.DxilValidatorVersion, M); } void CGHLSLRuntime::annotateHLSLResource(const VarDecl *D, GlobalVariable *GV) { diff --git a/clang/test/CodeGenHLSL/validator_version.hlsl b/clang/test/CodeGenHLSL/validator_version.hlsl --- a/clang/test/CodeGenHLSL/validator_version.hlsl +++ b/clang/test/CodeGenHLSL/validator_version.hlsl @@ -1,8 +1,11 @@ // RUN: %clang -cc1 -S -triple dxil-pc-shadermodel6.3-library -S -emit-llvm -xhlsl -validator-version 1.1 -o - %s | FileCheck %s +// RUN: %clang -cc1 -S -triple spirv32 -S -emit-llvm -xhlsl -validator-version 1.1 -o - %s | FileCheck %s --check-prefix=NOT_DXIL -// CHECK:!"dx.valver", ![[valver:[0-9]+]]} +// CHECK:!dx.valver = !{![[valver:[0-9]+]]} // CHECK:![[valver]] = !{i32 1, i32 1} +// NOT_DXIL-NOT:!dx.valver + float bar(float a, float b); float foo(float a, float b) { diff --git a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp --- a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp +++ b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp @@ -58,32 +58,6 @@ return VersionTuple(Major, Minor); } -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: @@ -101,13 +75,12 @@ } // namespace bool DXILTranslateMetadata::runOnModule(Module &M) { - if (MDNode *ValVerMD = cast_or_null(M.getModuleFlag(ValVerKey))) { - auto ValVer = loadDXILValidatorVersion(ValVerMD); + if (NamedMDNode *ValVerMD = M.getNamedMetadata(ValVerKey)) { + VersionTuple ValVer = loadDXILValidatorVersion(ValVerMD->getOperand(0)); if (!ValVer.empty()) ValidatorVer = ValVer; } emitDXILValidatorVersion(M, ValidatorVer); - cleanModule(M); return false; } diff --git a/llvm/test/CodeGen/DirectX/dxil_ver.ll b/llvm/test/CodeGen/DirectX/dxil_ver.ll --- a/llvm/test/CodeGen/DirectX/dxil_ver.ll +++ b/llvm/test/CodeGen/DirectX/dxil_ver.ll @@ -3,18 +3,18 @@ target triple = "dxil-pc-shadermodel6.3-library" ; Make sure dx.valver metadata is generated. -; CHECK:!dx.valver = !{![[valver:[0-9]+]]} +; CHECK-DAG:!dx.valver = !{![[valver:[0-9]+]]} ; Make sure module flags still exist and only have 1 operand left. -; CHECK:!llvm.module.flags = !{{{![0-9]}}} +; CHECK-DAG:!llvm.module.flags = !{{{![0-9]}}} ; Make sure validator version is 1.1. -; CHECK:![[valver]] = !{i32 1, i32 1} +; CHECK-DAG:![[valver]] = !{i32 1, i32 1} ; Make sure wchar_size still exist. -; CHECK:!{i32 1, !"wchar_size", i32 4} +; CHECK-DAG:!{i32 1, !"wchar_size", i32 4} -!llvm.module.flags = !{!0, !1} -!llvm.ident = !{!3} +!llvm.module.flags = !{!0} +!dx.valver = !{!1} +!llvm.ident = !{!2} !0 = !{i32 1, !"wchar_size", i32 4} -!1 = !{i32 6, !"dx.valver", !2} -!2 = !{i32 1, i32 1} -!3 = !{!"clang version 15.0.0 (https://github.com/llvm/llvm-project 71de12113a0661649ecb2f533fba4a2818a1ad68)"} +!1 = !{i32 1, i32 1} +!2 = !{!"clang version 15.0.0 (https://github.com/llvm/llvm-project 71de12113a0661649ecb2f533fba4a2818a1ad68)"}