Skip to content

Commit 3cfa870

Browse files
committed
[flang][OpenMP] Extend locality spec to OMP claues (init and dealloc regions)
Extends support for locality specifier to OpenMP translation by adding supprot for transling localizers that have `init` and `dealloc` regions.
1 parent e44a65e commit 3cfa870

File tree

2 files changed

+76
-4
lines changed

2 files changed

+76
-4
lines changed

flang/lib/Optimizer/OpenMP/DoConcurrentConversion.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,16 +326,37 @@ class DoConcurrentConversion
326326
TODO(localizer.getLoc(),
327327
"local_init conversion is not supported yet");
328328

329-
if (!localizer.getInitRegion().empty())
330-
TODO(localizer.getLoc(),
331-
"non-empty `init` regions are not supported yet");
332-
333329
auto oldIP = rewriter.saveInsertionPoint();
334330
rewriter.setInsertionPointAfter(localizer);
335331
auto privatizer = rewriter.create<mlir::omp::PrivateClauseOp>(
336332
localizer.getLoc(), sym.getLeafReference().str() + ".omp",
337333
localizer.getTypeAttr().getValue(),
338334
mlir::omp::DataSharingClauseType::Private);
335+
336+
if (!localizer.getInitRegion().empty()) {
337+
rewriter.cloneRegionBefore(localizer.getInitRegion(),
338+
privatizer.getInitRegion(),
339+
privatizer.getInitRegion().begin());
340+
auto firYield = mlir::cast<fir::YieldOp>(
341+
privatizer.getInitRegion().back().getTerminator());
342+
rewriter.setInsertionPoint(firYield);
343+
rewriter.create<mlir::omp::YieldOp>(firYield.getLoc(),
344+
firYield.getOperands());
345+
rewriter.eraseOp(firYield);
346+
}
347+
348+
if (!localizer.getDeallocRegion().empty()) {
349+
rewriter.cloneRegionBefore(localizer.getDeallocRegion(),
350+
privatizer.getDeallocRegion(),
351+
privatizer.getDeallocRegion().begin());
352+
auto firYield = mlir::cast<fir::YieldOp>(
353+
privatizer.getDeallocRegion().back().getTerminator());
354+
rewriter.setInsertionPoint(firYield);
355+
rewriter.create<mlir::omp::YieldOp>(firYield.getLoc(),
356+
firYield.getOperands());
357+
rewriter.eraseOp(firYield);
358+
}
359+
339360
rewriter.restoreInsertionPoint(oldIP);
340361

341362
wsloopClauseOps.privateVars.push_back(op);
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Tests mapping `local` locality specifier to `private` clauses for non-empty
2+
// `init` and `dealloc` regions.
3+
4+
// RUN: fir-opt --omp-do-concurrent-conversion="map-to=host" %s | FileCheck %s
5+
6+
func.func @my_allocator() {
7+
return
8+
}
9+
10+
func.func @my_deallocator() {
11+
return
12+
}
13+
14+
fir.local {type = local} @_QFlocal_assocEaa_private_box_10xf32 : !fir.box<!fir.array<10xf32>> init {
15+
^bb0(%arg0: !fir.ref<!fir.box<!fir.array<10xf32>>>, %arg1: !fir.ref<!fir.box<!fir.array<10xf32>>>):
16+
fir.call @my_allocator() : () -> ()
17+
fir.yield(%arg1 : !fir.ref<!fir.box<!fir.array<10xf32>>>)
18+
} dealloc {
19+
^bb0(%arg0: !fir.ref<!fir.box<!fir.array<10xf32>>>):
20+
fir.call @my_deallocator() : () -> ()
21+
fir.yield
22+
}
23+
24+
func.func @_QPlocal_assoc() {
25+
%0 = fir.alloca !fir.box<!fir.array<10xf32>>
26+
%c1 = arith.constant 1 : index
27+
28+
fir.do_concurrent {
29+
%9 = fir.alloca i32 {bindc_name = "i"}
30+
%10:2 = hlfir.declare %9 {uniq_name = "_QFlocal_assocEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
31+
fir.do_concurrent.loop (%arg0) = (%c1) to (%c1) step (%c1) local(@_QFlocal_assocEaa_private_box_10xf32 %0 -> %arg1 : !fir.ref<!fir.box<!fir.array<10xf32>>>) {
32+
%11 = fir.convert %arg0 : (index) -> i32
33+
fir.store %11 to %10#0 : !fir.ref<i32>
34+
}
35+
}
36+
37+
return
38+
}
39+
40+
// CHECK: omp.private {type = private} @[[PRIVATIZER:.*]] : !fir.box<!fir.array<10xf32>> init {
41+
// CHECK-NEXT: ^bb0(%{{.*}}: !{{.*}}, %{{.*}}: !{{.*}}):
42+
// CHECK-NEXT: fir.call @my_allocator() : () -> ()
43+
// CHECK-NEXT: omp.yield(%{{.*}})
44+
// CHECK-NEXT: } dealloc {
45+
// CHECK-NEXT: ^bb0(%{{.*}}: !{{.*}}):
46+
// CHECK-NEXT: fir.call @my_deallocator() : () -> ()
47+
// CHECK-NEXT: omp.yield
48+
// CHECK-NEXT: }
49+
50+
// CHECK: %[[LOCAL_ALLOC:.*]] = fir.alloca !fir.box<!fir.array<10xf32>>
51+
// CHECK: omp.wsloop private(@[[PRIVATIZER]] %[[LOCAL_ALLOC]] -> %{{.*}} : !{{.*}})

0 commit comments

Comments
 (0)