| // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s |
| // RUN: %clang_cc1 -triple riscv64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s |
| // RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s |
| |
| // When performing compound assignment on atomic_bool, ensure that we |
| // correctly handle the conversion from integer to boolean, by comparing |
| // with zero rather than truncating. |
| |
| // CHECK-LABEL: @compund_assign_add |
| int compund_assign_add(void) { |
| _Atomic _Bool b; |
| |
| b += 2; |
| // CHECK: add |
| // CHECK: icmp ne |
| // CHECK-NOT: trunc |
| // CHECK: {{cmpxchg|call.*__atomic_compare_exchange}} |
| return b; |
| } |
| |
| // CHECK-LABEL: @compund_assign_minus |
| int compund_assign_minus(void) { |
| _Atomic _Bool b; |
| |
| b -= 2; |
| // CHECK: sub |
| // CHECK: icmp ne |
| // CHECK-NOT: trunc |
| // CHECK: {{cmpxchg|call.*__atomic_compare_exchange}} |
| return b; |
| } |