[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