Skip to content

Commit eba63cd

Browse files
authored
[flang][OpenMP] Improve handling of REQUIRES ATOMIC_DEFAULT_MEM_ORDER (#143917)
According to OpenMP 5.0 rules, the ACQ_REL ordering coming from a REQUIRES directive may need to be replaced with ACQUIRE or RELEASE depending on the directive in the ATOMIC construct. This was not done, leading to an incorrect "memory-order" clause appearing in the generated HLFIR. This may need to be relaxed a bit to fully comply with later spec versions, that will be done in a future PR.
1 parent 3ea45a6 commit eba63cd

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

flang/lib/Semantics/rewrite-directives.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,22 @@ bool OmpRewriteMutator::Pre(parser::OpenMPAtomicConstruct &x) {
112112

113113
// Add a memory order clause to the atomic directive.
114114
atomicDirectiveDefaultOrderFound_ = true;
115+
llvm::omp::Clause kind{x.GetKind()};
115116
switch (*defaultMemOrder) {
116117
case common::OmpMemoryOrderType::Acq_Rel:
117-
clauseList->v.emplace_back(parser::OmpClause{parser::OmpClause::AcqRel{}});
118+
// FIXME: Implement 5.0 rules, pending clarification on later spec
119+
// versions.
120+
// [5.0:62:22-26]
121+
if (kind == llvm::omp::Clause::OMPC_read) {
122+
clauseList->v.emplace_back(
123+
parser::OmpClause{parser::OmpClause::Acquire{}});
124+
} else if (kind == llvm::omp::Clause::OMPC_update && x.IsCapture()) {
125+
clauseList->v.emplace_back(
126+
parser::OmpClause{parser::OmpClause::AcqRel{}});
127+
} else {
128+
clauseList->v.emplace_back(
129+
parser::OmpClause{parser::OmpClause::Release{}});
130+
}
118131
break;
119132
case common::OmpMemoryOrderType::Relaxed:
120133
clauseList->v.emplace_back(parser::OmpClause{parser::OmpClause::Relaxed{}});
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
!RUN: %flang_fc1 -emit-hlfir %openmp_flags -fopenmp-version=50 %s -o - | FileCheck %s
2+
3+
module m
4+
!$omp requires atomic_default_mem_order(acq_rel)
5+
6+
contains
7+
8+
!CHECK: %[[V:[0-9]+]]:2 = hlfir.declare {{.*}} {uniq_name = "_QMmFf00Ev"}
9+
!CHECK: %[[X:[0-9]+]]:2 = hlfir.declare {{.*}} {uniq_name = "_QMmFf00Ex"}
10+
!CHECK: omp.atomic.read %[[V]]#0 = %[[X]]#0 memory_order(acquire)
11+
!CHECK: omp.atomic.write %[[X]]#0 = %{{[0-9]+}} memory_order(release)
12+
13+
subroutine f00(x, v)
14+
integer :: x, v
15+
!$omp atomic read
16+
v = x
17+
18+
!$omp atomic write
19+
x = v
20+
end
21+
22+
end module

flang/test/Semantics/OpenMP/requires-atomic02.f90

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ program requires
1212

1313
! CHECK-LABEL: OpenMPAtomicConstruct
1414
! CHECK: OmpClause -> Read
15-
! CHECK: OmpClause -> AcqRel
15+
! CHECK: OmpClause -> Acquire
1616
!$omp atomic read
1717
i = j
1818

@@ -36,7 +36,7 @@ program requires
3636

3737
! CHECK-LABEL: OpenMPAtomicConstruct
3838
! CHECK: OmpClause -> Write
39-
! CHECK: OmpClause -> AcqRel
39+
! CHECK: OmpClause -> Release
4040
!$omp atomic write
4141
i = j
4242

@@ -60,7 +60,7 @@ program requires
6060

6161
! CHECK-LABEL: OpenMPAtomicConstruct
6262
! CHECK: OmpClause -> Update
63-
! CHECK: OmpClause -> AcqRel
63+
! CHECK: OmpClause -> Release
6464
!$omp atomic update
6565
i = i + j
6666

@@ -79,7 +79,7 @@ program requires
7979
i = i + j
8080

8181
! CHECK-LABEL: OpenMPAtomicConstruct
82-
! CHECK: OmpClause -> AcqRel
82+
! CHECK: OmpClause -> Release
8383
!$omp atomic
8484
i = i + j
8585

0 commit comments

Comments
 (0)