Skip to content

Commit 945b7c8

Browse files
committed
Introduce BuildBuiltins.h
1 parent 3d5348b commit 945b7c8

File tree

19 files changed

+26565
-13835
lines changed

19 files changed

+26565
-13835
lines changed

clang/lib/CodeGen/CGStmtOpenMP.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6740,16 +6740,18 @@ static void emitOMPAtomicCompareExpr(
67406740
R->getType().isVolatileQualified()};
67416741
}
67426742

6743+
llvm::OpenMPIRBuilder::InsertPointTy AllocaIP(
6744+
CGF.AllocaInsertPt->getParent(), CGF.AllocaInsertPt->getIterator());
67436745
if (FailAO == llvm::AtomicOrdering::NotAtomic) {
67446746
// fail clause was not mentioned on the
67456747
// "#pragma omp atomic compare" construct.
6746-
CGF.Builder.restoreIP(OMPBuilder.createAtomicCompare(
6747-
CGF.Builder, XOpVal, VOpVal, ROpVal, EVal, DVal, AO, Op, IsXBinopExpr,
6748-
IsPostfixUpdate, IsFailOnly));
6748+
CGF.Builder.restoreIP(cantFail(OMPBuilder.createAtomicCompare(
6749+
CGF.Builder, AllocaIP, XOpVal, VOpVal, ROpVal, EVal, DVal, AO, Op,
6750+
IsXBinopExpr, IsPostfixUpdate, IsFailOnly)));
67496751
} else
6750-
CGF.Builder.restoreIP(OMPBuilder.createAtomicCompare(
6751-
CGF.Builder, XOpVal, VOpVal, ROpVal, EVal, DVal, AO, Op, IsXBinopExpr,
6752-
IsPostfixUpdate, IsFailOnly, FailAO));
6752+
CGF.Builder.restoreIP(cantFail(OMPBuilder.createAtomicCompare(
6753+
CGF.Builder, AllocaIP, XOpVal, VOpVal, ROpVal, EVal, DVal, AO, Op,
6754+
IsXBinopExpr, IsPostfixUpdate, IsFailOnly, FailAO)));
67536755
}
67546756

