[llvm] [DirectX] Set module-level flag `LowPrecisionPresent` in DXIL Shader Flags Analysis (PR #129109)
Deric Cheung via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 28 12:59:50 PST 2025
https://github.com/Icohedron updated https://github.com/llvm/llvm-project/pull/129109
>From 811e855854a3e828a38d6fa02a2a9e16d9770d85 Mon Sep 17 00:00:00 2001
From: Icohedron <cheung.deric at gmail.com>
Date: Thu, 27 Feb 2025 20:07:12 +0000
Subject: [PATCH 1/3] Set module-level flag LowPrecisionPresent
---
llvm/lib/Target/DirectX/DXILShaderFlags.cpp | 16 ++++++++
.../DirectX/ShaderFlags/low-precision.ll | 38 +++++++++++++++++++
2 files changed, 54 insertions(+)
create mode 100644 llvm/test/CodeGen/DirectX/ShaderFlags/low-precision.ll
diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
index e1cf516758663..98b8c0a916456 100644
--- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
+++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
@@ -99,6 +99,22 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
}
}
+ auto IsLowPrecisionType = [](const Type *Ty) {
+ return (Ty->isIntegerTy() && Ty->getScalarSizeInBits() == 16) || Ty->isHalfTy();
+ };
+
+ if (!CSF.LowPrecisionPresent)
+ CSF.LowPrecisionPresent = IsLowPrecisionType(I.getType());
+
+ if (!CSF.LowPrecisionPresent) {
+ for (const Value *Op : I.operands()) {
+ if (IsLowPrecisionType(Op->getType())) {
+ CSF.LowPrecisionPresent = true;
+ break;
+ }
+ }
+ }
+
if (auto *II = dyn_cast<IntrinsicInst>(&I)) {
switch (II->getIntrinsicID()) {
default:
diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/low-precision.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/low-precision.ll
new file mode 100644
index 0000000000000..fd25a165bfe8d
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/low-precision.ll
@@ -0,0 +1,38 @@
+; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+target triple = "dxil-pc-shadermodel6.7-library"
+
+;CHECK: ; Combined Shader Flags for Module
+;CHECK-NEXT: ; Shader Flags Value: 0x00000020
+;CHECK-NEXT: ;
+;CHECK-NEXT: ; Note: shader requires additional functionality:
+;CHECK-NEXT: ; Note: extra DXIL module flags:
+;CHECK-NEXT: ; D3D11_1_SB_GLOBAL_FLAG_ENABLE_MINIMUM_PRECISION
+;CHECK-NEXT: ;
+;CHECK-NEXT: ; Shader Flags for Module Functions
+
+;CHECK-LABEL: ; Function add_i16 : 0x00000020
+define i16 @add_i16(i16 %a, i16 %b) #0 {
+ %sum = add i16 %a, %b
+ ret i16 %sum
+}
+
+;CHECK-LABEL: ; Function add_i32 : 0x00000000
+define i32 @add_i32(i32 %a, i32 %b) #0 {
+ %sum = add i32 %a, %b
+ ret i32 %sum
+}
+
+;CHECK-LABEL: ; Function add_half : 0x00000020
+define half @add_half(half %a, half %b) #0 {
+ %sum = fadd half %a, %b
+ ret half %sum
+}
+
+attributes #0 = { convergent norecurse nounwind "hlsl.export"}
+
+; DXC: - Name: SFI0
+; DXC-NEXT: Size: 8
+; DXC-NOT: Flags:
+; DXC: ...
>From 48e35c50c6dc3f7fed73d50ed21f4c79230c4753 Mon Sep 17 00:00:00 2001
From: Icohedron <cheung.deric at gmail.com>
Date: Thu, 27 Feb 2025 20:11:48 +0000
Subject: [PATCH 2/3] Apply clang-format
---
llvm/lib/Target/DirectX/DXILShaderFlags.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
index 98b8c0a916456..fb8dc8c91c45f 100644
--- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
+++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
@@ -100,7 +100,8 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
}
auto IsLowPrecisionType = [](const Type *Ty) {
- return (Ty->isIntegerTy() && Ty->getScalarSizeInBits() == 16) || Ty->isHalfTy();
+ return (Ty->isIntegerTy() && Ty->getScalarSizeInBits() == 16) ||
+ Ty->isHalfTy();
};
if (!CSF.LowPrecisionPresent)
>From c4a3f2f916d362e7ee22df4a226d41f453c88ea8 Mon Sep 17 00:00:00 2001
From: Icohedron <cheung.deric at gmail.com>
Date: Fri, 28 Feb 2025 20:59:40 +0000
Subject: [PATCH 3/3] Simplify check for low precision type
---
llvm/lib/Target/DirectX/DXILShaderFlags.cpp | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
index fb8dc8c91c45f..31fbd66dfaa2d 100644
--- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
+++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
@@ -99,17 +99,13 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
}
}
- auto IsLowPrecisionType = [](const Type *Ty) {
- return (Ty->isIntegerTy() && Ty->getScalarSizeInBits() == 16) ||
- Ty->isHalfTy();
- };
-
if (!CSF.LowPrecisionPresent)
- CSF.LowPrecisionPresent = IsLowPrecisionType(I.getType());
+ CSF.LowPrecisionPresent =
+ I.getType()->isIntegerTy(16) || I.getType()->isHalfTy();
if (!CSF.LowPrecisionPresent) {
for (const Value *Op : I.operands()) {
- if (IsLowPrecisionType(Op->getType())) {
+ if (Op->getType()->isIntegerTy(16) || Op->getType()->isHalfTy()) {
CSF.LowPrecisionPresent = true;
break;
}
More information about the llvm-commits
mailing list