Skip to content

Commit ed20488

Browse files
bhandarkar-pranavgit-crd
authored andcommitted
[Flang][OpenMP] - Fix the mapping flags used on descriptors mapped by MapsForPrivatizedSymbolsPass (llvm#167554)
The descriptors of a variable that has been privatized should be mapped `tofrom` instead of `to`.
1 parent be1e788 commit ed20488

File tree

4 files changed

+32
-33
lines changed

4 files changed

+32
-33
lines changed

flang/lib/Optimizer/OpenMP/MapsForPrivatizedSymbols.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,21 +104,31 @@ class MapsForPrivatizedSymbolsPass
104104
llvm::SmallVector<mlir::Value> boundsOps;
105105
if (needsBoundsOps(varPtr))
106106
genBoundsOps(builder, varPtr, boundsOps);
107+
mlir::Type varType = varPtr.getType();
107108

108109
mlir::omp::VariableCaptureKind captureKind =
109110
mlir::omp::VariableCaptureKind::ByRef;
110-
if (fir::isa_trivial(fir::unwrapRefType(varPtr.getType())) ||
111-
fir::isa_char(fir::unwrapRefType(varPtr.getType()))) {
112-
if (canPassByValue(fir::unwrapRefType(varPtr.getType()))) {
111+
if (fir::isa_trivial(fir::unwrapRefType(varType)) ||
112+
fir::isa_char(fir::unwrapRefType(varType))) {
113+
if (canPassByValue(fir::unwrapRefType(varType))) {
113114
captureKind = mlir::omp::VariableCaptureKind::ByCopy;
114115
}
115116
}
116117

118+
// Use tofrom if what we are mapping is not a trivial type. In all
119+
// likelihood, it is a descriptor
120+
mlir::omp::ClauseMapFlags mapFlag;
121+
if (fir::isa_trivial(fir::unwrapRefType(varType)) ||
122+
fir::isa_char(fir::unwrapRefType(varType)))
123+
mapFlag = mlir::omp::ClauseMapFlags::to;
124+
else
125+
mapFlag = mlir::omp::ClauseMapFlags::to | mlir::omp::ClauseMapFlags::from;
126+
117127
return omp::MapInfoOp::create(
118-
builder, loc, varPtr.getType(), varPtr,
119-
TypeAttr::get(llvm::cast<omp::PointerLikeType>(varPtr.getType())
120-
.getElementType()),
121-
builder.getAttr<omp::ClauseMapFlagsAttr>(omp::ClauseMapFlags::to),
128+
builder, loc, varType, varPtr,
129+
TypeAttr::get(
130+
llvm::cast<omp::PointerLikeType>(varType).getElementType()),
131+
builder.getAttr<omp::ClauseMapFlagsAttr>(mapFlag),
122132
builder.getAttr<omp::VariableCaptureKindAttr>(captureKind),
123133
/*varPtrPtr=*/Value{},
124134
/*members=*/SmallVector<Value>{},

flang/test/Lower/OpenMP/DelayedPrivatization/target-private-allocatable.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ end subroutine target_allocatable
7272
! CPU-SAME: {bindc_name = "alloc_var", {{.*}}}
7373
! CPU: %[[VAR_DECL:.*]]:2 = hlfir.declare %[[VAR_ALLOC]]
7474
! CPU: %[[BASE_ADDR:.*]] = fir.box_offset %[[VAR_DECL]]#0 base_addr : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> [[MEMBER_TYPE:.*]]
75-
! CPU: %[[MEMBER:.*]] = omp.map.info var_ptr(%[[VAR_DECL]]#0 : [[TYPE]], i32) map_clauses(to) capture(ByRef) var_ptr_ptr(%[[BASE_ADDR]] : [[MEMBER_TYPE:.*]]) -> {{.*}}
75+
! CPU: %[[MEMBER:.*]] = omp.map.info var_ptr(%[[VAR_DECL]]#0 : [[TYPE]], i32) map_clauses(tofrom) capture(ByRef) var_ptr_ptr(%[[BASE_ADDR]] : [[MEMBER_TYPE:.*]]) -> {{.*}}
7676
! CPU: %[[MAP_VAR:.*]] = omp.map.info var_ptr(%[[VAR_DECL]]#0 : [[TYPE]], [[DESC_TYPE]]) map_clauses(to) capture(ByRef) members(%[[MEMBER]] : [0] : !fir.llvm_ptr<!fir.ref<i32>>) -> !fir.ref<!fir.box<!fir.heap<i32>>>
7777

7878
! CPU: omp.target map_entries(%[[MAP_VAR]] -> %arg0, %[[MEMBER]] -> %arg1 : [[TYPE]], [[MEMBER_TYPE]]) private(

flang/test/Lower/OpenMP/optional-argument-map-2.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ end module mod
7272
! CHECK-FPRIV: %[[VAL_13:.*]] = arith.subi %[[VAL_12]]#1, %[[VAL_11]] : index
7373
! CHECK-FPRIV: %[[VAL_14:.*]] = omp.map.bounds lower_bound(%[[VAL_10]] : index) upper_bound(%[[VAL_13]] : index) extent(%[[VAL_12]]#1 : index) stride(%[[VAL_11]] : index) start_idx(%[[VAL_10]] : index) {stride_in_bytes = true}
7474
! CHECK-FPRIV: %[[VAL_16:.*]] = fir.box_offset %[[VAL_0]] base_addr : (!fir.ref<!fir.boxchar<1>>) -> !fir.llvm_ptr<!fir.ref<!fir.char<1,?>>>
75-
! CHECK-FPRIV: %[[VAL_17:.*]] = omp.map.info var_ptr(%[[VAL_0]] : !fir.ref<!fir.boxchar<1>>, !fir.char<1,?>) map_clauses(to) capture(ByRef) var_ptr_ptr(%[[VAL_16]] : !fir.llvm_ptr<!fir.ref<!fir.char<1,?>>>) bounds(%[[VAL_14]]) -> !fir.llvm_ptr<!fir.ref<!fir.char<1,?>>> {name = ""}
75+
! CHECK-FPRIV: %[[VAL_17:.*]] = omp.map.info var_ptr(%[[VAL_0]] : !fir.ref<!fir.boxchar<1>>, !fir.char<1,?>) map_clauses(tofrom) capture(ByRef) var_ptr_ptr(%[[VAL_16]] : !fir.llvm_ptr<!fir.ref<!fir.char<1,?>>>) bounds(%[[VAL_14]]) -> !fir.llvm_ptr<!fir.ref<!fir.char<1,?>>> {name = ""}
7676
! CHECK-FPRIV: %[[VAL_18:.*]] = omp.map.info var_ptr(%[[VAL_0]] : !fir.ref<!fir.boxchar<1>>, !fir.boxchar<1>) map_clauses(to) capture(ByRef) members(%[[VAL_17]] : [0] : !fir.llvm_ptr<!fir.ref<!fir.char<1,?>>>) -> !fir.ref<!fir.boxchar<1>>
7777
! CHECK-FPRIV: omp.target map_entries(%[[VAL_7]] -> %[[VAL_19:.*]], %[[VAL_18]] -> %[[VAL_20:.*]], %[[VAL_17]] -> %[[VAL_21:.*]] : !fir.ref<!fir.char<1,4>>, !fir.ref<!fir.boxchar<1>>, !fir.llvm_ptr<!fir.ref<!fir.char<1,?>>>) private(@_QMmodFroutine_boxcharEa_firstprivate_boxchar_c8xU %[[VAL_3]]#0 -> %[[VAL_22:.*]] [map_idx=1] : !fir.boxchar<1>) {
7878
! CHECK-FPRIV: %[[VAL_23:.*]] = arith.constant 4 : index

flang/test/Transforms/omp-maps-for-privatized-symbols.fir

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ module attributes {omp.is_target_device = false} {
66
// extract box address, see if it is null, etc
77
omp.yield(%arg1: !fir.ref<!fir.box<!fir.heap<i32>>>)
88
}
9-
9+
omp.private {type = firstprivate} @_QFtarget_simpleEfp_int_firstprivate_i32 : i32 copy {
10+
^bb0(%arg0: !fir.ref<i32>, %arg1: !fir.ref<i32>):
11+
%0 = fir.load %arg0 : !fir.ref<i32>
12+
hlfir.assign %0 to %arg1 : i32, !fir.ref<i32>
13+
omp.yield(%arg1 : !fir.ref<i32>)
14+
}
1015
func.func @_QPtarget_simple() {
1116
%0 = fir.alloca i32 {bindc_name = "a", uniq_name = "_QFtarget_simpleEa"}
1217
%1:2 = hlfir.declare %0 {uniq_name = "_QFtarget_simpleEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
@@ -15,34 +20,18 @@ module attributes {omp.is_target_device = false} {
1520
%4 = fir.embox %3 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
1621
fir.store %4 to %2 : !fir.ref<!fir.box<!fir.heap<i32>>>
1722
%5:2 = hlfir.declare %2 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtarget_simpleEsimple_var"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
23+
%6 = fir.alloca i32 {bindc_name = "fp_int", uniq_name = "_QFtarget_simpleEfp_int"}
24+
%7:2 = hlfir.declare %6 {uniq_name = "_QFtarget_simpleEfp_int"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1825
%c2_i32 = arith.constant 2 : i32
1926
hlfir.assign %c2_i32 to %1#0 : i32, !fir.ref<i32>
20-
%6 = omp.map.info var_ptr(%1#1 : !fir.ref<i32>, i32) map_clauses(to) capture(ByRef) -> !fir.ref<i32> {name = "a"}
21-
omp.target map_entries(%6 -> %arg0 : !fir.ref<i32>) private(@_QFtarget_simpleEsimple_var_private_ref_box_heap_i32 %5#0 -> %arg1 : !fir.ref<!fir.box<!fir.heap<i32>>>) {
22-
%11:2 = hlfir.declare %arg0 {uniq_name = "_QFtarget_simpleEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
23-
%12:2 = hlfir.declare %arg1 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtarget_simpleEsimple_var"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
24-
%c10_i32 = arith.constant 10 : i32
25-
%13 = fir.load %11#0 : !fir.ref<i32>
26-
%14 = arith.addi %c10_i32, %13 : i32
27-
hlfir.assign %14 to %12#0 realloc : i32, !fir.ref<!fir.box<!fir.heap<i32>>>
27+
%8 = omp.map.info var_ptr(%1#1 : !fir.ref<i32>, i32) map_clauses(to) capture(ByRef) -> !fir.ref<i32> {name = "a"}
28+
omp.target map_entries(%8 -> %arg0 : !fir.ref<i32>) private(@_QFtarget_simpleEsimple_var_private_ref_box_heap_i32 %5#0 -> %arg1, @_QFtarget_simpleEfp_int_firstprivate_i32 %7#0 -> %arg2 : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<i32>) {
2829
omp.terminator
2930
}
30-
%7 = fir.load %5#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
31-
%8 = fir.box_addr %7 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
32-
%9 = fir.convert %8 : (!fir.heap<i32>) -> i64
33-
%c0_i64 = arith.constant 0 : i64
34-
%10 = arith.cmpi ne, %9, %c0_i64 : i64
35-
fir.if %10 {
36-
%11 = fir.load %5#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
37-
%12 = fir.box_addr %11 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
38-
fir.freemem %12 : !fir.heap<i32>
39-
%13 = fir.zero_bits !fir.heap<i32>
40-
%14 = fir.embox %13 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
41-
fir.store %14 to %5#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
42-
}
4331
return
4432
}
4533
}
4634
// CHECK: %[[MAP0:.*]] = omp.map.info var_ptr({{.*}} : !fir.ref<i32>, i32) map_clauses(to) capture(ByRef) -> !fir.ref<i32> {name = "a"}
47-
// CHECK: %[[MAP1:.*]] = omp.map.info var_ptr({{.*}} : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.box<!fir.heap<i32>>) map_clauses(to) capture(ByRef) -> !fir.ref<!fir.box<!fir.heap<i32>>>
48-
// CHECK: omp.target map_entries(%[[MAP0]] -> %arg0, %[[MAP1]] -> %arg1 : !fir.ref<i32>, !fir.ref<!fir.box<!fir.heap<i32>>>)
35+
// CHECK: %[[MAP1:.*]] = omp.map.info var_ptr({{.*}} : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.box<!fir.heap<i32>>) map_clauses(tofrom) capture(ByRef) -> !fir.ref<!fir.box<!fir.heap<i32>>>
36+
// CHECK: %[[MAP2:.*]] = omp.map.info var_ptr({{.*}} : !fir.ref<i32>, i32) map_clauses(to) capture(ByCopy) -> !fir.ref<i32>
37+
// CHECK: omp.target map_entries(%[[MAP0]] -> %arg0, %[[MAP1]] -> %arg1, %[[MAP2]] -> %arg2 : !fir.ref<i32>, !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<i32>)

0 commit comments

Comments
 (0)