Skip to content

Commit eeb3604

Browse files
committed
nfc: refactor all metadata removal to TranslateMetadataPass
- insert dummy function of tbaa pass
1 parent 026a468 commit eeb3604

File tree

7 files changed

+91
-87
lines changed

7 files changed

+91
-87
lines changed

llvm/lib/Target/DirectX/DXILPrepare.cpp

Lines changed: 1 addition & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include "DirectX.h"
1717
#include "DirectXIRPasses/PointerTypeAnalysis.h"
1818
#include "llvm/ADT/STLExtras.h"
19-
#include "llvm/ADT/SmallVector.h"
2019
#include "llvm/ADT/StringSet.h"
2120
#include "llvm/Analysis/DXILMetadataAnalysis.h"
2221
#include "llvm/Analysis/DXILResource.h"
@@ -115,31 +114,6 @@ static void removeStringFunctionAttributes(Function &F,
115114
F.removeRetAttrs(DeadAttrs);
116115
}
117116

118-
static void cleanModuleFlags(Module &M) {
119-
NamedMDNode *MDFlags = M.getModuleFlagsMetadata();
120-
if (!MDFlags)
121-
return;
122-
123-
SmallVector<llvm::Module::ModuleFlagEntry> FlagEntries;
124-
M.getModuleFlagsMetadata(FlagEntries);
125-
bool Updated = false;
126-
for (auto &Flag : FlagEntries) {
127-
// llvm 3.7 only supports behavior up to AppendUnique.
128-
if (Flag.Behavior <= Module::ModFlagBehavior::AppendUnique)
129-
continue;
130-
Flag.Behavior = Module::ModFlagBehavior::Warning;
131-
Updated = true;
132-
}
133-
134-
if (!Updated)
135-
return;
136-
137-
MDFlags->eraseFromParent();
138-
139-
for (auto &Flag : FlagEntries)
140-
M.addModuleFlag(Flag.Behavior, Flag.Key->getString(), Flag.Val);
141-
}
142-
143117
class DXILPrepareModule : public ModulePass {
144118

145119
static Value *maybeGenerateBitcast(IRBuilder<> &Builder,
@@ -201,15 +175,6 @@ class DXILPrepareModule : public ModulePass {
201175
Builder.getPtrTy(PtrTy->getAddressSpace())));
202176
}
203177

