https://github.com/danbrown-amd updated https://github.com/llvm/llvm-project/pull/221105
>From fd03dab0bfc9b9c3acbe02f83850bfa70284c08a Mon Sep 17 00:00:00 2001 From: danbrown-amd <[email protected]> Date: Thu, 3 Sep 2026 18:46:23 -0600 Subject: [PATCH 1/4] Use icmp-ne instead of truncation on boolean load Fixes #140824 Assisted-by: Claude Sonnet 4 --- clang/lib/CodeGen/CGExpr.cpp | 5 +++-- clang/lib/Frontend/CompilerInvocation.cpp | 6 ++++++ clang/test/CodeGenHLSL/strict-bool.hlsl | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 019159dd620fda..f5d053e6b67130 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -5681,9 +5681,10 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { Address VecMem = CreateMemTemp(E->getBase()->getType()); // need to zero extend an hlsl boolean vector to store it back to memory QualType Ty = E->getBase()->getType(); - llvm::Type *LTy = convertTypeForLoadStore(Ty, Vec->getType()); - if (LTy->getScalarSizeInBits() > Vec->getType()->getScalarSizeInBits()) + if (getLangOpts().HLSL && Ty->isExtVectorBoolType()) { + llvm::Type *LTy = convertTypeForLoadStore(Ty, Vec->getType()); Vec = Builder.CreateZExt(Vec, LTy); + } Builder.CreateStore(Vec, VecMem); Base = MakeAddrLValue(VecMem, Ty, AlignmentSource::Decl); } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index c9281c2a6d6b41..0a3a235fbac33c 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -657,6 +657,12 @@ 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.setLoadBoolFromMem(CodeGenOptions::BoolFromMem::NonZero); } // When these options are used, the compiler is allowed to apply diff --git a/clang/test/CodeGenHLSL/strict-bool.hlsl b/clang/test/CodeGenHLSL/strict-bool.hlsl index 31867065e77a3b..30bdc02231fa5a 100644 --- a/clang/test/CodeGenHLSL/strict-bool.hlsl +++ b/clang/test/CodeGenHLSL/strict-bool.hlsl @@ -1,6 +1,6 @@ // 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 +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -O1 -emit-llvm -o - %s | FileCheck %s -check-prefixes=CHECK-NONZERO typedef bool bool8_t __attribute__((ext_vector_type(8))); extern bool8_t vec; >From a54e001a8ec8dc38aaaed2eed75b54af43a15fa8 Mon Sep 17 00:00:00 2001 From: danbrown-amd <[email protected]> Date: Thu, 8 Oct 2026 16:30:54 -0600 Subject: [PATCH 2/4] Revert test and one source file as per review comments --- clang/lib/CodeGen/CGExpr.cpp | 5 ++--- clang/test/CodeGenHLSL/strict-bool.hlsl | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index f5d053e6b67130..019159dd620fda 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -5681,10 +5681,9 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { Address VecMem = CreateMemTemp(E->getBase()->getType()); // need to zero extend an hlsl boolean vector to store it back to memory QualType Ty = E->getBase()->getType(); - if (getLangOpts().HLSL && Ty->isExtVectorBoolType()) { - llvm::Type *LTy = convertTypeForLoadStore(Ty, Vec->getType()); + llvm::Type *LTy = convertTypeForLoadStore(Ty, Vec->getType()); + if (LTy->getScalarSizeInBits() > Vec->getType()->getScalarSizeInBits()) Vec = Builder.CreateZExt(Vec, LTy); - } Builder.CreateStore(Vec, VecMem); Base = MakeAddrLValue(VecMem, Ty, AlignmentSource::Decl); } diff --git a/clang/test/CodeGenHLSL/strict-bool.hlsl b/clang/test/CodeGenHLSL/strict-bool.hlsl index 30bdc02231fa5a..31867065e77a3b 100644 --- a/clang/test/CodeGenHLSL/strict-bool.hlsl +++ b/clang/test/CodeGenHLSL/strict-bool.hlsl @@ -1,6 +1,6 @@ // 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 -O1 -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; >From 3591f213ca47a3e79e4f86de7a5d8e561250d358 Mon Sep 17 00:00:00 2001 From: danbrown-amd <[email protected]> Date: Tue, 13 Oct 2026 23:10:48 -0600 Subject: [PATCH 3/4] Address additional review comments --- clang/include/clang/Basic/DiagnosticFrontendKinds.td | 3 +++ clang/lib/Driver/ToolChains/HLSL.cpp | 1 + clang/lib/Frontend/CompilerInvocation.cpp | 4 ++++ clang/test/Driver/HLSL/load-bool-from-mem.hlsl | 3 +++ 4 files changed, 11 insertions(+) create mode 100644 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 66eeb08034bf4b..2281836406e63e 100644 --- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td +++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td @@ -514,6 +514,9 @@ 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/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index b5356f1ec45d33..7b0be0ab1f4020 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -689,4 +689,5 @@ void HLSLToolChain::addClangWarningOptions(ArgStringList &CC1Args) const { CC1Args.push_back("-Wconversion"); CC1Args.push_back("-Wvector-conversion"); CC1Args.push_back("-Wmatrix-conversion"); + CC1Args.push_back("-load-bool-from-mem=nonzero"); } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 0a3a235fbac33c..49246f7b6d4d04 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -663,6 +663,10 @@ static bool FixupInvocation(CompilerInvocation &Invocation, // trunc i32 to i1 into an illegal wide <N x i1> bitcast (issue #140824). if (!Args.hasArg(OPT_load_bool_from_mem)) CodeGenOpts.setLoadBoolFromMem(CodeGenOptions::BoolFromMem::NonZero); + else if (CodeGenOpts.getLoadBoolFromMem() != + CodeGenOptions::BoolFromMem::NonZero) + Diags.Report(diag::warn_hlsl_bool_from_mem) + << Args.getLastArg(OPT_load_bool_from_mem)->getValue(); } // When these options are used, the compiler is allowed to apply diff --git a/clang/test/Driver/HLSL/load-bool-from-mem.hlsl b/clang/test/Driver/HLSL/load-bool-from-mem.hlsl new file mode 100644 index 00000000000000..23ee8cca8b6def --- /dev/null +++ b/clang/test/Driver/HLSL/load-bool-from-mem.hlsl @@ -0,0 +1,3 @@ +// RUN: %clang_dxc -T cs_6_3 -### %s 2>&1 | FileCheck %s + +// CHECK: "-load-bool-from-mem=nonzero" >From 172a354f0fac1c64949f611fdb9489e00213ca5b Mon Sep 17 00:00:00 2001 From: danbrown-amd <[email protected]> Date: Wed, 14 Oct 2026 21:55:05 -0600 Subject: [PATCH 4/4] Address further review comments --- clang/lib/Frontend/CompilerInvocation.cpp | 8 ++-- clang/test/CodeGenHLSL/bool-vector-load.hlsl | 16 +++++++ .../CodeGenHLSL/builtins/BoolSwizzles.hlsl | 45 +++++++------------ clang/test/CodeGenHLSL/strict-bool.hlsl | 15 +++---- 4 files changed, 42 insertions(+), 42 deletions(-) create mode 100644 clang/test/CodeGenHLSL/bool-vector-load.hlsl diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 49246f7b6d4d04..57bad35e51f610 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -661,12 +661,12 @@ static bool FixupInvocation(CompilerInvocation &Invocation, // 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.setLoadBoolFromMem(CodeGenOptions::BoolFromMem::NonZero); - else if (CodeGenOpts.getLoadBoolFromMem() != - CodeGenOptions::BoolFromMem::NonZero) + 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 new file mode 100644 index 00000000000000..d78db854310d83 --- /dev/null +++ b/clang/test/CodeGenHLSL/bool-vector-load.hlsl @@ -0,0 +1,16 @@ +// RUN: %clang_dxc -T cs_6_6 %s | FileCheck %s + +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 88058255e94c3d..191a6ad1d604c5 100644 --- a/clang/test/CodeGenHLSL/builtins/BoolSwizzles.hlsl +++ b/clang/test/CodeGenHLSL/builtins/BoolSwizzles.hlsl @@ -1,12 +1,10 @@ -// 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 +// 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 // 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-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: [[vec2Ret:%.*]] = icmp ne <4 x i32> [[vec4]], zeroinitializer // CHECK-NEXT: ret <4 x i1> [[vec2Ret]] bool4 ToFourBools(bool V) { return V.rrrr; @@ -17,8 +15,7 @@ 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-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: [[Vec2Ret:%.*]] = icmp ne <2 x i32> [[Vec2]], zeroinitializer // CHECK-NEXT: ret <2 x i1> [[Vec2Ret]] bool2 FillTrue() { return true.xx; @@ -32,14 +29,12 @@ 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-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: [[Trunc:%.*]] = icmp ne <2 x i32> [[Vec2]], zeroinitializer // 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-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: [[LV1:%.*]] = icmp ne <2 x i32> [[V3]], zeroinitializer // CHECK-NEXT: ret <2 x i1> [[LV1]] bool2 HowManyBools(bool V) { return V.rr.rr; @@ -53,23 +48,20 @@ 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-NZ-NEXT: [[Z:%.*]] = icmp ne i32 [[Y]], 0 -// CHECK-TR-NEXT: [[Z:%.*]] = trunc i32 [[Y]] to i1 +// CHECK-NEXT: [[Z:%.*]] = icmp ne i32 [[Y]], 0 // 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-NZ-NEXT: [[D:%.*]] = icmp ne i32 [[C]], 0 -// CHECK-TR-NEXT: [[D:%.*]] = trunc i32 [[C]] to i1 +// CHECK-NEXT: [[D:%.*]] = icmp ne i32 [[C]], 0 // 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-NZ-NEXT: [[G:%.*]] = icmp ne i32 [[F]], 0 -// CHECK-TR-NEXT: [[G:%.*]] = trunc i32 [[F]] to i1 +// CHECK-NEXT: [[G:%.*]] = icmp ne i32 [[F]], 0 // CHECK-NEXT: br label %lor.end // CHECK: lor.end: @@ -77,8 +69,7 @@ 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-NZ-NEXT: [[LoadV:%.*]] = icmp ne i32 [[I]], 0 -// CHECK-TR-NEXT: [[LoadV:%.*]] = trunc i32 [[I]] to i1 +// CHECK-NEXT: [[LoadV:%.*]] = icmp ne i32 [[I]], 0 // CHECK-NEXT: ret i1 [[LoadV]] bool AssignBool(bool V) { bool X = V.x; @@ -95,13 +86,11 @@ 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-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: [[LV:%.*]] = icmp ne <2 x i32> [[Z]], zeroinitializer // 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-NZ-NEXT: [[LV1:%.*]] = icmp ne i32 [[B]], 0 -// CHECK-TR-NEXT: [[LV1:%.*]] = trunc i32 [[B]] to i1 +// CHECK-NEXT: [[LV1:%.*]] = icmp ne i32 [[B]], 0 // 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 @@ -118,8 +107,7 @@ 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-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: [[LV:%.*]] = icmp ne <2 x i32> [[Z]], zeroinitializer // 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 @@ -139,14 +127,12 @@ 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-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: [[LV:%.*]] = icmp ne <4 x i32> [[Z]], zeroinitializer // 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-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: [[LV1:%.*]] = icmp ne <2 x i32> [[C]], zeroinitializer // CHECK-NEXT: ret <2 x i1> [[LV1]] bool2 AccessBools() { bool4 X = true.xxxx; @@ -160,8 +146,7 @@ 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-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: [[TruncV:%.*]] = icmp ne <3 x i32> [[L1]], zeroinitializer // 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 31867065e77a3b..c9bacffc04469c 100644 --- a/clang/test/CodeGenHLSL/strict-bool.hlsl +++ b/clang/test/CodeGenHLSL/strict-bool.hlsl @@ -1,15 +1,14 @@ -// 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 +// 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) typedef bool bool8_t __attribute__((ext_vector_type(8))); extern bool8_t vec; bool8_t getvec(void) { - // 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 + // CHECK: [[BOOL:%.+]] = load <8 x i32> + // CHECK: icmp ne <8 x i32> [[BOOL]], zeroinitializer return vec; } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
