Skip to content

Commit ca014db

Browse files
committed
Delete metadata dx.disable_optimizations, if it exists,
from module after its presence has been noted in ModuleMetadata Analysis pass. This ensures that this metadata that is not part of DXIL specification is not emitted in the final output. Update disable-opt.ll to verify dx.disable_optimizations metadata is deleted.
1 parent 1dda593 commit ca014db

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

llvm/lib/Analysis/DXILMetadataAnalysis.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,32 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
7171

7272
// Set shader flags based on Module properties
7373
SmallVector<llvm::Module::ModuleFlagEntry> FlagEntries;
74+
SmallVector<llvm::Module::ModuleFlagEntry> NewFlagEntries;
7475
M.getModuleFlagsMetadata(FlagEntries);
7576
for (const auto &Flag : FlagEntries) {
76-
if (Flag.Behavior != Module::ModFlagBehavior::Override)
77-
continue;
78-
if (Flag.Key->getString().compare("dx.disable_optimizations") == 0) {
77+
if ((Flag.Behavior == Module::ModFlagBehavior::Override) &&
78+
(Flag.Key->getString().compare("dx.disable_optimizations") == 0)) {
7979
const auto *V = mdconst::extract<llvm::ConstantInt>(Flag.Val);
80-
if (V->isOne()) {
80+
if (V->isOne())
8181
MMDAI.DisableOptimizations = true;
82-
break;
83-
}
84-
}
82+
} else
83+
// Collect all Module Flags other than dx.disable_optimizations.
84+
NewFlagEntries.push_back(Flag);
85+
}
86+
87+
// "dx.disable_optimizations" is not included in the metadata specified in
88+
// DXIL specification. Hence it needs to be deleted such that it is not
89+
// emitted in the final DXIL output, now that its intent is captured in MMDAI,
90+
// if present.
91+
92+
if (NewFlagEntries.size() != FlagEntries.size()) {
93+
NamedMDNode *OrigMDFlags = M.getModuleFlagsMetadata();
94+
// Delete all Module flags
95+
OrigMDFlags->eraseFromParent();
96+
// Repopulate Module flags using the list that excludes
97+
// dx.delete_optimizations.
98+
for (const auto &Flag : NewFlagEntries)
99+
M.addModuleFlag(Flag.Behavior, Flag.Key->getString(), Flag.Val);
85100
}
86101

87102
return MMDAI;

llvm/test/CodeGen/DirectX/ShaderFlags/disable-opt.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ entry:
1818
ret void
1919
}
2020

21+
; CHECK-NOT: llvm.module.flags
2122
!llvm.module.flags = !{!0}
2223

24+
; CHECK-NOT: "dx.disable_optimizations"
2325
!0 = !{i32 4, !"dx.disable_optimizations", i32 1}
2426

2527

0 commit comments

Comments
 (0)