204-
static std::array<unsigned, 6> getCompatibleInstructionMDs(llvm::Module &M) {
205-
return {M.getMDKindID("dx.nonuniform"),
206-
M.getMDKindID("dx.controlflow.hints"),
207-
M.getMDKindID("dx.precise"),
208-
llvm::LLVMContext::MD_range,
209-
llvm::LLVMContext::MD_alias_scope,
210-
llvm::LLVMContext::MD_noalias};
211-
}
212-
213178
public:
214179
bool runOnModule(Module &M) override {
215180
PointerTypeMap PointerTypes = PointerTypeAnalysis::run(M);
@@ -225,9 +190,6 @@ class DXILPrepareModule : public ModulePass {
225190
VersionTuple ValVer = MetadataInfo.ValidatorVersion;
226191
bool AllowExperimental = ValVer.getMajor() == 0 && ValVer.getMinor() == 0;
227192

228-
// construct allowlist of valid metadata node kinds
229-
std::array<unsigned, 6> DXILCompatibleMDs = getCompatibleInstructionMDs(M);
230-
231193
for (auto &F : M.functions()) {
232194
F.removeFnAttrs(AttrMask);
233195
F.removeRetAttrs(AttrMask);
@@ -242,8 +204,6 @@ class DXILPrepareModule : public ModulePass {
242204
IRBuilder<> Builder(&BB);
243205
for (auto &I : make_early_inc_range(BB)) {
244206

245-
I.dropUnknownNonDebugMetadata(DXILCompatibleMDs);
246-
247207
if (auto *CB = dyn_cast<CallBase>(&I)) {
248208
CB->removeFnAttrs(AttrMask);
249209
CB->removeRetAttrs(AttrMask);
@@ -285,26 +245,17 @@ class DXILPrepareModule : public ModulePass {
285245
}
286246
}
287247
}
288-
// Remove flags not for DXIL.
289-
cleanModuleFlags(M);
290-
291-
// dx.rootsignatures will have been parsed from its metadata form as its
292-
// binary form as part of the RootSignatureAnalysisWrapper, so safely
293-
// remove it as it is not recognized in DXIL
294-
if (NamedMDNode *RootSignature = M.getNamedMetadata("dx.rootsignatures"))
295-
RootSignature->eraseFromParent();
296248

297249
return true;
298250
}
299251

300252
DXILPrepareModule() : ModulePass(ID) {}
301253
void getAnalysisUsage(AnalysisUsage &AU) const override {
302254
AU.addRequired<DXILMetadataAnalysisWrapperPass>();
303-
AU.addRequired<RootSignatureAnalysisWrapper>();
304-
AU.addPreserved<RootSignatureAnalysisWrapper>();
305255
AU.addPreserved<ShaderFlagsAnalysisWrapper>();
306256
AU.addPreserved<DXILMetadataAnalysisWrapperPass>();
307257
AU.addPreserved<DXILResourceWrapperPass>();
258+
AU.addPreserved<RootSignatureAnalysisWrapper>();
308259
}
309260
static char ID; // Pass identification.
310261
};
@@ -315,7 +266,6 @@ char DXILPrepareModule::ID = 0;
315266
INITIALIZE_PASS_BEGIN(DXILPrepareModule, DEBUG_TYPE, "DXIL Prepare Module",
316267
false, false)
317268
INITIALIZE_PASS_DEPENDENCY(DXILMetadataAnalysisWrapperPass)
318-
INITIALIZE_PASS_DEPENDENCY(RootSignatureAnalysisWrapper)
319269
INITIALIZE_PASS_END(DXILPrepareModule, DEBUG_TYPE, "DXIL Prepare Module", false,
320270
false)
321271

llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp

Lines changed: 84 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "DXILTranslateMetadata.h"
10+
#include "DXILRootSignature.h"
1011
#include "DXILShaderFlags.h"
1112
#include "DirectX.h"
13+
#include "llvm/ADT/STLExtras.h"
1214
#include "llvm/ADT/SmallVector.h"
1315
#include "llvm/ADT/Twine.h"
1416
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -290,42 +292,84 @@ static MDTuple *emitTopLevelLibraryNode(Module &M, MDNode *RMD,
290292
return constructEntryMetadata(nullptr, nullptr, RMD, Properties, Ctx);
291293
}
292294

293-
// TODO: We might need to refactor this to be more generic,
294-
// in case we need more metadata to be replaced.
295-
static void translateBranchMetadata(Module &M) {
296-
for (Function &F : M) {
297-
for (BasicBlock &BB : F) {
298-
Instruction *BBTerminatorInst = BB.getTerminator();
295+
static void translateBranchMetadata(Module &M, Instruction *BBTerminatorInst) {
296+
MDNode *HlslControlFlowMD =
297+
BBTerminatorInst->getMetadata("hlsl.controlflow.hint");
298+
299+
if (!HlslControlFlowMD)
300+
return;
299301

300-
MDNode *HlslControlFlowMD =
301-
BBTerminatorInst->getMetadata("hlsl.controlflow.hint");
302+
assert(HlslControlFlowMD->getNumOperands() == 2 &&
303+
"invalid operands for hlsl.controlflow.hint");
302304

303-
if (!HlslControlFlowMD)
304-
continue;
305+
MDBuilder MDHelper(M.getContext());
306+
ConstantInt *Op1 =
307+
mdconst::extract<ConstantInt>(HlslControlFlowMD->getOperand(1));
305308

306-
assert(HlslControlFlowMD->getNumOperands() == 2 &&
307-
"invalid operands for hlsl.controlflow.hint");
309+
SmallVector<llvm::Metadata *, 2> Vals(
310+
ArrayRef<Metadata *>{MDHelper.createString("dx.controlflow.hints"),
311+
MDHelper.createConstant(Op1)});
308312

309-
MDBuilder MDHelper(M.getContext());
310-
ConstantInt *Op1 =
311-
mdconst::extract<ConstantInt>(HlslControlFlowMD->getOperand(1));
313+
MDNode *MDNode = llvm::MDNode::get(M.getContext(), Vals);
312314

313-
SmallVector<llvm::Metadata *, 2> Vals(
314-
ArrayRef<Metadata *>{MDHelper.createString("dx.controlflow.hints"),
315-
MDHelper.createConstant(Op1)});
315+
BBTerminatorInst->setMetadata("dx.controlflow.hints", MDNode);
316+
BBTerminatorInst->setMetadata("hlsl.controlflow.hint", nullptr);
317+
}
316318

317-
MDNode *MDNode = llvm::MDNode::get(M.getContext(), Vals);
319+
static std::array<unsigned, 6> getCompatibleInstructionMDs(llvm::Module &M) {
320+
return {
321+
M.getMDKindID("dx.nonuniform"), M.getMDKindID("dx.controlflow.hints"),
322+
M.getMDKindID("dx.precise"), llvm::LLVMContext::MD_range,
323+
llvm::LLVMContext::MD_alias_scope, llvm::LLVMContext::MD_noalias};
324+
}
318325

319-
BBTerminatorInst->setMetadata("dx.controlflow.hints", MDNode);
320-
BBTerminatorInst->setMetadata("hlsl.controlflow.hint", nullptr);
326+
static void translateInstructionMetadata(Module &M) {
327+
// construct allowlist of valid metadata node kinds
328+
std::array<unsigned, 6> DXILCompatibleMDs = getCompatibleInstructionMDs(M);
329+
330+
for (Function &F : M) {
331+
for (BasicBlock &BB : F) {
332+
// This needs to be done first so that "hlsl.controlflow.hints" isn't
333+
// removed in the whitelist below
334+
if (auto *I = BB.getTerminator())
335+
translateBranchMetadata(M, I);
336+
337+
for (auto &I : make_early_inc_range(BB)) {
338+
I.dropUnknownNonDebugMetadata(DXILCompatibleMDs);
339+
}
321340
}
322341
}
323342
}
324343

325-
static void translateMetadata(Module &M, DXILResourceMap &DRM,
326-
DXILResourceTypeMap &DRTM,
327-
const ModuleShaderFlags &ShaderFlags,
328-
const ModuleMetadataInfo &MMDI) {
344+
static void cleanModuleFlags(Module &M) {
345+
NamedMDNode *MDFlags = M.getModuleFlagsMetadata();
346+
if (!MDFlags)
347+
return;
348+
349+
SmallVector<llvm::Module::ModuleFlagEntry> FlagEntries;
350+
M.getModuleFlagsMetadata(FlagEntries);
351+
bool Updated = false;
352+
for (auto &Flag : FlagEntries) {
353+
// llvm 3.7 only supports behavior up to AppendUnique.
354+
if (Flag.Behavior <= Module::ModFlagBehavior::AppendUnique)
355+
continue;
356+
Flag.Behavior = Module::ModFlagBehavior::Warning;
357+
Updated = true;
358+
}
359+
360+
if (!Updated)
361+
return;
362+
363+
MDFlags->eraseFromParent();
364+
365+
for (auto &Flag : FlagEntries)
366+
M.addModuleFlag(Flag.Behavior, Flag.Key->getString(), Flag.Val);
367+
}
368+
369+
static void translateGlobalMetadata(Module &M, DXILResourceMap &DRM,
370+
DXILResourceTypeMap &DRTM,
371+
const ModuleShaderFlags &ShaderFlags,
372+
const ModuleMetadataInfo &MMDI) {
329373
LLVMContext &Ctx = M.getContext();
330374
IRBuilder<> IRB(Ctx);
331375
SmallVector<MDNode *> EntryFnMDNodes;
@@ -381,6 +425,14 @@ static void translateMetadata(Module &M, DXILResourceMap &DRM,
381425
M.getOrInsertNamedMetadata("dx.entryPoints");
382426
for (auto *Entry : EntryFnMDNodes)
383427
EntryPointsNamedMD->addOperand(Entry);
428+
429+
cleanModuleFlags(M);
430+
431+
// dx.rootsignatures will have been parsed from its metadata form as its
432+
// binary form as part of the RootSignatureAnalysisWrapper, so safely
433+
// remove it as it is not recognized in DXIL
434+
if (NamedMDNode *RootSignature = M.getNamedMetadata("dx.rootsignatures"))
435+
RootSignature->eraseFromParent();
384436
}
385437

386438
PreservedAnalyses DXILTranslateMetadata::run(Module &M,
@@ -390,8 +442,8 @@ PreservedAnalyses DXILTranslateMetadata::run(Module &M,
390442
const ModuleShaderFlags &ShaderFlags = MAM.getResult<ShaderFlagsAnalysis>(M);
391443
const dxil::ModuleMetadataInfo MMDI = MAM.getResult<DXILMetadataAnalysis>(M);
392444

393-
translateMetadata(M, DRM, DRTM, ShaderFlags, MMDI);
394-
translateBranchMetadata(M);
445+
translateGlobalMetadata(M, DRM, DRTM, ShaderFlags, MMDI);
446+
translateInstructionMetadata(M);
395447

396448
return PreservedAnalyses::all();
397449
}
@@ -409,6 +461,8 @@ class DXILTranslateMetadataLegacy : public ModulePass {
409461
AU.addRequired<DXILResourceWrapperPass>();
410462
AU.addRequired<ShaderFlagsAnalysisWrapper>();
411463
AU.addRequired<DXILMetadataAnalysisWrapperPass>();
464+
AU.addRequired<RootSignatureAnalysisWrapper>();
465+
AU.addPreserved<RootSignatureAnalysisWrapper>();
412466
AU.addPreserved<DXILResourceWrapperPass>();
413467
AU.addPreserved<DXILMetadataAnalysisWrapperPass>();
414468
AU.addPreserved<ShaderFlagsAnalysisWrapper>();
@@ -425,8 +479,8 @@ class DXILTranslateMetadataLegacy : public ModulePass {
425479
dxil::ModuleMetadataInfo MMDI =
426480
getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
427481

428-
translateMetadata(M, DRM, DRTM, ShaderFlags, MMDI);
429-
translateBranchMetadata(M);
482+
translateGlobalMetadata(M, DRM, DRTM, ShaderFlags, MMDI);
483+
translateInstructionMetadata(M);
430484
return true;
431485
}
432486
};
@@ -443,6 +497,7 @@ INITIALIZE_PASS_BEGIN(DXILTranslateMetadataLegacy, "dxil-translate-metadata",
443497
"DXIL Translate Metadata", false, false)
444498
INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapperPass)
445499
INITIALIZE_PASS_DEPENDENCY(ShaderFlagsAnalysisWrapper)
500+
INITIALIZE_PASS_DEPENDENCY(RootSignatureAnalysisWrapper)
446501
INITIALIZE_PASS_DEPENDENCY(DXILMetadataAnalysisWrapperPass)
447502
INITIALIZE_PASS_END(DXILTranslateMetadataLegacy, "dxil-translate-metadata",
448503
"DXIL Translate Metadata", false, false)

llvm/test/CodeGen/DirectX/legalize-module-flags.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: opt -S -dxil-prepare -mtriple=dxil-unknown-shadermodel6.0-compute %s | FileCheck %s
1+
; RUN: opt -S -dxil-translate-metadata -mtriple=dxil-unknown-shadermodel6.0-compute %s | FileCheck %s
22

33
; Make sure behavior flag > 6 is fixed.
44
; CHECK: !{i32 2, !"frame-pointer", i32 2}

llvm/test/CodeGen/DirectX/legalize-module-flags2.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: opt -S -dxil-prepare -mtriple=dxil-unknown-shadermodel6.0-library %s | FileCheck %s
1+
; RUN: opt -S -dxil-translate-metadata -mtriple=dxil-unknown-shadermodel6.0-library %s | FileCheck %s
22

33
; CHECK: define void @main()
44
; Make sure behavior flag > 6 is fixed.

llvm/test/CodeGen/DirectX/llc-pipeline.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040
; CHECK-NEXT: DXIL Resources Analysis
4141
; CHECK-NEXT: DXIL Module Metadata analysis
4242
; CHECK-NEXT: DXIL Shader Flag Analysis
43-
; CHECK-NEXT: DXIL Translate Metadata
4443
; CHECK-NEXT: DXIL Root Signature Analysis
44+
; CHECK-NEXT: DXIL Translate Metadata
4545
; CHECK-NEXT: DXIL Post Optimization Validation
4646
; CHECK-NEXT: DXIL Op Lowering
4747
; CHECK-NEXT: DXIL Prepare Module

llvm/test/CodeGen/DirectX/metadata-stripping.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: opt -S --dxil-prepare %s | FileCheck %s
1+
; RUN: opt -S --dxil-translate-metadata %s | FileCheck %s
22

33
; Test that only metadata nodes that are valid in DXIL are allowed through
44

llvm/test/CodeGen/DirectX/strip-rootsignatures.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
; RUN: opt -S -dxil-prepare < %s | FileCheck %s
1+
; RUN: opt -S -dxil-translate-metadata < %s | FileCheck %s
22

3-
; Ensures that dxil-prepare will remove the dx.rootsignatures metadata
3+
; Ensures that dxil-translate-metadata will remove the dx.rootsignatures metadata
44

55
target triple = "dxil-unknown-shadermodel6.0-compute"
66

@@ -10,7 +10,6 @@ entry:
1010
}
1111

1212
; CHECK-NOT: !dx.rootsignatures
13-
; CHECK-NOT: {{^!}}
1413

1514
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
1615
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature

0 commit comments

Comments
 (0)