| // 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; | |
| } |