| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 |
| // RUN: %clang_cc1 -emit-llvm -fopenmp -triple=x86_64-unknown-linux-gnu \ |
| // RUN: -DORDERING=seq_cst -o - %s \ |
| // RUN: | FileCheck %s --check-prefix=SEQ_CST |
| // RUN: %clang_cc1 -emit-llvm -fopenmp -triple=x86_64-unknown-linux-gnu \ |
| // RUN: -DORDERING=acq_rel -o - %s \ |
| // RUN: | FileCheck %s --check-prefix=ACQ_REL |
| // RUN: %clang_cc1 -emit-llvm -fopenmp -triple=x86_64-unknown-linux-gnu \ |
| // RUN: -DORDERING=relaxed -o - %s \ |
| // RUN: | FileCheck %s --check-prefix=RELAXED |
| |
| #pragma omp requires atomic_default_mem_order(ORDERING) |
| |
| // SEQ_CST-LABEL: define dso_local void @_Z3fooPi( |
| // SEQ_CST-SAME: ptr noundef [[X:%.*]]) #[[ATTR0:[0-9]+]] { |
| // SEQ_CST-NEXT: [[ENTRY:.*:]] |
| // SEQ_CST-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8 |
| // SEQ_CST-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8 |
| // SEQ_CST-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8 |
| // SEQ_CST-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[TMP0]], i32 1 seq_cst, align 4 |
| // SEQ_CST-NEXT: call void @__kmpc_flush(ptr @[[GLOB1:[0-9]+]]) |
| // SEQ_CST-NEXT: ret void |
| // |
| // ACQ_REL-LABEL: define dso_local void @_Z3fooPi( |
| // ACQ_REL-SAME: ptr noundef [[X:%.*]]) #[[ATTR0:[0-9]+]] { |
| // ACQ_REL-NEXT: [[ENTRY:.*:]] |
| // ACQ_REL-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8 |
| // ACQ_REL-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8 |
| // ACQ_REL-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8 |
| // ACQ_REL-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[TMP0]], i32 1 release, align 4 |
| // ACQ_REL-NEXT: call void @__kmpc_flush(ptr @[[GLOB1:[0-9]+]]) |
| // ACQ_REL-NEXT: ret void |
| // |
| // RELAXED-LABEL: define dso_local void @_Z3fooPi( |
| // RELAXED-SAME: ptr noundef [[X:%.*]]) #[[ATTR0:[0-9]+]] { |
| // RELAXED-NEXT: [[ENTRY:.*:]] |
| // RELAXED-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8 |
| // RELAXED-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8 |
| // RELAXED-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8 |
| // RELAXED-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[TMP0]], i32 1 monotonic, align 4 |
| // RELAXED-NEXT: ret void |
| // |
| void foo(int *x) { |
| #pragma omp atomic update |
| *x = *x + 1; |
| } |