Skip to content

Commit abdd453

Browse files
authored
[flang][openacc] fix bugs with default(none) checking (#149220)
A report of the following code not generating an error led to fixing two bugs in directive checking. - We should treat CombinedConstructs as OpenACC Constructs - We should treat DoConstruct index variables as private. ```fortran subroutine sub(nn) integer :: nn, ii !$acc serial loop default(none) do ii = 1, nn end do !$acc end serial loop end subroutine ``` Here `nn` should be flagged as needing a data clause while `ii` should still get one implicitly.
1 parent b6ea04a commit abdd453

File tree

3 files changed

+32
-7
lines changed

3 files changed

+32
-7
lines changed

flang/lib/Semantics/resolve-directives.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ class AccAttributeVisitor : DirectiveAttributeVisitor<llvm::acc::Directive> {
138138
void Post(const parser::OpenACCBlockConstruct &) { PopContext(); }
139139
bool Pre(const parser::OpenACCCombinedConstruct &);
140140
void Post(const parser::OpenACCCombinedConstruct &) { PopContext(); }
141+
void Post(const parser::AccBeginCombinedDirective &) {
142+
GetContext().withinConstruct = true;
143+
}
141144

142145
bool Pre(const parser::OpenACCDeclarativeConstruct &);
143146
void Post(const parser::OpenACCDeclarativeConstruct &) { PopContext(); }
@@ -160,6 +163,18 @@ class AccAttributeVisitor : DirectiveAttributeVisitor<llvm::acc::Directive> {
160163
GetContext().withinConstruct = true;
161164
}
162165

166+
// TODO: We should probably also privatize ConcurrentBounds.
167+
template <typename A>
168+
bool Pre(const parser::LoopBounds<parser::ScalarName, A> &x) {
169+
if (!dirContext_.empty() && GetContext().withinConstruct) {
170+
if (auto *symbol{ResolveAcc(
171+
x.name.thing, Symbol::Flag::AccPrivate, currScope())}) {
172+
AddToContextObjectWithDSA(*symbol, Symbol::Flag::AccPrivate);
173+
}
174+
}
175+
return true;
176+
}
177+
163178
bool Pre(const parser::OpenACCStandaloneConstruct &);
164179
void Post(const parser::OpenACCStandaloneConstruct &) { PopContext(); }
165180
void Post(const parser::AccStandaloneDirective &) {

flang/test/Lower/OpenACC/acc-loop.f90

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -372,12 +372,15 @@ subroutine sub1(i, j, k)
372372
end subroutine
373373

374374
! CHECK: func.func @_QPsub1
375-
! CHECK: acc.parallel
376-
! CHECK: %[[DC_K:.*]] = fir.alloca i32 {bindc_name = "k"}
377-
! CHECK: %[[DC_J:.*]] = fir.alloca i32 {bindc_name = "j"}
378-
! CHECK: %[[DC_I:.*]] = fir.alloca i32 {bindc_name = "i"}
379-
! CHECK: %[[P_I:.*]] = acc.private varPtr(%[[DC_I]] : !fir.ref<i32>) -> !fir.ref<i32> {implicit = true, name = "i"}
380-
! CHECK: %[[P_J:.*]] = acc.private varPtr(%[[DC_J]] : !fir.ref<i32>) -> !fir.ref<i32> {implicit = true, name = "j"}
381-
! CHECK: %[[P_K:.*]] = acc.private varPtr(%[[DC_K]] : !fir.ref<i32>) -> !fir.ref<i32> {implicit = true, name = "k"}
375+
! CHECK-SAME: %[[ARG_I:.*]]: !fir.ref<i32> {fir.bindc_name = "i"}
376+
! CHECK-SAME: %[[ARG_J:.*]]: !fir.ref<i32> {fir.bindc_name = "j"}
377+
! CHECK-SAME: %[[ARG_K:.*]]: !fir.ref<i32> {fir.bindc_name = "k"}
378+
! CHECK: %[[DC_I:.*]]:2 = hlfir.declare %[[ARG_I]] dummy_scope %0
379+
! CHECK: %[[DC_J:.*]]:2 = hlfir.declare %[[ARG_J]] dummy_scope %0
380+
! CHECK: %[[DC_K:.*]]:2 = hlfir.declare %[[ARG_K]] dummy_scope %0
381+
! CHECK: acc.parallel combined(loop)
382+
! CHECK: %[[P_I:.*]] = acc.private varPtr(%[[DC_I]]#0 : !fir.ref<i32>) -> !fir.ref<i32> {implicit = true, name = "i"}
383+
! CHECK: %[[P_J:.*]] = acc.private varPtr(%[[DC_J]]#0 : !fir.ref<i32>) -> !fir.ref<i32> {implicit = true, name = "j"}
384+
! CHECK: %[[P_K:.*]] = acc.private varPtr(%[[DC_K]]#0 : !fir.ref<i32>) -> !fir.ref<i32> {implicit = true, name = "k"}
382385
! CHECK: acc.loop combined(parallel) private(@privatization_ref_i32 -> %[[P_I]] : !fir.ref<i32>, @privatization_ref_i32 -> %[[P_J]] : !fir.ref<i32>, @privatization_ref_i32 -> %[[P_K]] : !fir.ref<i32>) control(%{{.*}} : i32, %{{.*}} : i32, %{{.*}} : i32) = (%c1{{.*}}, %c1{{.*}}, %c1{{.*}} : i32, i32, i32) to (%c10{{.*}}, %c100{{.*}}, %c200{{.*}} : i32, i32, i32) step (%c1{{.*}}, %c1{{.*}}, %c1{{.*}} : i32, i32, i32)
383386
! CHECK: } attributes {inclusiveUpperbound = array<i1: true, true, true>, independent = [#acc.device_type<none>]}

flang/test/Semantics/OpenACC/acc-kernels-loop.f90

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,15 @@ program openacc_kernels_loop_validity
243243
a(i) = 3.14
244244
end do
245245

246+
!$acc kernels loop default(none) private(N, a)
247+
do i = 1, N
248+
a(i) = 3.14
249+
end do
250+
246251
!$acc kernels loop default(none)
252+
!ERROR: The DEFAULT(NONE) clause requires that 'n' must be listed in a data-mapping clause
247253
do i = 1, N
254+
!ERROR: The DEFAULT(NONE) clause requires that 'a' must be listed in a data-mapping clause
248255
a(i) = 3.14
249256
end do
250257

0 commit comments

Comments
 (0)