1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2 // RUN: %clang_cc1 -emit-llvm -fopenmp -triple=x86_64-unknown-linux-gnu \
3 // RUN: -DORDERING=seq_cst -o - %s \
4 // RUN: | FileCheck %s --check-prefix=SEQ_CST
5 // RUN: %clang_cc1 -emit-llvm -fopenmp -triple=x86_64-unknown-linux-gnu \
6 // RUN: -DORDERING=acq_rel -o - %s \
7 // RUN: | FileCheck %s --check-prefix=ACQ_REL
8 // RUN: %clang_cc1 -emit-llvm -fopenmp -triple=x86_64-unknown-linux-gnu \
9 // RUN: -DORDERING=relaxed -o - %s \
10 // RUN: | FileCheck %s --check-prefix=RELAXED
11
12 #pragma omp requires atomic_default_mem_order(ORDERING)
13
14 // SEQ_CST-LABEL: define dso_local void @_Z3fooPi(
15 // SEQ_CST-SAME: ptr noundef [[X:%.*]]) #[[ATTR0:[0-9]+]] {
16 // SEQ_CST-NEXT: [[ENTRY:.*:]]
17 // SEQ_CST-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8
18 // SEQ_CST-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
19 // SEQ_CST-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
20 // SEQ_CST-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[TMP0]], i32 1 seq_cst, align 4
21 // SEQ_CST-NEXT: call void @__kmpc_flush(ptr @[[GLOB1:[0-9]+]])
22 // SEQ_CST-NEXT: ret void
23 //
24 // ACQ_REL-LABEL: define dso_local void @_Z3fooPi(
25 // ACQ_REL-SAME: ptr noundef [[X:%.*]]) #[[ATTR0:[0-9]+]] {
26 // ACQ_REL-NEXT: [[ENTRY:.*:]]
27 // ACQ_REL-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8
28 // ACQ_REL-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
29 // ACQ_REL-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
30 // ACQ_REL-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[TMP0]], i32 1 release, align 4
31 // ACQ_REL-NEXT: call void @__kmpc_flush(ptr @[[GLOB1:[0-9]+]])
32 // ACQ_REL-NEXT: ret void
33 //
34 // RELAXED-LABEL: define dso_local void @_Z3fooPi(
35 // RELAXED-SAME: ptr noundef [[X:%.*]]) #[[ATTR0:[0-9]+]] {
36 // RELAXED-NEXT: [[ENTRY:.*:]]
37 // RELAXED-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8
38 // RELAXED-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
39 // RELAXED-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
40 // RELAXED-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[TMP0]], i32 1 monotonic, align 4
41 // RELAXED-NEXT: ret void
42 //
foo(int * x)43 void foo(int *x) {
44 #pragma omp atomic update
45 *x = *x + 1;
46 }
47