From 811e855854a3e828a38d6fa02a2a9e16d9770d85 Mon Sep 17 00:00:00 2001 From: Icohedron 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(&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 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 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; }