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/8] 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/8] 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/8] 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/8] 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();
 }

>From 35a080411e4ce0618665db31de7bf887b8d1abb6 Mon Sep 17 00:00:00 2001
From: Icohedron <cheung.de...@gmail.com>
Date: Tue, 8 Apr 2025 23:02:16 +0000
Subject: [PATCH 5/8] Replace clang_cc1 with clang_dxc in enable-16bit-types
 test

---
 clang/test/CodeGenHLSL/enable-16bit-types.hlsl | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/clang/test/CodeGenHLSL/enable-16bit-types.hlsl 
b/clang/test/CodeGenHLSL/enable-16bit-types.hlsl
index 7da66a3ed863b..c49f7c729abb5 100644
--- a/clang/test/CodeGenHLSL/enable-16bit-types.hlsl
+++ b/clang/test/CodeGenHLSL/enable-16bit-types.hlsl
@@ -1,7 +1,5 @@
-// 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
+// RUN: %clang_dxc -enable-16bit-types -T lib_6_3 -HV 202x %s | FileCheck %s 
--check-prefix=FLAG
+// RUN: %clang_dxc -T lib_6_3 -HV 202x %s | FileCheck %s --check-prefix=NOFLAG
 
 // FLAG-DAG: ![[NLP:.*]] = !{i32 1, !"dx.nativelowprec", i32 1}
 // FLAG-DAG: !llvm.module.flags = !{{{.*}}![[NLP]]{{.*}}}

>From 09864cfeb165514109212438c3e1fdb3860aa12b Mon Sep 17 00:00:00 2001
From: Icohedron <cheung.de...@gmail.com>
Date: Tue, 8 Apr 2025 23:31:10 +0000
Subject: [PATCH 6/8] Remove unnecessary attributes and obj2yml test

---
 .../DirectX/ShaderFlags/low-precision.ll      | 14 +++----------
 .../ShaderFlags/use-native-low-precision.ll   | 20 ++++++-------------
 2 files changed, 9 insertions(+), 25 deletions(-)

diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/low-precision.ll 
b/llvm/test/CodeGen/DirectX/ShaderFlags/low-precision.ll
index fd25a165bfe8d..52e00b107bb82 100644
--- a/llvm/test/CodeGen/DirectX/ShaderFlags/low-precision.ll
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/low-precision.ll
@@ -1,5 +1,4 @@
 ; 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"
 
@@ -13,26 +12,19 @@ target triple = "dxil-pc-shadermodel6.7-library"
 ;CHECK-NEXT: ; Shader Flags for Module Functions
 
 ;CHECK-LABEL: ; Function add_i16 : 0x00000020
-define i16 @add_i16(i16 %a, i16 %b) #0 {
+define i16 @add_i16(i16 %a, i16 %b) {
   %sum = add i16 %a, %b
   ret i16 %sum
 }
 
 ;CHECK-LABEL: ; Function add_i32 : 0x00000000
-define i32 @add_i32(i32 %a, i32 %b) #0 {
+define i32 @add_i32(i32 %a, i32 %b) {
   %sum = add i32 %a, %b
   ret i32 %sum
 }
 
 ;CHECK-LABEL: ; Function add_half : 0x00000020
-define half @add_half(half %a, half %b) #0 {
+define half @add_half(half %a, half %b) {
   %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: ...
diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/use-native-low-precision.ll 
b/llvm/test/CodeGen/DirectX/ShaderFlags/use-native-low-precision.ll
index 95c916b169cdf..98e9a5fa7b241 100644
--- a/llvm/test/CodeGen/DirectX/ShaderFlags/use-native-low-precision.ll
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/use-native-low-precision.ll
@@ -1,5 +1,4 @@
 ; 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"
 
@@ -14,32 +13,25 @@ target triple = "dxil-pc-shadermodel6.7-library"
 ;CHECK-NEXT: ; Shader Flags for Module Functions
 
 ;CHECK-LABEL: ; Function add_i16 : 0x00800020
-define i16 @add_i16(i16 %a, i16 %b) #0 {
+define i16 @add_i16(i16 %a, i16 %b) {
   %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
+; NOTE: The flag for native low precision (0x80000) is set for every function
+; in the module regardless of whether or not the function uses low precision
+; data types (flag 0x20). This matches the behavior in DXC
 ;CHECK-LABEL: ; Function add_i32 : 0x00800000
-define i32 @add_i32(i32 %a, i32 %b) #0 {
+define i32 @add_i32(i32 %a, i32 %b) {
   %sum = add i32 %a, %b
   ret i32 %sum
 }
 
 ;CHECK-LABEL: ; Function add_half : 0x00800020
-define half @add_half(half %a, half %b) #0 {
+define half @add_half(half %a, half %b) {
   %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 0e8b7fa1539cbdf9aac0f050bc89895a080ae1c3 Mon Sep 17 00:00:00 2001
From: Icohedron <cheung.de...@gmail.com>
Date: Tue, 8 Apr 2025 23:42:45 +0000
Subject: [PATCH 7/8] Add a comment describing the purpose of the
 NativeHalfType conditional

---
 clang/lib/CodeGen/CGHLSLRuntime.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp 
b/clang/lib/CodeGen/CGHLSLRuntime.cpp
index de115d78c2040..77700ea3a676d 100644
--- a/clang/lib/CodeGen/CGHLSLRuntime.cpp
+++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp
@@ -287,6 +287,10 @@ void CGHLSLRuntime::finishCodeGen() {
   Triple T(M.getTargetTriple());
   if (T.getArch() == Triple::ArchType::dxil)
     addDxilValVersion(TargetOpts.DxilValidatorVersion, M);
+
+  // NativeHalfType corresponds to the -fnative-half-type clang option which is
+  // aliased by clang-dxc's -enable-16bit-types option. This option is used to
+  // set the UseNativeLowPrecision DXIL module flag in the DirectX backend
   if (LangOpts.NativeHalfType)
     M.setModuleFlag(llvm::Module::ModFlagBehavior::Error, "dx.nativelowprec",
                     1);

>From 71687e49861ccab5deb8350ebc8f6f327ed11db2 Mon Sep 17 00:00:00 2001
From: Icohedron <cheung.de...@gmail.com>
Date: Wed, 9 Apr 2025 21:44:05 +0000
Subject: [PATCH 8/8] Add '-Xclang -emit-llvm' to avoid running the DirectX
 backend

---
 clang/test/CodeGenHLSL/enable-16bit-types.hlsl | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/test/CodeGenHLSL/enable-16bit-types.hlsl 
b/clang/test/CodeGenHLSL/enable-16bit-types.hlsl
index c49f7c729abb5..9b5c742f9dacd 100644
--- a/clang/test/CodeGenHLSL/enable-16bit-types.hlsl
+++ b/clang/test/CodeGenHLSL/enable-16bit-types.hlsl
@@ -1,5 +1,5 @@
-// RUN: %clang_dxc -enable-16bit-types -T lib_6_3 -HV 202x %s | FileCheck %s 
--check-prefix=FLAG
-// RUN: %clang_dxc -T lib_6_3 -HV 202x %s | FileCheck %s --check-prefix=NOFLAG
+// RUN: %clang_dxc -enable-16bit-types -T lib_6_3 -HV 202x -Vd -Xclang 
-emit-llvm %s | FileCheck %s --check-prefix=FLAG
+// RUN: %clang_dxc -T lib_6_3 -HV 202x -Vd -Xclang -emit-llvm %s | FileCheck 
%s --check-prefix=NOFLAG
 
 // FLAG-DAG: ![[NLP:.*]] = !{i32 1, !"dx.nativelowprec", i32 1}
 // FLAG-DAG: !llvm.module.flags = !{{{.*}}![[NLP]]{{.*}}}

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to