67556757
static void emitOMPAtomicExpr(CodeGenFunction &CGF, OpenMPClauseKind Kind,

clang/test/OpenMP/atomic_compare_codegen.cpp

Lines changed: 23272 additions & 12978 deletions
Large diffs are not rendered by default.

flang/lib/Semantics/CMakeLists.txt

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,10 @@
1-
add_flang_library(FortranSemantics
1+
add_flang_library(FortranSemantics PARTIAL_SOURCES_INTENDED
22
assignment.cpp
33
attr.cpp
44
canonicalize-acc.cpp
55
canonicalize-directives.cpp
66
canonicalize-do.cpp
77
canonicalize-omp.cpp
8-
check-acc-structure.cpp
9-
check-allocate.cpp
10-
check-arithmeticif.cpp
11-
check-call.cpp
12-
check-case.cpp
13-
check-coarray.cpp
14-
check-cuda.cpp
15-
check-data.cpp
16-
check-deallocate.cpp
17-
check-declarations.cpp
18-
check-do-forall.cpp
19-
check-if-stmt.cpp
20-
check-io.cpp
21-
check-namelist.cpp
22-
check-nullify.cpp
23-
check-omp-structure.cpp
24-
check-purity.cpp
25-
check-return.cpp
26-
check-select-rank.cpp
27-
check-select-type.cpp
28-
check-stop.cpp
298
compute-offsets.cpp
309
data-to-inits.cpp
3110
definable.cpp
@@ -63,3 +42,45 @@ add_flang_library(FortranSemantics
6342
FrontendOpenACC
6443
TargetParser
6544
)
45+
46+
47+
add_flang_library(FortranSemanticsCheck PARTIAL_SOURCES_INTENDED
48+
check-acc-structure.cpp
49+
check-allocate.cpp
50+
check-arithmeticif.cpp
51+
check-call.cpp
52+
check-case.cpp
53+
check-coarray.cpp
54+
check-cuda.cpp
55+
check-data.cpp
56+
check-deallocate.cpp
57+
check-declarations.cpp
58+
check-do-forall.cpp
59+
check-if-stmt.cpp
60+
check-io.cpp
61+
check-namelist.cpp
62+
check-nullify.cpp
63+
check-omp-structure.cpp
64+
check-purity.cpp
65+
check-return.cpp
66+
check-select-rank.cpp
67+
check-select-type.cpp
68+
check-stop.cpp
69+
70+
DEPENDS
71+
acc_gen
72+
omp_gen
73+
74+
LINK_LIBS
75+
FortranSupport
76+
FortranParser
77+
FortranEvaluate
78+
79+
LINK_COMPONENTS
80+
Support
81+
FrontendOpenMP
82+
FrontendOpenACC
83+
TargetParser
84+
)
85+
86+
target_link_libraries(FortranSemantics PUBLIC FortranSemanticsCheck)

flang/test/Integration/OpenMP/atomic-capture-complex.f90

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,43 @@
66
! added to this directory and sub-directories.
77
!===----------------------------------------------------------------------===!
88

9-
!RUN: %if x86-registered-target %{ %flang_fc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fopenmp %s -o - | FileCheck --check-prefixes=CHECK,X86 %s %}
10-
!RUN: %if aarch64-registerd-target %{ %flang_fc1 -triple aarch64-unknown-linux-gnu -emit-llvm -fopenmp %s -o - | FileCheck --check-prefixes=CHECK,AARCH64 %s %}
9+
!RUN: %if x86-registered-target %{ %flang_fc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fopenmp -mllvm --disable-llvm %s -o - | FileCheck %s %}
10+
!RUN: %if aarch64-registerd-target %{ %flang_fc1 -triple aarch64-unknown-linux-gnu -emit-llvm -fopenmp -mllvm --disable-llvm %s -o - | FileCheck %s %}
1111

12-
!CHECK: %[[X_NEW_VAL:.*]] = alloca { float, float }, align 8
13-
!CHECK: %[[VAL_1:.*]] = alloca { float, float }, i64 1, align 8
14-
!CHECK: %[[ORIG_VAL:.*]] = alloca { float, float }, i64 1, align 8
15-
!CHECK: store { float, float } { float 2.000000e+00, float 2.000000e+00 }, ptr %[[ORIG_VAL]], align 4
16-
!CHECK: br label %entry
17-
18-
!CHECK: entry:
19-
!CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
20-
!CHECK: call void @__atomic_load(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], i32 0)
21-
!CHECK: %[[PHI_NODE_ENTRY_1:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 8
22-
!CHECK: br label %.atomic.cont
23-
24-
!CHECK: .atomic.cont
25-
!CHECK: %[[VAL_4:.*]] = phi { float, float } [ %[[PHI_NODE_ENTRY_1]], %entry ], [ %{{.*}}, %.atomic.cont ]
26-
!CHECK: %[[VAL_5:.*]] = extractvalue { float, float } %[[VAL_4]], 0
27-
!CHECK: %[[VAL_6:.*]] = extractvalue { float, float } %[[VAL_4]], 1
28-
!CHECK: %[[VAL_7:.*]] = fadd contract float %[[VAL_5]], 1.000000e+00
29-
!CHECK: %[[VAL_8:.*]] = fadd contract float %[[VAL_6]], 1.000000e+00
30-
!CHECK: %[[VAL_9:.*]] = insertvalue { float, float } undef, float %[[VAL_7]], 0
31-
!CHECK: %[[VAL_10:.*]] = insertvalue { float, float } %[[VAL_9]], float %[[VAL_8]], 1
32-
!CHECK: store { float, float } %[[VAL_10]], ptr %[[X_NEW_VAL]], align 4
33-
!CHECK: %[[VAL_11:.*]] = call i1 @__atomic_compare_exchange(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]],
34-
!i32 2, i32 2)
35-
!CHECK: %[[VAL_12:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 4
36-
!CHECK: br i1 %[[VAL_11]], label %.atomic.exit, label %.atomic.cont
37-
38-
!CHECK: .atomic.exit
39-
!AARCH64: %[[LCSSA:.*]] = phi { float, float } [ %[[VAL_10]], %.atomic.cont ]
40-
!AARCH64: store { float, float } %[[LCSSA]], ptr %[[VAL_1]], align 4
41-
!X86: store { float, float } %[[VAL_10]], ptr %[[VAL_1]], align 4
12+
! CHECK-LABEL: define {{.*}}@_QQmain(
13+
! CHECK-NEXT: %[[DOTATOMIC_ORIG_PTR:.+]] = alloca { float, float }, align 8
14+
! CHECK-NEXT: %[[DOTATOMIC_UPD_PTR:.+]] = alloca { float, float }, align 8
15+
! CHECK-NEXT: %[[TMP1:.+]] = alloca { float, float }, i64 1, align 8
16+
! CHECK-NEXT: %[[TMP2:.+]] = alloca { float, float }, i64 1, align 8
17+
! CHECK-NEXT: store { float, float } { float 2.000000e+00, float 2.000000e+00 }, ptr %[[TMP2]], align 4
18+
! CHECK-NEXT: br label %[[ENTRY:.+]]
19+
! CHECK-EMPTY:
20+
! CHECK-NEXT: [[ENTRY]]:
21+
! CHECK-NEXT: %[[DOTATOMIC_LOAD:.+]] = load atomic i64, ptr %[[TMP2]] monotonic, align 8
22+
! CHECK-NEXT: store i64 %[[DOTATOMIC_LOAD]], ptr %[[DOTATOMIC_ORIG_PTR]], align 8
23+
! CHECK-NEXT: br label %[[DOTATOMIC_RETRY:.+]]
24+
! CHECK-EMPTY:
25+
! CHECK-NEXT: [[DOTATOMIC_RETRY]]:
26+
! CHECK-NEXT: %[[DOTATOMIC_ORIG:.+]] = load { float, float }, ptr %[[DOTATOMIC_ORIG_PTR]], align 4
27+
! CHECK-NEXT: %[[TMP3:.+]] = extractvalue { float, float } %[[DOTATOMIC_ORIG]], 0
28+
! CHECK-NEXT: %[[TMP4:.+]] = extractvalue { float, float } %[[DOTATOMIC_ORIG]], 1
29+
! CHECK-NEXT: %[[TMP5:.+]] = fadd contract float %[[TMP3]], 1.000000e+00
30+
! CHECK-NEXT: %[[TMP6:.+]] = fadd contract float %[[TMP4]], 1.000000e+00
31+
! CHECK-NEXT: %[[TMP7:.+]] = insertvalue { float, float } undef, float %[[TMP5]], 0
32+
! CHECK-NEXT: %[[TMP8:.+]] = insertvalue { float, float } %[[TMP7]], float %[[TMP6]], 1
33+
! CHECK-NEXT: store { float, float } %[[TMP8]], ptr %[[DOTATOMIC_UPD_PTR]], align 4
34+
! CHECK-NEXT: %[[DOTCMPXCHG_EXPECTED:.+]] = load i64, ptr %[[DOTATOMIC_ORIG_PTR]], align 8
35+
! CHECK-NEXT: %[[DOTCMPXCHG_DESIRED:.+]] = load i64, ptr %[[DOTATOMIC_UPD_PTR]], align 8
36+
! CHECK-NEXT: %[[DOTCMPXCHG_PAIR:.+]] = cmpxchg weak ptr %[[TMP2]], i64 %[[DOTCMPXCHG_EXPECTED]], i64 %[[DOTCMPXCHG_DESIRED]] monotonic monotonic, align 8
37+
! CHECK-NEXT: %[[DOTCMPXCHG_PREV:.+]] = extractvalue { i64, i1 } %[[DOTCMPXCHG_PAIR]], 0
38+
! CHECK-NEXT: store i64 %[[DOTCMPXCHG_PREV]], ptr %[[DOTATOMIC_ORIG_PTR]], align 8
39+
! CHECK-NEXT: %[[DOTCMPXCHG_SUCCESS:.+]] = extractvalue { i64, i1 } %[[DOTCMPXCHG_PAIR]], 1
40+
! CHECK-NEXT: br i1 %[[DOTCMPXCHG_SUCCESS]], label %[[DOTATOMIC_DONE:.+]], label %[[DOTATOMIC_RETRY]]
41+
! CHECK-EMPTY:
42+
! CHECK-NEXT: [[DOTATOMIC_DONE]]:
43+
! CHECK-NEXT: store { float, float } %[[TMP8]], ptr %[[TMP1]], align 4
44+
! CHECK-NEXT: ret void
45+
! CHECK-NEXT: }
4246

4347
program main
4448
complex*8 ia, ib

llvm/include/llvm/Analysis/TargetLibraryInfo.def

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,11 +462,91 @@ TLI_DEFINE_ENUM_INTERNAL(atomic_load)
462462
TLI_DEFINE_STRING_INTERNAL("__atomic_load")
463463
TLI_DEFINE_SIG_INTERNAL(Void, SizeT, Ptr, Ptr, Int)
464464

465+
/// int8_t __atomic_load_1(void *ptr, int memorder);
466+
TLI_DEFINE_ENUM_INTERNAL(atomic_load_1)
467+
TLI_DEFINE_STRING_INTERNAL("__atomic_load_1")
468+
TLI_DEFINE_SIG_INTERNAL(Int8, Ptr, Int)
469+
470+
/// int16_t __atomic_load_2(void *ptr, int memorder);
471+
TLI_DEFINE_ENUM_INTERNAL(atomic_load_2)
472+
TLI_DEFINE_STRING_INTERNAL("__atomic_load_2")
473+
TLI_DEFINE_SIG_INTERNAL(Int16, Ptr, Int)
474+
475+
/// int32_t __atomic_load_4(void *ptr, int memorder);
476+
TLI_DEFINE_ENUM_INTERNAL(atomic_load_4)
477+
TLI_DEFINE_STRING_INTERNAL("__atomic_load_4")
478+
TLI_DEFINE_SIG_INTERNAL(Int32, Ptr, Int)
479+
480+
/// int64_t __atomic_load_8(void *ptr int memorder);
481+
TLI_DEFINE_ENUM_INTERNAL(atomic_load_8)
482+
TLI_DEFINE_STRING_INTERNAL("__atomic_load_8")
483+
TLI_DEFINE_SIG_INTERNAL(Int64, Ptr, Int)
484+
485+
/// int128_t __atomic_load_16(void *ptr, int memorder);
486+
TLI_DEFINE_ENUM_INTERNAL(atomic_load_16)
487+
TLI_DEFINE_STRING_INTERNAL("__atomic_load_16")
488+
TLI_DEFINE_SIG_INTERNAL(Int128, Ptr, Int)
489+
465490
/// void __atomic_store(size_t size, void *mptr, void *vptr, int smodel);
466491
TLI_DEFINE_ENUM_INTERNAL(atomic_store)
467492
TLI_DEFINE_STRING_INTERNAL("__atomic_store")
468493
TLI_DEFINE_SIG_INTERNAL(Void, SizeT, Ptr, Ptr, Int)
469494

495+
/// void __atomic_store_1(void *ptr, int8_t val, int smodel);
496+
TLI_DEFINE_ENUM_INTERNAL(atomic_store_1)
497+
TLI_DEFINE_STRING_INTERNAL("__atomic_store_1")
498+
TLI_DEFINE_SIG_INTERNAL(Void, Ptr, Int8, Int)
499+
500+
/// void __atomic_store_2(void *ptr, int16_t val, int smodel);
501+
TLI_DEFINE_ENUM_INTERNAL(atomic_store_2)
502+
TLI_DEFINE_STRING_INTERNAL("__atomic_store_2")
503+
TLI_DEFINE_SIG_INTERNAL(Void, Ptr, Int16, Int)
504+
505+
/// void __atomic_store_4(void *ptr, int32_t val, int smodel);
506+
TLI_DEFINE_ENUM_INTERNAL(atomic_store_4)
507+
TLI_DEFINE_STRING_INTERNAL("__atomic_store_4")
508+
TLI_DEFINE_SIG_INTERNAL(Void, Ptr, Int32, Int)
509+
510+
/// void __atomic_store_8(void *ptr, int64_t val, int smodel);
511+
TLI_DEFINE_ENUM_INTERNAL(atomic_store_8)
512+
TLI_DEFINE_STRING_INTERNAL("__atomic_store_8")
513+
TLI_DEFINE_SIG_INTERNAL(Void, Ptr, Int64, Int)
514+
515+
/// void __atomic_store_16(void *ptr, int128_t val, int smodel);
516+
TLI_DEFINE_ENUM_INTERNAL(atomic_store_16)
517+
TLI_DEFINE_STRING_INTERNAL("__atomic_store_16")
518+
TLI_DEFINE_SIG_INTERNAL(Void, Ptr, Int128, Int)
519+
520+
/// bool __atomic_compare_exchange(size_t size, void *ptr, void *expected, void *desired, int success, int failure);
521+
TLI_DEFINE_ENUM_INTERNAL(atomic_compare_exchange)
522+
TLI_DEFINE_STRING_INTERNAL("__atomic_compare_exchange")
523+
TLI_DEFINE_SIG_INTERNAL(Bool, SizeT, Ptr, Ptr, Ptr, Int, Int)
524+
525+
/// bool __atomic_compare_exchange_1(void *ptr, void *expected, uint8_t desired, int success, int failure);
526+
TLI_DEFINE_ENUM_INTERNAL(atomic_compare_exchange_1)
527+
TLI_DEFINE_STRING_INTERNAL("__atomic_compare_exchange_1")
528+
TLI_DEFINE_SIG_INTERNAL(Bool, Ptr, Ptr, Int8, Int, Int)
529+
530+
/// bool __atomic_compare_exchange_2(void *ptr, void *expected, uint16_t desired, int success, int failure);
531+
TLI_DEFINE_ENUM_INTERNAL(atomic_compare_exchange_2)
532+
TLI_DEFINE_STRING_INTERNAL("__atomic_compare_exchange_2")
533+
TLI_DEFINE_SIG_INTERNAL(Bool, Ptr, Ptr, Int16, Int, Int)
534+
535+
/// bool __atomic_compare_exchange_4(void *ptr, void *expected, uint32_t desired, int success, int failure);
536+
TLI_DEFINE_ENUM_INTERNAL(atomic_compare_exchange_4)
537+
TLI_DEFINE_STRING_INTERNAL("__atomic_compare_exchange_4")
538+
TLI_DEFINE_SIG_INTERNAL(Bool, Ptr, Ptr, Int32, Int, Int)
539+
540+
/// bool __atomic_compare_exchange_8(void *ptr, void *expected, uint64_t desired, int success, int failure);
541+
TLI_DEFINE_ENUM_INTERNAL(atomic_compare_exchange_8)
542+
TLI_DEFINE_STRING_INTERNAL("__atomic_compare_exchange_8")
543+
TLI_DEFINE_SIG_INTERNAL(Bool, Ptr, Ptr, Int64, Int, Int)
544+
545+
/// bool __atomic_compare_exchange_16(void *ptr, void *expected, uint128_t desired, int success, int failure);
546+
TLI_DEFINE_ENUM_INTERNAL(atomic_compare_exchange_16)
547+
TLI_DEFINE_STRING_INTERNAL("__atomic_compare_exchange_16")
548+
TLI_DEFINE_SIG_INTERNAL(Bool, Ptr, Ptr, Int128, Int, Int)
549+
470550
/// double __cosh_finite(double x);
471551
TLI_DEFINE_ENUM_INTERNAL(cosh_finite)
472552
TLI_DEFINE_STRING_INTERNAL("__cosh_finite")

llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3215,7 +3215,6 @@ class OpenMPIRBuilder {
32153215

32163216
/// Emit atomic update for constructs: X = X BinOp Expr ,or X = Expr BinOp X
32173217
/// For complex Operations: X = UpdateOp(X) => CmpExch X, old_X, UpdateOp(X)
3218-
/// Only Scalar data types.
32193218
///
32203219
/// \param AllocaIP The insertion point to be used for alloca
32213220
/// instructions.
@@ -3236,7 +3235,7 @@ class OpenMPIRBuilder {
32363235
/// (e.g. true for X = X BinOp Expr)
32373236
///
32383237
/// \returns A pair of the old value of X before the update, and the value
3239-
/// used for the update.
3238+
/// after the update.
32403239
Expected<std::pair<Value *, Value *>>
32413240
emitAtomicUpdate(InsertPointTy AllocaIP, Value *X, Type *XElemTy, Value *Expr,
32423241
AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp,
@@ -3258,7 +3257,7 @@ class OpenMPIRBuilder {
32583257
bool IsVolatile = false;
32593258
};
32603259

3261-
/// Emit atomic Read for : V = X --- Only Scalar data types.
3260+
/// Emit atomic Read for : V = X.
32623261
///
32633262
/// \param Loc The insert and source location description.
32643263
/// \param X The target pointer to be atomically read
@@ -3268,9 +3267,9 @@ class OpenMPIRBuilder {
32683267
/// instructions.
32693268
///
32703269
/// \return Insertion point after generated atomic read IR.
3271-
InsertPointTy createAtomicRead(const LocationDescription &Loc,
3272-
AtomicOpValue &X, AtomicOpValue &V,
3273-
AtomicOrdering AO);
3270+
InsertPointOrErrorTy createAtomicRead(const LocationDescription &Loc,
3271+
AtomicOpValue &X, AtomicOpValue &V,
3272+
AtomicOrdering AO);
32743273

32753274
/// Emit atomic write for : X = Expr --- Only Scalar data types.
32763275
///
@@ -3281,9 +3280,10 @@ class OpenMPIRBuilder {
32813280
/// instructions.
32823281
///
32833282
/// \return Insertion point after generated atomic Write IR.
3284-
InsertPointTy createAtomicWrite(const LocationDescription &Loc,
3285-
AtomicOpValue &X, Value *Expr,
3286-
AtomicOrdering AO);
3283+
InsertPointOrErrorTy createAtomicWrite(const LocationDescription &Loc,
3284+
InsertPointTy AllocaIP,
3285+
AtomicOpValue &X, Value *Expr,
3286+
AtomicOrdering AO);
32873287

32883288
/// Emit atomic update for constructs: X = X BinOp Expr ,or X = Expr BinOp X
32893289
/// For complex Operations: X = UpdateOp(X) => CmpExch X, old_X, UpdateOp(X)
@@ -3392,18 +3392,17 @@ class OpenMPIRBuilder {
33923392
/// the case the comparison is '=='.
33933393
///
33943394
/// \return Insertion point after generated atomic capture IR.
3395-
InsertPointTy
3396-
createAtomicCompare(const LocationDescription &Loc, AtomicOpValue &X,
3397-
AtomicOpValue &V, AtomicOpValue &R, Value *E, Value *D,
3398-
AtomicOrdering AO, omp::OMPAtomicCompareOp Op,
3399-
bool IsXBinopExpr, bool IsPostfixUpdate, bool IsFailOnly);
3400-
InsertPointTy createAtomicCompare(const LocationDescription &Loc,
3401-
AtomicOpValue &X, AtomicOpValue &V,
3402-
AtomicOpValue &R, Value *E, Value *D,
3403-
AtomicOrdering AO,
3404-
omp::OMPAtomicCompareOp Op,
3405-
bool IsXBinopExpr, bool IsPostfixUpdate,
3406-
bool IsFailOnly, AtomicOrdering Failure);
3395+
InsertPointOrErrorTy
3396+
createAtomicCompare(const LocationDescription &Loc, InsertPointTy AllocaIP,
3397+
AtomicOpValue &X, AtomicOpValue &V, AtomicOpValue &R,
3398+
Value *E, Value *D, AtomicOrdering AO,
3399+
omp::OMPAtomicCompareOp Op, bool IsXBinopExpr,
3400+
bool IsPostfixUpdate, bool IsFailOnly);
3401+
InsertPointOrErrorTy createAtomicCompare(
3402+
const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X,
3403+
AtomicOpValue &V, AtomicOpValue &R, Value *E, Value *D, AtomicOrdering AO,
3404+
omp::OMPAtomicCompareOp Op, bool IsXBinopExpr, bool IsPostfixUpdate,
3405+
bool IsFailOnly, AtomicOrdering Failure);
34073406

34083407
/// Create the control flow structure of a canonical OpenMP loop.
34093408
///

llvm/include/llvm/Support/AtomicOrdering.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,28 @@ inline AtomicOrderingCABI toCABI(AtomicOrdering AO) {
158158
return lookup[static_cast<size_t>(AO)];
159159
}
160160

161+
inline AtomicOrdering fromCABI(AtomicOrderingCABI AO) {
162+
// Acquire is the the closest but still stronger ordering of consume.
163+
static const AtomicOrdering lookup[8] = {
164+
/* relaxed */ AtomicOrdering::Monotonic,
165+
/* consume */ AtomicOrdering::Acquire,
166+
/* acquire */ AtomicOrdering::Acquire,
167+
/* release */ AtomicOrdering::Release,
168+
/* acq_rel */ AtomicOrdering::AcquireRelease,
169+
/* acq_seq */ AtomicOrdering::SequentiallyConsistent,
170+
};
171+
return lookup[static_cast<size_t>(AO)];
172+
}
173+
174+
inline AtomicOrdering fromCABI(int64_t AO) {
175+
if (!isValidAtomicOrderingCABI(AO)) {
176+
// This fallback is what CGAtomic does
177+
return AtomicOrdering::Monotonic;
178+
}
179+
assert(isValidAtomicOrderingCABI(AO));
180+
return fromCABI(static_cast<AtomicOrderingCABI>(AO));
181+
}
182+
161183
} // end namespace llvm
162184

163185
#endif // LLVM_SUPPORT_ATOMICORDERING_H

0 commit comments

Comments
 (0)