[clang] [CodeGen] Change -O0 bool load codegen to have nonzero model (PR #193783)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 23 08:53:18 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: apple-fcloutier
<details>
<summary>Changes</summary>
The main follow-up item to https://github.com/llvm/llvm-project/pull/160790 was changing -O0 codegen to convert in-memory i8 bool values to i1 with the `nonzero` rule (`icmp ne i8 %val, 0`) rather than the `truncate` rule (`trunc i8 %val to i1`). This is achieved with a single-line change:
```
bool isConvertingBoolWithCmp0() const {
switch (getLoadBoolFromMem()) {
case BoolFromMem::Strict:
+ return !isOptimizedBuild();
case BoolFromMem::Truncate:
```
However, it impacts a _very large_ number of tests, so we agreed to move it out of the -fstrict-bool PR to reduce the chances we would have to back out the whole thing for this secondary item.
This PR does the change and modifies the tests accordingly. I expect that it will go stale rather quickly. If this needs more discussion, I'll only update it once we reach consensus.
---
Patch is 370.01 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/193783.diff
78 Files Affected:
- (modified) clang/include/clang/Basic/CodeGenOptions.h (+2)
- (modified) clang/test/C/drs/dr335.c (-1)
- (modified) clang/test/CodeGen/AArch64/sve-intrinsics/acle_sve_dupq.c (+60-60)
- (modified) clang/test/CodeGen/atomic-test-and-set.c (+11-11)
- (modified) clang/test/CodeGen/atomic.c (+1-1)
- (modified) clang/test/CodeGen/atomic_ops.c (+2-2)
- (modified) clang/test/CodeGen/builtins-bitint.c (+3-3)
- (modified) clang/test/CodeGen/builtins.c (+3-3)
- (modified) clang/test/CodeGen/c11atomics-ios.c (+1-1)
- (modified) clang/test/CodeGen/defer-ts.c (+1-1)
- (modified) clang/test/CodeGen/scoped-atomic-ops.c (+72-72)
- (modified) clang/test/CodeGen/strict-bool.c (+2-2)
- (modified) clang/test/CodeGen/ubsan-conditional.c (+1-1)
- (modified) clang/test/CodeGenCXX/blocks.cpp (+1-1)
- (modified) clang/test/CodeGenCXX/builtin-atomic-compare_exchange.cpp (+3-3)
- (modified) clang/test/CodeGenCXX/cast-to-ref-bool.cpp (+1-1)
- (modified) clang/test/CodeGenCXX/exceptions.cpp (+2-2)
- (modified) clang/test/CodeGenCXX/ignored-bitfield-conditional.cpp (+4-4)
- (modified) clang/test/CodeGenCXX/lambda-expressions.cpp (+1-1)
- (modified) clang/test/CodeGenCXX/nrvo.cpp (+39-39)
- (modified) clang/test/CodeGenHLSL/BasicFeatures/MatrixSingleSubscriptGetter.hlsl (+3-3)
- (modified) clang/test/CodeGenHLSL/BasicFeatures/MatrixSingleSubscriptSetter.hlsl (+2-2)
- (modified) clang/test/CodeGenHLSL/BasicFeatures/MatrixSplat.hlsl (+3-3)
- (modified) clang/test/CodeGenHLSL/BasicFeatures/MatrixToAndFromVectorConstructors.hlsl (+3-3)
- (modified) clang/test/CodeGenHLSL/BasicFeatures/VectorElementwiseCast.hlsl (+4-4)
- (modified) clang/test/CodeGenHLSL/Bool.hlsl (+1-1)
- (modified) clang/test/CodeGenHLSL/BoolMatrix.hlsl (+3-3)
- (modified) clang/test/CodeGenHLSL/BoolVector.hlsl (+6-6)
- (modified) clang/test/CodeGenHLSL/builtins/ScalarSwizzles.hlsl (+12-12)
- (modified) clang/test/CodeGenHLSL/builtins/VectorElementStore.hlsl (+1-1)
- (modified) clang/test/CodeGenHLSL/builtins/WavePrefixCountBits.hlsl (+1-1)
- (modified) clang/test/CodeGenHLSL/builtins/dot2add.hlsl (+2-2)
- (modified) clang/test/CodeGenHLSL/strict-bool.hlsl (+1)
- (modified) clang/test/CodeGenHLSL/vk-features/vk.spec-constant.hlsl (+1-1)
- (modified) clang/test/CodeGenObjC/property-atomic-bool.m (+6-6)
- (modified) clang/test/CodeGenObjC/strict-bool.m (+3-1)
- (modified) clang/test/CodeGenObjC/strong-in-c-struct.m (+1-1)
- (modified) clang/test/CodeGenOpenCL/bool_cast.cl (+2-2)
- (modified) clang/test/DebugInfo/KeyInstructions/atomic.c (+8-12)
- (modified) clang/test/Frontend/fixed_point_add.c (+1-1)
- (modified) clang/test/Frontend/fixed_point_comparisons.c (+1-1)
- (modified) clang/test/Frontend/fixed_point_div.c (+1-1)
- (modified) clang/test/Frontend/fixed_point_mul.c (+1-1)
- (modified) clang/test/Frontend/fixed_point_sub.c (+1-1)
- (modified) clang/test/Headers/gpuintrin.c (+4-4)
- (modified) clang/test/Headers/openmp-device-functions-bool.c (+1-1)
- (modified) clang/test/OpenMP/atomic_capture_codegen.cpp (+4-4)
- (modified) clang/test/OpenMP/atomic_update_codegen.cpp (+4-4)
- (modified) clang/test/OpenMP/distribute_parallel_for_simd_if_codegen.cpp (+16-16)
- (modified) clang/test/OpenMP/for_codegen.cpp (+2-2)
- (modified) clang/test/OpenMP/loop_collapse_codegen.cpp (+6-6)
- (modified) clang/test/OpenMP/master_taskloop_simd_codegen.cpp (+1-1)
- (modified) clang/test/OpenMP/nvptx_SPMD_codegen.cpp (+30-30)
- (modified) clang/test/OpenMP/nvptx_target_teams_generic_loop_codegen.cpp (+3-3)
- (modified) clang/test/OpenMP/nvptx_target_teams_generic_loop_generic_mode_codegen.cpp (+2-2)
- (modified) clang/test/OpenMP/parallel_for_simd_codegen.cpp (+1-1)
- (modified) clang/test/OpenMP/parallel_master_taskloop_codegen.cpp (+5-5)
- (modified) clang/test/OpenMP/parallel_master_taskloop_simd_codegen.cpp (+19-19)
- (modified) clang/test/OpenMP/target_data_if_logical_codegen.cpp (+2-2)
- (modified) clang/test/OpenMP/target_enter_data_depend_codegen.cpp (+1-1)
- (modified) clang/test/OpenMP/target_exit_data_depend_codegen.cpp (+1-1)
- (modified) clang/test/OpenMP/target_offload_mandatory_codegen.cpp (+1-1)
- (modified) clang/test/OpenMP/target_parallel_debug_codegen.cpp (+2-2)
- (modified) clang/test/OpenMP/target_parallel_for_debug_codegen.cpp (+4-4)
- (modified) clang/test/OpenMP/target_parallel_for_simd_codegen.cpp (+22-22)
- (modified) clang/test/OpenMP/target_parallel_generic_loop_codegen-3.cpp (+4-4)
- (modified) clang/test/OpenMP/target_parallel_if_codegen.cpp (+32-32)
- (modified) clang/test/OpenMP/target_simd_codegen.cpp (+3-3)
- (modified) clang/test/OpenMP/target_teams_distribute_parallel_for_if_codegen.cpp (+9-9)
- (modified) clang/test/OpenMP/target_teams_distribute_parallel_for_simd_if_codegen.cpp (+50-50)
- (modified) clang/test/OpenMP/target_teams_distribute_reduction_codegen.cpp (+90-90)
- (modified) clang/test/OpenMP/target_teams_distribute_simd_codegen.cpp (+16-16)
- (modified) clang/test/OpenMP/target_teams_generic_loop_if_codegen.cpp (+7-7)
- (modified) clang/test/OpenMP/target_update_depend_codegen.cpp (+1-1)
- (modified) clang/test/OpenMP/taskloop_simd_codegen.cpp (+1-1)
- (modified) clang/test/OpenMP/teams_distribute_parallel_for_if_codegen.cpp (+6-6)
- (modified) clang/test/OpenMP/teams_distribute_parallel_for_simd_if_codegen.cpp (+38-38)
- (modified) clang/test/OpenMP/teams_distribute_simd_codegen.cpp (+12-12)
``````````diff
diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h
index 54634e6ec7eec..3cbbf1a3074ac 100644
--- a/clang/include/clang/Basic/CodeGenOptions.h
+++ b/clang/include/clang/Basic/CodeGenOptions.h
@@ -682,6 +682,8 @@ class CodeGenOptions : public CodeGenOptionsBase {
bool isConvertingBoolWithCmp0() const {
switch (getLoadBoolFromMem()) {
case BoolFromMem::Strict:
+ return !isOptimizedBuild();
+
case BoolFromMem::Truncate:
return false;
diff --git a/clang/test/C/drs/dr335.c b/clang/test/C/drs/dr335.c
index 3ce6ce5bd53ca..a0523cb5cbcd8 100644
--- a/clang/test/C/drs/dr335.c
+++ b/clang/test/C/drs/dr335.c
@@ -45,6 +45,5 @@ void dr335(void) {
// CHECK-NEXT: %[[CLEAR2:.+]] = and i8 %[[LOAD2]], -2
// CHECK-NEXT: %[[SET:.+]] = or i8 %[[CLEAR2]], %[[ZERO]]
// CHECK-NEXT: store i8 %[[SET]], ptr {{.+}}, align 1
- // CHECK-NEXT: {{.+}} = trunc i8 %[[ZERO]] to i1
}
diff --git a/clang/test/CodeGen/AArch64/sve-intrinsics/acle_sve_dupq.c b/clang/test/CodeGen/AArch64/sve-intrinsics/acle_sve_dupq.c
index 5928de5fea1ff..7a645c5c38b8c 100644
--- a/clang/test/CodeGen/AArch64/sve-intrinsics/acle_sve_dupq.c
+++ b/clang/test/CodeGen/AArch64/sve-intrinsics/acle_sve_dupq.c
@@ -557,22 +557,22 @@ svfloat64_t test_svdupq_n_f64(float64_t x0, float64_t x1) MODE_ATTR
// CHECK-NEXT: [[FROMBOOL13:%.*]] = zext i1 [[X13:%.*]] to i8
// CHECK-NEXT: [[FROMBOOL14:%.*]] = zext i1 [[X14:%.*]] to i8
// CHECK-NEXT: [[FROMBOOL15:%.*]] = zext i1 [[X15:%.*]] to i8
-// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
-// CHECK-NEXT: [[TOBOOL16:%.*]] = trunc i8 [[FROMBOOL1]] to i1
-// CHECK-NEXT: [[TOBOOL17:%.*]] = trunc i8 [[FROMBOOL2]] to i1
-// CHECK-NEXT: [[TOBOOL18:%.*]] = trunc i8 [[FROMBOOL3]] to i1
-// CHECK-NEXT: [[TOBOOL19:%.*]] = trunc i8 [[FROMBOOL4]] to i1
-// CHECK-NEXT: [[TOBOOL20:%.*]] = trunc i8 [[FROMBOOL5]] to i1
-// CHECK-NEXT: [[TOBOOL21:%.*]] = trunc i8 [[FROMBOOL6]] to i1
-// CHECK-NEXT: [[TOBOOL22:%.*]] = trunc i8 [[FROMBOOL7]] to i1
-// CHECK-NEXT: [[TOBOOL23:%.*]] = trunc i8 [[FROMBOOL8]] to i1
-// CHECK-NEXT: [[TOBOOL24:%.*]] = trunc i8 [[FROMBOOL9]] to i1
-// CHECK-NEXT: [[TOBOOL25:%.*]] = trunc i8 [[FROMBOOL10]] to i1
-// CHECK-NEXT: [[TOBOOL26:%.*]] = trunc i8 [[FROMBOOL11]] to i1
-// CHECK-NEXT: [[TOBOOL27:%.*]] = trunc i8 [[FROMBOOL12]] to i1
-// CHECK-NEXT: [[TOBOOL28:%.*]] = trunc i8 [[FROMBOOL13]] to i1
-// CHECK-NEXT: [[TOBOOL29:%.*]] = trunc i8 [[FROMBOOL14]] to i1
-// CHECK-NEXT: [[TOBOOL30:%.*]] = trunc i8 [[FROMBOOL15]] to i1
+// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[FROMBOOL]], 0
+// CHECK-NEXT: [[TOBOOL16:%.*]] = icmp ne i8 [[FROMBOOL1]], 0
+// CHECK-NEXT: [[TOBOOL17:%.*]] = icmp ne i8 [[FROMBOOL2]], 0
+// CHECK-NEXT: [[TOBOOL18:%.*]] = icmp ne i8 [[FROMBOOL3]], 0
+// CHECK-NEXT: [[TOBOOL19:%.*]] = icmp ne i8 [[FROMBOOL4]], 0
+// CHECK-NEXT: [[TOBOOL20:%.*]] = icmp ne i8 [[FROMBOOL5]], 0
+// CHECK-NEXT: [[TOBOOL21:%.*]] = icmp ne i8 [[FROMBOOL6]], 0
+// CHECK-NEXT: [[TOBOOL22:%.*]] = icmp ne i8 [[FROMBOOL7]], 0
+// CHECK-NEXT: [[TOBOOL23:%.*]] = icmp ne i8 [[FROMBOOL8]], 0
+// CHECK-NEXT: [[TOBOOL24:%.*]] = icmp ne i8 [[FROMBOOL9]], 0
+// CHECK-NEXT: [[TOBOOL25:%.*]] = icmp ne i8 [[FROMBOOL10]], 0
+// CHECK-NEXT: [[TOBOOL26:%.*]] = icmp ne i8 [[FROMBOOL11]], 0
+// CHECK-NEXT: [[TOBOOL27:%.*]] = icmp ne i8 [[FROMBOOL12]], 0
+// CHECK-NEXT: [[TOBOOL28:%.*]] = icmp ne i8 [[FROMBOOL13]], 0
+// CHECK-NEXT: [[TOBOOL29:%.*]] = icmp ne i8 [[FROMBOOL14]], 0
+// CHECK-NEXT: [[TOBOOL30:%.*]] = icmp ne i8 [[FROMBOOL15]], 0
// CHECK-NEXT: [[TMP0:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: [[TMP1:%.*]] = zext i1 [[TOBOOL16]] to i8
// CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TOBOOL17]] to i8
@@ -629,22 +629,22 @@ svfloat64_t test_svdupq_n_f64(float64_t x0, float64_t x1) MODE_ATTR
// CPP-CHECK-NEXT: [[FROMBOOL13:%.*]] = zext i1 [[X13:%.*]] to i8
// CPP-CHECK-NEXT: [[FROMBOOL14:%.*]] = zext i1 [[X14:%.*]] to i8
// CPP-CHECK-NEXT: [[FROMBOOL15:%.*]] = zext i1 [[X15:%.*]] to i8
-// CPP-CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL16:%.*]] = trunc i8 [[FROMBOOL1]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL17:%.*]] = trunc i8 [[FROMBOOL2]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL18:%.*]] = trunc i8 [[FROMBOOL3]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL19:%.*]] = trunc i8 [[FROMBOOL4]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL20:%.*]] = trunc i8 [[FROMBOOL5]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL21:%.*]] = trunc i8 [[FROMBOOL6]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL22:%.*]] = trunc i8 [[FROMBOOL7]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL23:%.*]] = trunc i8 [[FROMBOOL8]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL24:%.*]] = trunc i8 [[FROMBOOL9]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL25:%.*]] = trunc i8 [[FROMBOOL10]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL26:%.*]] = trunc i8 [[FROMBOOL11]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL27:%.*]] = trunc i8 [[FROMBOOL12]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL28:%.*]] = trunc i8 [[FROMBOOL13]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL29:%.*]] = trunc i8 [[FROMBOOL14]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL30:%.*]] = trunc i8 [[FROMBOOL15]] to i1
+// CPP-CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[FROMBOOL]], 0
+// CPP-CHECK-NEXT: [[TOBOOL16:%.*]] = icmp ne i8 [[FROMBOOL1]], 0
+// CPP-CHECK-NEXT: [[TOBOOL17:%.*]] = icmp ne i8 [[FROMBOOL2]], 0
+// CPP-CHECK-NEXT: [[TOBOOL18:%.*]] = icmp ne i8 [[FROMBOOL3]], 0
+// CPP-CHECK-NEXT: [[TOBOOL19:%.*]] = icmp ne i8 [[FROMBOOL4]], 0
+// CPP-CHECK-NEXT: [[TOBOOL20:%.*]] = icmp ne i8 [[FROMBOOL5]], 0
+// CPP-CHECK-NEXT: [[TOBOOL21:%.*]] = icmp ne i8 [[FROMBOOL6]], 0
+// CPP-CHECK-NEXT: [[TOBOOL22:%.*]] = icmp ne i8 [[FROMBOOL7]], 0
+// CPP-CHECK-NEXT: [[TOBOOL23:%.*]] = icmp ne i8 [[FROMBOOL8]], 0
+// CPP-CHECK-NEXT: [[TOBOOL24:%.*]] = icmp ne i8 [[FROMBOOL9]], 0
+// CPP-CHECK-NEXT: [[TOBOOL25:%.*]] = icmp ne i8 [[FROMBOOL10]], 0
+// CPP-CHECK-NEXT: [[TOBOOL26:%.*]] = icmp ne i8 [[FROMBOOL11]], 0
+// CPP-CHECK-NEXT: [[TOBOOL27:%.*]] = icmp ne i8 [[FROMBOOL12]], 0
+// CPP-CHECK-NEXT: [[TOBOOL28:%.*]] = icmp ne i8 [[FROMBOOL13]], 0
+// CPP-CHECK-NEXT: [[TOBOOL29:%.*]] = icmp ne i8 [[FROMBOOL14]], 0
+// CPP-CHECK-NEXT: [[TOBOOL30:%.*]] = icmp ne i8 [[FROMBOOL15]], 0
// CPP-CHECK-NEXT: [[TMP0:%.*]] = zext i1 [[TOBOOL]] to i8
// CPP-CHECK-NEXT: [[TMP1:%.*]] = zext i1 [[TOBOOL16]] to i8
// CPP-CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TOBOOL17]] to i8
@@ -702,14 +702,14 @@ svbool_t test_svdupq_n_b8(bool x0, bool x1, bool x2, bool x3,
// CHECK-NEXT: [[FROMBOOL5:%.*]] = zext i1 [[X5:%.*]] to i8
// CHECK-NEXT: [[FROMBOOL6:%.*]] = zext i1 [[X6:%.*]] to i8
// CHECK-NEXT: [[FROMBOOL7:%.*]] = zext i1 [[X7:%.*]] to i8
-// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
-// CHECK-NEXT: [[TOBOOL8:%.*]] = trunc i8 [[FROMBOOL1]] to i1
-// CHECK-NEXT: [[TOBOOL9:%.*]] = trunc i8 [[FROMBOOL2]] to i1
-// CHECK-NEXT: [[TOBOOL10:%.*]] = trunc i8 [[FROMBOOL3]] to i1
-// CHECK-NEXT: [[TOBOOL11:%.*]] = trunc i8 [[FROMBOOL4]] to i1
-// CHECK-NEXT: [[TOBOOL12:%.*]] = trunc i8 [[FROMBOOL5]] to i1
-// CHECK-NEXT: [[TOBOOL13:%.*]] = trunc i8 [[FROMBOOL6]] to i1
-// CHECK-NEXT: [[TOBOOL14:%.*]] = trunc i8 [[FROMBOOL7]] to i1
+// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[FROMBOOL]], 0
+// CHECK-NEXT: [[TOBOOL8:%.*]] = icmp ne i8 [[FROMBOOL1]], 0
+// CHECK-NEXT: [[TOBOOL9:%.*]] = icmp ne i8 [[FROMBOOL2]], 0
+// CHECK-NEXT: [[TOBOOL10:%.*]] = icmp ne i8 [[FROMBOOL3]], 0
+// CHECK-NEXT: [[TOBOOL11:%.*]] = icmp ne i8 [[FROMBOOL4]], 0
+// CHECK-NEXT: [[TOBOOL12:%.*]] = icmp ne i8 [[FROMBOOL5]], 0
+// CHECK-NEXT: [[TOBOOL13:%.*]] = icmp ne i8 [[FROMBOOL6]], 0
+// CHECK-NEXT: [[TOBOOL14:%.*]] = icmp ne i8 [[FROMBOOL7]], 0
// CHECK-NEXT: [[TMP0:%.*]] = zext i1 [[TOBOOL]] to i16
// CHECK-NEXT: [[TMP1:%.*]] = zext i1 [[TOBOOL8]] to i16
// CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TOBOOL9]] to i16
@@ -743,14 +743,14 @@ svbool_t test_svdupq_n_b8(bool x0, bool x1, bool x2, bool x3,
// CPP-CHECK-NEXT: [[FROMBOOL5:%.*]] = zext i1 [[X5:%.*]] to i8
// CPP-CHECK-NEXT: [[FROMBOOL6:%.*]] = zext i1 [[X6:%.*]] to i8
// CPP-CHECK-NEXT: [[FROMBOOL7:%.*]] = zext i1 [[X7:%.*]] to i8
-// CPP-CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL8:%.*]] = trunc i8 [[FROMBOOL1]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL9:%.*]] = trunc i8 [[FROMBOOL2]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL10:%.*]] = trunc i8 [[FROMBOOL3]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL11:%.*]] = trunc i8 [[FROMBOOL4]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL12:%.*]] = trunc i8 [[FROMBOOL5]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL13:%.*]] = trunc i8 [[FROMBOOL6]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL14:%.*]] = trunc i8 [[FROMBOOL7]] to i1
+// CPP-CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[FROMBOOL]], 0
+// CPP-CHECK-NEXT: [[TOBOOL8:%.*]] = icmp ne i8 [[FROMBOOL1]], 0
+// CPP-CHECK-NEXT: [[TOBOOL9:%.*]] = icmp ne i8 [[FROMBOOL2]], 0
+// CPP-CHECK-NEXT: [[TOBOOL10:%.*]] = icmp ne i8 [[FROMBOOL3]], 0
+// CPP-CHECK-NEXT: [[TOBOOL11:%.*]] = icmp ne i8 [[FROMBOOL4]], 0
+// CPP-CHECK-NEXT: [[TOBOOL12:%.*]] = icmp ne i8 [[FROMBOOL5]], 0
+// CPP-CHECK-NEXT: [[TOBOOL13:%.*]] = icmp ne i8 [[FROMBOOL6]], 0
+// CPP-CHECK-NEXT: [[TOBOOL14:%.*]] = icmp ne i8 [[FROMBOOL7]], 0
// CPP-CHECK-NEXT: [[TMP0:%.*]] = zext i1 [[TOBOOL]] to i16
// CPP-CHECK-NEXT: [[TMP1:%.*]] = zext i1 [[TOBOOL8]] to i16
// CPP-CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TOBOOL9]] to i16
@@ -787,10 +787,10 @@ svbool_t test_svdupq_n_b16(bool x0, bool x1, bool x2, bool x3,
// CHECK-NEXT: [[FROMBOOL1:%.*]] = zext i1 [[X1:%.*]] to i8
// CHECK-NEXT: [[FROMBOOL2:%.*]] = zext i1 [[X2:%.*]] to i8
// CHECK-NEXT: [[FROMBOOL3:%.*]] = zext i1 [[X3:%.*]] to i8
-// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
-// CHECK-NEXT: [[TOBOOL4:%.*]] = trunc i8 [[FROMBOOL1]] to i1
-// CHECK-NEXT: [[TOBOOL5:%.*]] = trunc i8 [[FROMBOOL2]] to i1
-// CHECK-NEXT: [[TOBOOL6:%.*]] = trunc i8 [[FROMBOOL3]] to i1
+// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[FROMBOOL]], 0
+// CHECK-NEXT: [[TOBOOL4:%.*]] = icmp ne i8 [[FROMBOOL1]], 0
+// CHECK-NEXT: [[TOBOOL5:%.*]] = icmp ne i8 [[FROMBOOL2]], 0
+// CHECK-NEXT: [[TOBOOL6:%.*]] = icmp ne i8 [[FROMBOOL3]], 0
// CHECK-NEXT: [[TMP0:%.*]] = zext i1 [[TOBOOL]] to i32
// CHECK-NEXT: [[TMP1:%.*]] = zext i1 [[TOBOOL4]] to i32
// CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TOBOOL5]] to i32
@@ -812,10 +812,10 @@ svbool_t test_svdupq_n_b16(bool x0, bool x1, bool x2, bool x3,
// CPP-CHECK-NEXT: [[FROMBOOL1:%.*]] = zext i1 [[X1:%.*]] to i8
// CPP-CHECK-NEXT: [[FROMBOOL2:%.*]] = zext i1 [[X2:%.*]] to i8
// CPP-CHECK-NEXT: [[FROMBOOL3:%.*]] = zext i1 [[X3:%.*]] to i8
-// CPP-CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL4:%.*]] = trunc i8 [[FROMBOOL1]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL5:%.*]] = trunc i8 [[FROMBOOL2]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL6:%.*]] = trunc i8 [[FROMBOOL3]] to i1
+// CPP-CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[FROMBOOL]], 0
+// CPP-CHECK-NEXT: [[TOBOOL4:%.*]] = icmp ne i8 [[FROMBOOL1]], 0
+// CPP-CHECK-NEXT: [[TOBOOL5:%.*]] = icmp ne i8 [[FROMBOOL2]], 0
+// CPP-CHECK-NEXT: [[TOBOOL6:%.*]] = icmp ne i8 [[FROMBOOL3]], 0
// CPP-CHECK-NEXT: [[TMP0:%.*]] = zext i1 [[TOBOOL]] to i32
// CPP-CHECK-NEXT: [[TMP1:%.*]] = zext i1 [[TOBOOL4]] to i32
// CPP-CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TOBOOL5]] to i32
@@ -841,8 +841,8 @@ svbool_t test_svdupq_n_b32(bool x0, bool x1, bool x2, bool x3) MODE_ATTR
// CHECK-NEXT: entry:
// CHECK-NEXT: [[FROMBOOL:%.*]] = zext i1 [[X0:%.*]] to i8
// CHECK-NEXT: [[FROMBOOL1:%.*]] = zext i1 [[X1:%.*]] to i8
-// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
-// CHECK-NEXT: [[TOBOOL2:%.*]] = trunc i8 [[FROMBOOL1]] to i1
+// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[FROMBOOL]], 0
+// CHECK-NEXT: [[TOBOOL2:%.*]] = icmp ne i8 [[FROMBOOL1]], 0
// CHECK-NEXT: [[TMP0:%.*]] = zext i1 [[TOBOOL]] to i64
// CHECK-NEXT: [[TMP1:%.*]] = zext i1 [[TOBOOL2]] to i64
// CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[TMP0]], i64 0
@@ -858,8 +858,8 @@ svbool_t test_svdupq_n_b32(bool x0, bool x1, bool x2, bool x3) MODE_ATTR
// CPP-CHECK-NEXT: entry:
// CPP-CHECK-NEXT: [[FROMBOOL:%.*]] = zext i1 [[X0:%.*]] to i8
// CPP-CHECK-NEXT: [[FROMBOOL1:%.*]] = zext i1 [[X1:%.*]] to i8
-// CPP-CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
-// CPP-CHECK-NEXT: [[TOBOOL2:%.*]] = trunc i8 [[FROMBOOL1]] to i1
+// CPP-CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i8 [[FROMBOOL]], 0
+// CPP-CHECK-NEXT: [[TOBOOL2:%.*]] = icmp ne i8 [[FROMBOOL1]], 0
// CPP-CHECK-NEXT: [[TMP0:%.*]] = zext i1 [[TOBOOL]] to i64
// CPP-CHECK-NEXT: [[TMP1:%.*]] = zext i1 [[TOBOOL2]] to i64
// CPP-CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[TMP0]], i64 0
diff --git a/clang/test/CodeGen/atomic-test-and-set.c b/clang/test/CodeGen/atomic-test-and-set.c
index 6438094567f33..83a2876c862a0 100644
--- a/clang/test/CodeGen/atomic-test-and-set.c
+++ b/clang/test/CodeGen/atomic-test-and-set.c
@@ -84,7 +84,7 @@ void clear_dynamic(char *ptr, int order) {
// CHECK-NEXT: [[TOBOOL_ZEXT:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: store i8 [[TOBOOL_ZEXT]], ptr [[ATOMIC_TEMP]], align 1
// CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP2]], 0
// CHECK-NEXT: ret void
//
void test_and_set_relaxed(char *ptr) {
@@ -103,7 +103,7 @@ void test_and_set_relaxed(char *ptr) {
// CHECK-NEXT: [[TOBOOL_ZEXT:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: store i8 [[TOBOOL_ZEXT]], ptr [[ATOMIC_TEMP]], align 1
// CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP2]], 0
// CHECK-NEXT: ret void
//
void test_and_set_consume(char *ptr) {
@@ -122,7 +122,7 @@ void test_and_set_consume(char *ptr) {
// CHECK-NEXT: [[TOBOOL_ZEXT:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: store i8 [[TOBOOL_ZEXT]], ptr [[ATOMIC_TEMP]], align 1
// CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP2]], 0
// CHECK-NEXT: ret void
//
void test_and_set_acquire(char *ptr) {
@@ -141,7 +141,7 @@ void test_and_set_acquire(char *ptr) {
// CHECK-NEXT: [[TOBOOL_ZEXT:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: store i8 [[TOBOOL_ZEXT]], ptr [[ATOMIC_TEMP]], align 1
// CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP2]], 0
// CHECK-NEXT: ret void
//
void test_and_set_release(char *ptr) {
@@ -160,7 +160,7 @@ void test_and_set_release(char *ptr) {
// CHECK-NEXT: [[TOBOOL_ZEXT:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: store i8 [[TOBOOL_ZEXT]], ptr [[ATOMIC_TEMP]], align 1
// CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP2]], 0
// CHECK-NEXT: ret void
//
void test_and_set_acq_rel(char *ptr) {
@@ -179,7 +179,7 @@ void test_and_set_acq_rel(char *ptr) {
// CHECK-NEXT: [[TOBOOL_ZEXT:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: store i8 [[TOBOOL_ZEXT]], ptr [[ATOMIC_TEMP]], align 1
// CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP2]], 0
// CHECK-NEXT: ret void
//
void test_and_set_seq_cst(char *ptr) {
@@ -235,7 +235,7 @@ void test_and_set_seq_cst(char *ptr) {
// CHECK-NEXT: br label %[[ATOMIC_CONTINUE]]
// CHECK: [[ATOMIC_CONTINUE]]:
// CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP7]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP7]], 0
// CHECK-NEXT: ret void
//
void test_and_set_dynamic(char *ptr, int order) {
@@ -253,7 +253,7 @@ void test_and_set_dynamic(char *ptr, int order) {
// CHECK-NEXT: [[TOBOOL_ZEXT:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: store i8 [[TOBOOL_ZEXT]], ptr [[ATOMIC_TEMP]], align 1
// CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP1]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP1]], 0
// CHECK-NEXT: ret void
//
void test_and_set_array() {
@@ -316,7 +316,7 @@ void clear_incomplete(struct incomplete *ptr) {
// CHECK-NEXT: [[TOBOOL_ZEXT:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: store i8 [[TOBOOL_ZEXT]], ptr [[ATOMIC_TEMP]], align 1
// CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP2]], 0
// CHECK-NEXT: ret void
//
void test_and_set_int(int *ptr) {
@@ -334,7 +334,7 @@ void test_and_set_int(int *ptr) {
// CHECK-NEXT: [[TOBOOL_ZEXT:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: store i8 [[TOBOOL_ZEXT]], ptr [[ATOMIC_TEMP]], align 1
// CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP2]], 0
// CHECK-NEXT: ret void
//
void test_and_set_void(void *ptr) {
@@ -352,7 +352,7 @@ void test_and_set_void(void *ptr) {
// CHECK-NEXT: [[TOBOOL_ZEXT:%.*]] = zext i1 [[TOBOOL]] to i8
// CHECK-NEXT: store i8 [[TOBOOL_ZEXT]], ptr [[ATOMIC_TEMP]], align 1
// CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ATOMIC_TEMP]], align 1
-// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i1
+// CHECK-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP2]], 0
// CHECK-NEXT: ret void
//
void test_and_set_incomplete(struct incomplete *ptr) {
diff --git a/clang/test/CodeGen/atomic.c b/clang/test/CodeGen/atomic.c
index 16c29e282ddd9..f1a49780fc808 100644
--- a/clang/test/CodeGen/atomic.c
+++ b/clang/test/CodeGen/atomic.c
@@ -91,7 +91,7 @@ int atomic(void) {
if ( __sync_val_compare_and_swap(&valb, 0, 1)) {
// CHECK: [[PAIR:%[a-z0-9_.]+]] = cmpxchg ptr %valb, i8 0, i8 1 seq_cst seq_cst, align 1
// CHECK: [[VAL:%[a-z0-9_.]+]] = extractvalue { i8, i1 } [[PAIR]], 0
- // CHECK: trunc i8 [[VAL]] to i1
+ // CHECK: icmp ne i8 [[VAL]], 0
old = 42;
}
diff --git a/clang/test/CodeGen/atomic_ops.c b/clang/test/CodeGen/atomic_ops.c
index fb34fc2a43836..7dce278e02101 100644
--- a/clang/test/CodeGen/atomic_ops.c
+++ b/clang/test/CodeGen/atomic_ops.c
@@ -34,12 +34,12 @@ extern _Atomic _Bool b;
_Bool bar(void) {
// NATIVE-LABEL: @bar
// NATIVE: %[[load:.*]] = load atomic i8, ptr @b seq_cst, align 1
-// NATIVE: %[[tobool:.*]] = trunc i8 %[[load]] to i1
+// NATIVE: %[[tobool:.*]] = icmp ne i8 %[[load]], 0
// NATIVE: ret i1 %[[tobool]]
// LIBCALL-LABEL: @bar
// LIBCALL: call void @__atomic_load(i32 noundef 1, ptr noundef @b, ptr noundef %atomic-temp, i32 noundef 5)
// LIBCALL: %[[load:.*]] = load i8, ptr %atomic-temp
-// LIBCALL: %[[tobool:.*]] = trunc i8 %[[load]] to i1
+// LIBCALL: %[[tobool:.*]] = icmp ne i8 %[[load]], 0
// LIBCALL: ret i1 %[[tobool]]
return b;
diff --git a/clang/test/CodeGen/builtins-bitint.c b/clang/test/CodeGen/builtins-bitint.c
index 207ff388a2876..51a5fe5d2f57f 100644
--- a/clang/test/CodeGen/builtins-bitint.c
+++ b/clang/test/CodeGen/builtins-bitint.c
@@ -11,7 +11,7 @@
// CHECK-O0-NEXT: [[A:%.*]] = alloca i8, align 1
// CHECK-O0-NEXT: store i8 1, ptr [[A]], align 1
// CHECK-O0-NEXT: [[TMP0:%.*]] = load i8, ptr [[A]], align 1
-// CHECK-O0-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
+// CHECK-O0-NEXT: [[LOADEDV:%.*]] = icmp ne i8 [[TMP0]], 0
// CHECK-O0-NEXT: [[TMP1:%.*]] = call i1 @llvm.ctpop.i1(i1 [[LOADEDV]])...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/193783
More information about the cfe-commits
mailing list