[llvm] 5e9dd88 - [DirectX] remove string function attribute DXIL not allowed (#90778)
via llvm-commits
llvm-commits at lists.llvm.org
Tue May 7 13:19:56 PDT 2024
Author: Xiang Li
Date: 2024-05-07T16:19:52-04:00
New Revision: 5e9dd8827b3ccd03f8499b610deb6accd2d71d21
URL: https://github.com/llvm/llvm-project/commit/5e9dd8827b3ccd03f8499b610deb6accd2d71d21
DIFF: https://github.com/llvm/llvm-project/commit/5e9dd8827b3ccd03f8499b610deb6accd2d71d21.diff
LOG: [DirectX] remove string function attribute DXIL not allowed (#90778)
Remove string function attribute other than
"waveops-include-helper-lanes" and "fp32-denorm-mode".
Move DXILPrepareModulePass after DXILTranslateMetadataPass since
DXILTranslateMetadataPass needs to use attribute like hlsl.numthreads.
Fixes #90773
Added:
llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs-val-ver-0.0.ll
Modified:
llvm/lib/Target/DirectX/DXILMetadata.cpp
llvm/lib/Target/DirectX/DXILMetadata.h
llvm/lib/Target/DirectX/DXILPrepare.cpp
llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs.ll
llvm/test/tools/dxil-dis/attribute-filter.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/DirectX/DXILMetadata.cpp b/llvm/lib/Target/DirectX/DXILMetadata.cpp
index 2d94490a7f24c..03758dc76e7eb 100644
--- a/llvm/lib/Target/DirectX/DXILMetadata.cpp
+++ b/llvm/lib/Target/DirectX/DXILMetadata.cpp
@@ -40,6 +40,15 @@ void ValidatorVersionMD::update(VersionTuple ValidatorVer) {
bool ValidatorVersionMD::isEmpty() { return Entry->getNumOperands() == 0; }
+VersionTuple ValidatorVersionMD::getAsVersionTuple() {
+ if (isEmpty())
+ return VersionTuple(1, 0);
+ auto *ValVerMD = cast<MDNode>(Entry->getOperand(0));
+ auto *MajorMD = mdconst::extract<ConstantInt>(ValVerMD->getOperand(0));
+ auto *MinorMD = mdconst::extract<ConstantInt>(ValVerMD->getOperand(1));
+ return VersionTuple(MajorMD->getZExtValue(), MinorMD->getZExtValue());
+}
+
static StringRef getShortShaderStage(Triple::EnvironmentType Env) {
switch (Env) {
case Triple::Pixel:
diff --git a/llvm/lib/Target/DirectX/DXILMetadata.h b/llvm/lib/Target/DirectX/DXILMetadata.h
index 2f5d7d9fe7683..cd9f4c83fbd0f 100644
--- a/llvm/lib/Target/DirectX/DXILMetadata.h
+++ b/llvm/lib/Target/DirectX/DXILMetadata.h
@@ -30,6 +30,7 @@ class ValidatorVersionMD {
void update(VersionTuple ValidatorVer);
bool isEmpty();
+ VersionTuple getAsVersionTuple();
};
void createShaderModelMD(Module &M);
diff --git a/llvm/lib/Target/DirectX/DXILPrepare.cpp b/llvm/lib/Target/DirectX/DXILPrepare.cpp
index 026911946b47f..24be644d9fc0e 100644
--- a/llvm/lib/Target/DirectX/DXILPrepare.cpp
+++ b/llvm/lib/Target/DirectX/DXILPrepare.cpp
@@ -11,10 +11,14 @@
/// Language (DXIL).
//===----------------------------------------------------------------------===//
+#include "DXILMetadata.h"
+#include "DXILResourceAnalysis.h"
+#include "DXILShaderFlags.h"
#include "DirectX.h"
#include "DirectXIRPasses/PointerTypeAnalysis.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringSet.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/IR/AttributeMask.h"
#include "llvm/IR/IRBuilder.h"
@@ -23,6 +27,7 @@
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/Compiler.h"
+#include "llvm/Support/VersionTuple.h"
#define DEBUG_TYPE "dxil-prepare"
@@ -80,6 +85,37 @@ constexpr bool isValidForDXIL(Attribute::AttrKind Attr) {
Attr);
}
+static void collectDeadStringAttrs(AttributeMask &DeadAttrs, AttributeSet &&AS,
+ const StringSet<> &LiveKeys,
+ bool AllowExperimental) {
+ for (auto &Attr : AS) {
+ if (!Attr.isStringAttribute())
+ continue;
+ StringRef Key = Attr.getKindAsString();
+ if (LiveKeys.contains(Key))
+ continue;
+ if (AllowExperimental && Key.starts_with("exp-"))
+ continue;
+ DeadAttrs.addAttribute(Key);
+ }
+}
+
+static void removeStringFunctionAttributes(Function &F,
+ bool AllowExperimental) {
+ AttributeList Attrs = F.getAttributes();
+ const StringSet<> LiveKeys = {"waveops-include-helper-lanes",
+ "fp32-denorm-mode"};
+ // Collect DeadKeys in FnAttrs.
+ AttributeMask DeadAttrs;
+ collectDeadStringAttrs(DeadAttrs, Attrs.getFnAttrs(), LiveKeys,
+ AllowExperimental);
+ collectDeadStringAttrs(DeadAttrs, Attrs.getRetAttrs(), LiveKeys,
+ AllowExperimental);
+
+ F.removeFnAttrs(DeadAttrs);
+ F.removeRetAttrs(DeadAttrs);
+}
+
class DXILPrepareModule : public ModulePass {
static Value *maybeGenerateBitcast(IRBuilder<> &Builder,
@@ -110,9 +146,18 @@ class DXILPrepareModule : public ModulePass {
if (!isValidForDXIL(I))
AttrMask.addAttribute(I);
}
+
+ dxil::ValidatorVersionMD ValVerMD(M);
+ VersionTuple ValVer = ValVerMD.getAsVersionTuple();
+ bool SkipValidation = ValVer.getMajor() == 0 && ValVer.getMinor() == 0;
+
for (auto &F : M.functions()) {
F.removeFnAttrs(AttrMask);
F.removeRetAttrs(AttrMask);
+ // Only remove string attributes if we are not skipping validation.
+ // This will reserve the experimental attributes when validation version
+ // is 0.0 for experiment mode.
+ removeStringFunctionAttributes(F, SkipValidation);
for (size_t Idx = 0, End = F.arg_size(); Idx < End; ++Idx)
F.removeParamAttrs(Idx, AttrMask);
@@ -172,7 +217,10 @@ class DXILPrepareModule : public ModulePass {
}
DXILPrepareModule() : ModulePass(ID) {}
-
+ void getAnalysisUsage(AnalysisUsage &AU) const override {
+ AU.addPreserved<ShaderFlagsAnalysisWrapper>();
+ AU.addPreserved<DXILResourceWrapper>();
+ }
static char ID; // Pass identification.
};
char DXILPrepareModule::ID = 0;
diff --git a/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp b/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
index bebca0675522f..c853393e4282a 100644
--- a/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
+++ b/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
@@ -79,8 +79,8 @@ class DirectXPassConfig : public TargetPassConfig {
void addCodeGenPrepare() override {
addPass(createDXILIntrinsicExpansionLegacyPass());
addPass(createDXILOpLoweringLegacyPass());
- addPass(createDXILPrepareModulePass());
addPass(createDXILTranslateMetadataPass());
+ addPass(createDXILPrepareModulePass());
}
};
diff --git a/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs-val-ver-0.0.ll b/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs-val-ver-0.0.ll
new file mode 100644
index 0000000000000..a85dc43ac2f6c
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs-val-ver-0.0.ll
@@ -0,0 +1,16 @@
+; RUN: opt -S -dxil-prepare %s | FileCheck %s
+
+target triple = "dxil-pc-shadermodel6.6-compute"
+
+define void @entry() #0 {
+entry:
+ ret void
+}
+
+; Make sure experimental attribute is left when validation version is 0.0.
+; CHECK:attributes #0 = { noinline nounwind "exp-shader"="cs" }
+attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1" "hlsl.shader"="compute" }
+
+!dx.valver = !{!0}
+
+!0 = !{i32 0, i32 0}
diff --git a/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs.ll b/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs.ll
index be4b46f22ef25..343f190d994f0 100644
--- a/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs.ll
+++ b/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs.ll
@@ -1,4 +1,6 @@
; RUN: opt -S -dxil-metadata-emit %s | FileCheck %s
+; RUN: opt -S -dxil-prepare %s | FileCheck %s --check-prefix=REMOVE_EXTRA_ATTRIBUTE
+
target triple = "dxil-pc-shadermodel6.6-compute"
; CHECK: !dx.shaderModel = !{![[SM:[0-9]+]]}
@@ -9,4 +11,7 @@ entry:
ret void
}
-attributes #0 = { noinline nounwind "hlsl.numthreads"="1,2,1" "hlsl.shader"="compute" }
+; Make sure extra attribute like hlsl.numthreads are removed.
+; And experimental attribute is removed when validator version is not 0.0.
+; REMOVE_EXTRA_ATTRIBUTE:attributes #0 = { noinline nounwind }
+attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1" "hlsl.shader"="compute" }
diff --git a/llvm/test/tools/dxil-dis/attribute-filter.ll b/llvm/test/tools/dxil-dis/attribute-filter.ll
index 432a5a1b71018..27590e10d79b5 100644
--- a/llvm/test/tools/dxil-dis/attribute-filter.ll
+++ b/llvm/test/tools/dxil-dis/attribute-filter.ll
@@ -19,8 +19,8 @@ define float @fma2(float %0, float %1, float %2) #1 {
ret float %5
}
-; CHECK: attributes #0 = { nounwind readnone "disable-tail-calls"="false" }
-attributes #0 = { norecurse nounwind readnone willreturn "disable-tail-calls"="false" }
+; CHECK: attributes #0 = { nounwind readnone "fp32-denorm-mode"="any" "waveops-include-helper-lanes" }
+attributes #0 = { norecurse nounwind readnone willreturn "disable-tail-calls"="false" "waveops-include-helper-lanes" "fp32-denorm-mode"="any" }
-; CHECK: attributes #1 = { readnone "disable-tail-calls"="false" }
-attributes #1 = { norecurse memory(none) willreturn "disable-tail-calls"="false" }
+; CHECK: attributes #1 = { readnone "fp32-denorm-mode"="ftz" "waveops-include-helper-lanes" }
+attributes #1 = { norecurse memory(none) willreturn "disable-tail-calls"="false" "waveops-include-helper-lanes" "fp32-denorm-mode"="ftz" }
More information about the llvm-commits
mailing list