[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