llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-directx @llvm/pr-subscribers-clang-codegen Author: Deric C. (Icohedron) <details> <summary>Changes</summary> Fixes #<!-- -->112267 --- Full diff: https://github.com/llvm/llvm-project/pull/134288.diff 4 Files Affected: - (modified) clang/lib/CodeGen/CGHLSLRuntime.cpp (+3) - (added) clang/test/CodeGenHLSL/enable-16bit-types.hlsl (+9) - (modified) llvm/lib/Target/DirectX/DXILShaderFlags.cpp (+6) - (added) llvm/test/CodeGen/DirectX/ShaderFlags/use-native-low-precision.ll (+45) ``````````diff 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) 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: ... `````````` </details> https://github.com/llvm/llvm-project/pull/134288 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits