[llvm-branch-commits] [clang] c59e95e - Revert "[HLSL] Use icmp ne instead of trunc on boolean load (#221105)"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Oct 19 10:55:59 PDT 2026
Author: Paul Kirth
Date: 2026-10-19T10:55:55-07:00
New Revision: c59e95e0eaa0c9f03f545171fede8467e63da3f6
URL: https://github.com/llvm/llvm-project/commit/c59e95e0eaa0c9f03f545171fede8467e63da3f6
DIFF: https://github.com/llvm/llvm-project/commit/c59e95e0eaa0c9f03f545171fede8467e63da3f6.diff
LOG: Revert "[HLSL] Use icmp ne instead of trunc on boolean load (#221105)"
This reverts commit f9897a670796e4e4bfc9d987d3480ead10351814.
Added:
Modified:
clang/include/clang/Basic/DiagnosticFrontendKinds.td
clang/lib/Driver/ToolChains/Clang.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/test/CodeGenHLSL/builtins/BoolSwizzles.hlsl
clang/test/CodeGenHLSL/strict-bool.hlsl
Removed:
clang/test/CodeGenHLSL/bool-vector-load.hlsl
clang/test/Driver/HLSL/load-bool-from-mem.hlsl
################################################################################
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index b51aa3ff0a0cb..3df87215a0476 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -512,9 +512,6 @@ def warn_hlsl_signature_packing_ignored : Warning<
def warn_hlsl_failed_to_embed_source
: Warning<"failed to embed source for '%0' into dx.source.contents">,
InGroup<HLSLDXCCompat>;
-def warn_hlsl_bool_from_mem
- : Warning<"-load-bool-from-mem=%0 ignored for HLSL (always nonzero)">,
- InGroup<OptionIgnored>, DefaultWarn;
def err_data_layout_mismatch : Error<"backend data layout '%0' does not match "
"expected target description '%1'">;
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index bd546dbb1fed2..608d7bb68a4e6 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -4052,7 +4052,6 @@ static void RenderHLSLOptions(const Driver &D, const ArgList &Args,
CmdArgs.push_back("-mllvm");
CmdArgs.push_back("--dx-pdb-in-private");
}
- CmdArgs.push_back("-load-bool-from-mem=nonzero");
}
static void RenderOpenACCOptions(const Driver &D, const ArgList &Args,
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index c11ebf5a1a189..225962359129b 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -657,16 +657,6 @@ static bool FixupInvocation(CompilerInvocation &Invocation,
Warnings.insert(Warnings.begin(), "vector-conversion");
if (!llvm::is_contained(Warnings, "matrix-conversion"))
Warnings.insert(Warnings.begin(), "matrix-conversion");
-
- // HLSL booleans in memory are i32; any non-zero value is true.
- // Use icmp-ne rather than truncation to avoid InstCombine rewriting
- // trunc i32 to i1 into an illegal wide <N x i1> bitcast (issue #140824).
- if (Args.hasArg(OPT_load_bool_from_mem) &&
- CodeGenOpts.getLoadBoolFromMem() !=
- CodeGenOptions::BoolFromMem::NonZero)
- Diags.Report(diag::warn_hlsl_bool_from_mem)
- << Args.getLastArg(OPT_load_bool_from_mem)->getValue();
- CodeGenOpts.setLoadBoolFromMem(CodeGenOptions::BoolFromMem::NonZero);
}
// When these options are used, the compiler is allowed to apply
diff --git a/clang/test/CodeGenHLSL/bool-vector-load.hlsl b/clang/test/CodeGenHLSL/bool-vector-load.hlsl
deleted file mode 100644
index 33483db63fc19..0000000000000
--- a/clang/test/CodeGenHLSL/bool-vector-load.hlsl
+++ /dev/null
@@ -1,19 +0,0 @@
-// RUN: %clang_dxc -T cs_6_6 %s | FileCheck %s
-// RUN: %clang_dxc -T cs_6_6 -Xclang -load-bool-from-mem=truncate %s 2>&1 | FileCheck %s --check-prefix=CHECK,TRUNCATE
-
-// TRUNCATE: -load-bool-from-mem=truncate ignored for HLSL (always nonzero)
-
-StructuredBuffer<bool4> In : register(t0);
-RWStructuredBuffer<bool4> Out : register(u1);
-
-// CHECK-LABEL: define {{.*}}main
-// CHECK: [[Load:%.*]] = call {{[^ ]*}} @dx.op.rawBufferLoad.i32(i32 139, %dx.types.Handle %{{[^,]*}}, i32 0, i32 12, i8 1, i32 4)
-// CHECK: [[Elem:%.*]] = extractvalue {{.*}} [[Load]], 0
-// CHECK-NEXT: [[Bool:%.*]] = icmp ne i32 [[Elem]], 0
-// CHECK: [[Wide:%.*]] = zext i1 [[Bool]] to i32
-// CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %{{[^,]*}},{{[^,]*}},{{[^,]*}}, i32 [[Wide]]
-[numthreads(1,1,1)]
-void main(void) {
- Out[1].w = In[0].w;
-}
-
diff --git a/clang/test/CodeGenHLSL/builtins/BoolSwizzles.hlsl b/clang/test/CodeGenHLSL/builtins/BoolSwizzles.hlsl
index 191a6ad1d604c..88058255e94c3 100644
--- a/clang/test/CodeGenHLSL/builtins/BoolSwizzles.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/BoolSwizzles.hlsl
@@ -1,10 +1,12 @@
-// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -load-bool-from-mem=nonzero -triple dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
+// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -load-bool-from-mem=truncate -triple dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes -o - | FileCheck -check-prefixes=CHECK,CHECK-TR %s
+// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -load-bool-from-mem=nonzero -triple dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes -o - | FileCheck -check-prefixes=CHECK,CHECK-NZ %s
// CHECK-LABEL: ToFourBools
// CHECK: {{%.*}} = zext i1 {{.*}} to i32
// CHECK: [[splat:%.*]] = insertelement <1 x i32> poison, i32 {{.*}}, i64 0
// CHECK-NEXT: [[vec4:%.*]] = shufflevector <1 x i32> [[splat]], <1 x i32> poison, <4 x i32> zeroinitializer
-// CHECK-NEXT: [[vec2Ret:%.*]] = icmp ne <4 x i32> [[vec4]], zeroinitializer
+// CHECK-NZ-NEXT: [[vec2Ret:%.*]] = icmp ne <4 x i32> [[vec4]], zeroinitializer
+// CHECK-TR-NEXT: [[vec2Ret:%.*]] = trunc <4 x i32> [[vec4]] to <4 x i1>
// CHECK-NEXT: ret <4 x i1> [[vec2Ret]]
bool4 ToFourBools(bool V) {
return V.rrrr;
@@ -15,7 +17,8 @@ bool4 ToFourBools(bool V) {
// CHECK-NEXT: store <1 x i32> splat (i32 1), ptr [[Tmp]], align 4
// CHECK-NEXT: [[Vec1:%.*]] = load <1 x i32>, ptr [[Tmp]], align 4
// CHECK-NEXT: [[Vec2:%.*]] = shufflevector <1 x i32> [[Vec1]], <1 x i32> poison, <2 x i32> zeroinitializer
-// CHECK-NEXT: [[Vec2Ret:%.*]] = icmp ne <2 x i32> [[Vec2]], zeroinitializer
+// CHECK-NZ-NEXT: [[Vec2Ret:%.*]] = icmp ne <2 x i32> [[Vec2]], zeroinitializer
+// CHECK-TR-NEXT: [[Vec2Ret:%.*]] = trunc <2 x i32> [[Vec2]] to <2 x i1>
// CHECK-NEXT: ret <2 x i1> [[Vec2Ret]]
bool2 FillTrue() {
return true.xx;
@@ -29,12 +32,14 @@ bool2 FillTrue() {
// CHECK-NEXT: [[VVal:%.*]] = load i32, ptr [[VAddr]], align 4
// CHECK-NEXT: [[Splat:%.*]] = insertelement <1 x i32> poison, i32 [[VVal]], i64 0
// CHECK-NEXT: [[Vec2:%.*]] = shufflevector <1 x i32> [[Splat]], <1 x i32> poison, <2 x i32> zeroinitializer
-// CHECK-NEXT: [[Trunc:%.*]] = icmp ne <2 x i32> [[Vec2]], zeroinitializer
+// CHECK-NZ-NEXT: [[Trunc:%.*]] = icmp ne <2 x i32> [[Vec2]], zeroinitializer
+// CHECK-TR-NEXT: [[Trunc:%.*]] = trunc <2 x i32> [[Vec2]] to <2 x i1>
// CHECK-NEXT: [[Ext:%.*]] = zext <2 x i1> [[Trunc]] to <2 x i32>
// CHECK-NEXT: store <2 x i32> [[Ext]], ptr [[Vec2Ptr]], align 4
// CHECK-NEXT: [[V2:%.*]] = load <2 x i32>, ptr [[Vec2Ptr]], align 4
// CHECK-NEXT: [[V3:%.*]] = shufflevector <2 x i32> [[V2]], <2 x i32> poison, <2 x i32> zeroinitializer
-// CHECK-NEXT: [[LV1:%.*]] = icmp ne <2 x i32> [[V3]], zeroinitializer
+// CHECK-NZ-NEXT: [[LV1:%.*]] = icmp ne <2 x i32> [[V3]], zeroinitializer
+// CHECK-TR-NEXT: [[LV1:%.*]] = trunc <2 x i32> [[V3]] to <2 x i1>
// CHECK-NEXT: ret <2 x i1> [[LV1]]
bool2 HowManyBools(bool V) {
return V.rr.rr;
@@ -48,20 +53,23 @@ bool2 HowManyBools(bool V) {
// CHECK-NEXT: [[X:%.*]] = load i32, ptr [[VAddr]], align 4
// CHECK-NEXT: [[Splat:%.*]] = insertelement <1 x i32> poison, i32 [[X]], i64 0
// CHECK-NEXT: [[Y:%.*]] = extractelement <1 x i32> [[Splat]], i32 0
-// CHECK-NEXT: [[Z:%.*]] = icmp ne i32 [[Y]], 0
+// CHECK-NZ-NEXT: [[Z:%.*]] = icmp ne i32 [[Y]], 0
+// CHECK-TR-NEXT: [[Z:%.*]] = trunc i32 [[Y]] to i1
// CHECK-NEXT: [[A:%.*]] = zext i1 [[Z]] to i32
// CHECK-NEXT: store i32 [[A]], ptr [[XAddr]], align 4
// CHECK-NEXT: [[B:%.*]] = load i32, ptr [[VAddr]], align 4
// CHECK-NEXT: [[Splat2:%.*]] = insertelement <1 x i32> poison, i32 [[B]], i64 0
// CHECK-NEXT: [[C:%.*]] = extractelement <1 x i32> [[Splat2]], i32 0
-// CHECK-NEXT: [[D:%.*]] = icmp ne i32 [[C]], 0
+// CHECK-NZ-NEXT: [[D:%.*]] = icmp ne i32 [[C]], 0
+// CHECK-TR-NEXT: [[D:%.*]] = trunc i32 [[C]] to i1
// CHECK-NEXT: br i1 [[D]], label %lor.end, label %lor.rhs
// CHECK: lor.rhs:
// CHECK-NEXT: [[E:%.*]] = load i32, ptr [[VAddr]], align 4
// CHECK-NEXT: [[Splat3:%.*]] = insertelement <1 x i32> poison, i32 [[E]], i64 0
// CHECK-NEXT: [[F:%.*]] = extractelement <1 x i32> [[Splat3]], i32 0
-// CHECK-NEXT: [[G:%.*]] = icmp ne i32 [[F]], 0
+// CHECK-NZ-NEXT: [[G:%.*]] = icmp ne i32 [[F]], 0
+// CHECK-TR-NEXT: [[G:%.*]] = trunc i32 [[F]] to i1
// CHECK-NEXT: br label %lor.end
// CHECK: lor.end:
@@ -69,7 +77,8 @@ bool2 HowManyBools(bool V) {
// CHECK-NEXT: [[J:%.*]] = zext i1 [[H]] to i32
// CHECK-NEXT: store i32 [[J]], ptr [[XAddr]], align 4
// CHECK-NEXT: [[I:%.*]] = load i32, ptr [[XAddr]], align 4
-// CHECK-NEXT: [[LoadV:%.*]] = icmp ne i32 [[I]], 0
+// CHECK-NZ-NEXT: [[LoadV:%.*]] = icmp ne i32 [[I]], 0
+// CHECK-TR-NEXT: [[LoadV:%.*]] = trunc i32 [[I]] to i1
// CHECK-NEXT: ret i1 [[LoadV]]
bool AssignBool(bool V) {
bool X = V.x;
@@ -86,11 +95,13 @@ bool AssignBool(bool V) {
// CHECK-NEXT: store <1 x i32> splat (i32 1), ptr [[Tmp]], align 4
// CHECK-NEXT: [[Y:%.*]] = load <1 x i32>, ptr [[Tmp]], align 4
// CHECK-NEXT: [[Z:%.*]] = shufflevector <1 x i32> [[Y]], <1 x i32> poison, <2 x i32> zeroinitializer
-// CHECK-NEXT: [[LV:%.*]] = icmp ne <2 x i32> [[Z]], zeroinitializer
+// CHECK-NZ-NEXT: [[LV:%.*]] = icmp ne <2 x i32> [[Z]], zeroinitializer
+// CHECK-TR-NEXT: [[LV:%.*]] = trunc <2 x i32> [[Z]] to <2 x i1>
// CHECK-NEXT: [[A:%.*]] = zext <2 x i1> [[LV]] to <2 x i32>
// CHECK-NEXT: store <2 x i32> [[A]], ptr [[X]], align 4
// CHECK-NEXT: [[B:%.*]] = load i32, ptr [[VAddr]], align 4
-// CHECK-NEXT: [[LV1:%.*]] = icmp ne i32 [[B]], 0
+// CHECK-NZ-NEXT: [[LV1:%.*]] = icmp ne i32 [[B]], 0
+// CHECK-TR-NEXT: [[LV1:%.*]] = trunc i32 [[B]] to i1
// CHECK-NEXT: [[D:%.*]] = zext i1 [[LV1]] to i32
// CHECK-NEXT: [[C:%.*]] = getelementptr <2 x i32>, ptr [[X]], i32 0, i32 1
// CHECK-NEXT: store i32 [[D]], ptr [[C]], align 4
@@ -107,7 +118,8 @@ void AssignBool2(bool V) {
// CHECK-NEXT: store <2 x i32> [[Y]], ptr [[VAddr]], align 4
// CHECK-NEXT: store <2 x i32> splat (i32 1), ptr [[X]], align 4
// CHECK-NEXT: [[Z:%.*]] = load <2 x i32>, ptr [[VAddr]], align 4
-// CHECK-NEXT: [[LV:%.*]] = icmp ne <2 x i32> [[Z]], zeroinitializer
+// CHECK-NZ-NEXT: [[LV:%.*]] = icmp ne <2 x i32> [[Z]], zeroinitializer
+// CHECK-TR-NEXT: [[LV:%.*]] = trunc <2 x i32> [[Z]] to <2 x i1>
// CHECK-NEXT: [[B:%.*]] = zext <2 x i1> [[LV]] to <2 x i32>
// CHECK-NEXT: [[V1:%.*]] = extractelement <2 x i32> [[B]], i32 0
// CHECK-NEXT: store i32 [[V1]], ptr [[X]], align 4
@@ -127,12 +139,14 @@ void AssignBool3(bool2 V) {
// CHECK-NEXT: store <1 x i32> splat (i32 1), ptr [[Tmp]], align 4
// CHECK-NEXT: [[Y:%.*]] = load <1 x i32>, ptr [[Tmp]], align 4
// CHECK-NEXT: [[Z:%.*]] = shufflevector <1 x i32> [[Y]], <1 x i32> poison, <4 x i32> zeroinitializer
-// CHECK-NEXT: [[LV:%.*]] = icmp ne <4 x i32> [[Z]], zeroinitializer
+// CHECK-NZ-NEXT: [[LV:%.*]] = icmp ne <4 x i32> [[Z]], zeroinitializer
+// CHECK-TR-NEXT: [[LV:%.*]] = trunc <4 x i32> [[Vec2]] to <4 x i1>
// CHECK-NEXT: [[A:%.*]] = zext <4 x i1> [[LV]] to <4 x i32>
// CHECK-NEXT: store <4 x i32> [[A]], ptr [[X]], align 4
// CHECK-NEXT: [[B:%.*]] = load <4 x i32>, ptr [[X]], align 4
// CHECK-NEXT: [[C:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> poison, <2 x i32> <i32 2, i32 3>
-// CHECK-NEXT: [[LV1:%.*]] = icmp ne <2 x i32> [[C]], zeroinitializer
+// CHECK-NZ-NEXT: [[LV1:%.*]] = icmp ne <2 x i32> [[C]], zeroinitializer
+// CHECK-TR-NEXT: [[LV1:%.*]] = trunc <2 x i32> [[C]] to <2 x i1>
// CHECK-NEXT: ret <2 x i1> [[LV1]]
bool2 AccessBools() {
bool4 X = true.xxxx;
@@ -146,7 +160,8 @@ bool2 AccessBools() {
// CHECK-NEXT: store <1 x i32> zeroinitializer, ptr [[Tmp]], align 4
// CHECK-NEXT: [[L0:%.*]] = load <1 x i32>, ptr [[Tmp]], align 4
// CHECK-NEXT: [[L1:%.*]] = shufflevector <1 x i32> [[L0]], <1 x i32> poison, <3 x i32> zeroinitializer
-// CHECK-NEXT: [[TruncV:%.*]] = icmp ne <3 x i32> [[L1]], zeroinitializer
+// CHECK-NZ-NEXT: [[TruncV:%.*]] = icmp ne <3 x i32> [[L1]], zeroinitializer
+// CHECK-TR-NEXT: [[TruncV:%.*]] = trunc <3 x i32> [[Vec2]] to <3 x i1>
// CHECK-NEXT: [[L2:%.*]] = zext <3 x i1> [[TruncV]] to <3 x i32>
// CHECK-NEXT: [[V1:%.*]] = extractelement <3 x i32> [[L2]], i32 0
// CHECK-NEXT: store i32 [[V1]], ptr %B, align 4
diff --git a/clang/test/CodeGenHLSL/strict-bool.hlsl b/clang/test/CodeGenHLSL/strict-bool.hlsl
index c9bacffc04469..31867065e77a3 100644
--- a/clang/test/CodeGenHLSL/strict-bool.hlsl
+++ b/clang/test/CodeGenHLSL/strict-bool.hlsl
@@ -1,14 +1,15 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -O1 -load-bool-from-mem=truncate -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefix=CHECK,TRUNCATE
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -O1 -load-bool-from-mem=nonzero -emit-llvm -o - %s | FileCheck %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -O0 -emit-llvm -o - %s | FileCheck %s
-
-// TRUNCATE: -load-bool-from-mem=truncate ignored for HLSL (always nonzero)
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -O1 -load-bool-from-mem=truncate -emit-llvm -o - %s | FileCheck %s -check-prefixes=CHECK-TRUNCATE
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -O1 -load-bool-from-mem=nonzero -emit-llvm -o - %s | FileCheck %s -check-prefixes=CHECK-NONZERO
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -O0 -emit-llvm -o - %s | FileCheck %s -check-prefixes=CHECK-NONZERO
typedef bool bool8_t __attribute__((ext_vector_type(8)));
extern bool8_t vec;
bool8_t getvec(void) {
- // CHECK: [[BOOL:%.+]] = load <8 x i32>
- // CHECK: icmp ne <8 x i32> [[BOOL]], zeroinitializer
+ // CHECK-TRUNCATE: [[BOOL:%.+]] = load <8 x i32>
+ // CHECK-TRUNCATE: trunc <8 x i32> [[BOOL]] to <8 x i1>
+
+ // CHECK-NONZERO: [[BOOL:%.+]] = load <8 x i32>
+ // CHECK-NONZERO: icmp ne <8 x i32> [[BOOL]], zeroinitializer
return vec;
}
diff --git a/clang/test/Driver/HLSL/load-bool-from-mem.hlsl b/clang/test/Driver/HLSL/load-bool-from-mem.hlsl
deleted file mode 100644
index 23ee8cca8b6de..0000000000000
--- a/clang/test/Driver/HLSL/load-bool-from-mem.hlsl
+++ /dev/null
@@ -1,3 +0,0 @@
-// RUN: %clang_dxc -T cs_6_3 -### %s 2>&1 | FileCheck %s
-
-// CHECK: "-load-bool-from-mem=nonzero"
More information about the llvm-branch-commits
mailing list