https://github.com/Icohedron updated https://github.com/llvm/llvm-project/pull/134288
>From c482c96c99ab76458904b3f94b1146ccfee0f55c Mon Sep 17 00:00:00 2001 From: Icohedron <cheung.de...@gmail.com> Date: Wed, 2 Apr 2025 21:16:16 +0000 Subject: [PATCH 1/4] Add test for UseNativeLowPrecision shader flag --- .../ShaderFlags/use-native-low-precision.ll | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 llvm/test/CodeGen/DirectX/ShaderFlags/use-native-low-precision.ll diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/use-native-low-precision.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/use-native-low-precision.ll new file mode 100644 index 0000000000000..95c916b169cdf --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/use-native-low-precision.ll @@ -0,0 +1,45 @@ +; 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: 0x00800020 +;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: ; Native 16bit types enabled +;CHECK-NEXT: ; +;CHECK-NEXT: ; Shader Flags for Module Functions + +;CHECK-LABEL: ; Function add_i16 : 0x00800020 +define i16 @add_i16(i16 %a, i16 %b) #0 { + %sum = add i16 %a, %b + ret i16 %sum +} + +; NOTE: The flag for native low precision is set for every function in the +; module regardless of whether or not the function uses low precision data +; types. This matches the behavior in DXC +;CHECK-LABEL: ; Function add_i32 : 0x00800000 +define i32 @add_i32(i32 %a, i32 %b) #0 { + %sum = add i32 %a, %b + ret i32 %sum +} + +;CHECK-LABEL: ; Function add_half : 0x00800020 +define half @add_half(half %a, half %b) #0 { + %sum = fadd half %a, %b + ret half %sum +} + +attributes #0 = { convergent norecurse nounwind "hlsl.export" } + +!llvm.module.flags = !{!0} +!0 = !{i32 1, !"dx.nativelowprec", i32 1} + +; DXC: - Name: SFI0 +; DXC-NEXT: Size: 8 +; DXC-NOT: Flags: +; DXC: ... >From 1d90753f91b62cd6c5a72f7855ad88a45fe6f16d Mon Sep 17 00:00:00 2001 From: Icohedron <cheung.de...@gmail.com> Date: Thu, 3 Apr 2025 16:24:32 +0000 Subject: [PATCH 2/4] Implement UseNativeLowPrecision shader flag analysis --- clang/lib/CodeGen/CGHLSLRuntime.cpp | 3 +++ clang/test/CodeGenHLSL/enable-16bit-types.hlsl | 9 +++++++++ llvm/lib/Target/DirectX/DXILShaderFlags.cpp | 6 ++++++ 3 files changed, 18 insertions(+) create mode 100644 clang/test/CodeGenHLSL/enable-16bit-types.hlsl diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 3b1810b62a2cd..ca5f180d2a64c 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -282,10 +282,13 @@ void CGHLSLRuntime::addHLSLBufferLayoutType(const RecordType *StructType, void CGHLSLRuntime::finishCodeGen() { auto &TargetOpts = CGM.getTarget().getTargetOpts(); + auto &LangOpts = CGM.getLangOpts(); llvm::Module &M = CGM.getModule(); Triple T(M.getTargetTriple()); if (T.getArch() == Triple::ArchType::dxil) addDxilValVersion(TargetOpts.DxilValidatorVersion, M); + if (LangOpts.NativeHalfType) + M.setModuleFlag(llvm::Module::ModFlagBehavior::Error, "dx.nativelowprec", 1); generateGlobalCtorDtorCalls(); } diff --git a/clang/test/CodeGenHLSL/enable-16bit-types.hlsl b/clang/test/CodeGenHLSL/enable-16bit-types.hlsl new file mode 100644 index 0000000000000..7da66a3ed863b --- /dev/null +++ b/clang/test/CodeGenHLSL/enable-16bit-types.hlsl @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fnative-half-type -finclude-default-header -triple dxil-pc-shadermodel6.3-library -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --check-prefix=FLAG +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --check-prefix=NOFLAG + +// NOTE: -enable-16bit-types is a DXCFlag that aliases -fnative-half-type + +// FLAG-DAG: ![[NLP:.*]] = !{i32 1, !"dx.nativelowprec", i32 1} +// FLAG-DAG: !llvm.module.flags = !{{{.*}}![[NLP]]{{.*}}} + +// NOFLAG-NOT: dx.nativelowprec diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp index babf495220393..437d1402ccedc 100644 --- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp +++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp @@ -188,6 +188,12 @@ void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM, continue; } + // Set UseNativeLowPrecision using dx.nativelowprec module metadata + if (auto *NativeLowPrec = mdconst::extract_or_null<ConstantInt>( + M.getModuleFlag("dx.nativelowprec"))) + if (NativeLowPrec->getValue() != 0) + SCCSF.UseNativeLowPrecision = true; + ComputedShaderFlags CSF; for (const auto &BB : *F) for (const auto &I : BB) >From 33f5896ad1e961aa9df998ec619a5dc425b064ed Mon Sep 17 00:00:00 2001 From: Icohedron <cheung.de...@gmail.com> Date: Thu, 3 Apr 2025 18:54:07 +0000 Subject: [PATCH 3/4] Add check for DXIL Version >= 1.2 --- 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 437d1402ccedc..2ca428672e1c4 100644 --- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp +++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp @@ -191,7 +191,8 @@ void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM, // Set UseNativeLowPrecision using dx.nativelowprec module metadata if (auto *NativeLowPrec = mdconst::extract_or_null<ConstantInt>( M.getModuleFlag("dx.nativelowprec"))) - if (NativeLowPrec->getValue() != 0) + if (MMDI.DXILVersion >= VersionTuple(1, 2) && + NativeLowPrec->getValue() != 0) SCCSF.UseNativeLowPrecision = true; ComputedShaderFlags CSF; >From 5656192c141305821b25053c1845b09547716a33 Mon Sep 17 00:00:00 2001 From: Icohedron <cheung.de...@gmail.com> Date: Thu, 3 Apr 2025 18:55:59 +0000 Subject: [PATCH 4/4] Apply clang-format --- clang/lib/CodeGen/CGHLSLRuntime.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index ca5f180d2a64c..de115d78c2040 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -288,7 +288,8 @@ void CGHLSLRuntime::finishCodeGen() { if (T.getArch() == Triple::ArchType::dxil) addDxilValVersion(TargetOpts.DxilValidatorVersion, M); if (LangOpts.NativeHalfType) - M.setModuleFlag(llvm::Module::ModFlagBehavior::Error, "dx.nativelowprec", 1); + M.setModuleFlag(llvm::Module::ModFlagBehavior::Error, "dx.nativelowprec", + 1); generateGlobalCtorDtorCalls(); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits