Skip to content

Commit 822032d

Browse files
agozillonTIFitis
authored andcommitted
[OpenMP][MLIR] Descriptor explicit member map lowering changes
llvm#96265 changes are required for this to work.
1 parent 24980a6 commit 822032d

File tree

2 files changed

+78
-43
lines changed

2 files changed

+78
-43
lines changed

mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp

+37-12
Original file line numberDiff line numberDiff line change
@@ -2497,10 +2497,13 @@ static llvm::omp::OpenMPOffloadMappingFlags mapParentWithMembers(
24972497
mlir::dyn_cast<mlir::omp::MapInfoOp>(mapData.MapClause[mapDataIndex]);
24982498
int firstMemberIdx = getMapDataMemberIdx(
24992499
mapData, getFirstOrLastMappedMemberPtr(mapOp, true));
2500-
lowAddr = builder.CreatePointerCast(mapData.Pointers[firstMemberIdx],
2501-
builder.getPtrTy());
25022500
int lastMemberIdx = getMapDataMemberIdx(
25032501
mapData, getFirstOrLastMappedMemberPtr(mapOp, false));
2502+
2503+
// NOTE/TODO: Should perhaps use OriginalValue here instead of Pointers to
2504+
// avoid offset or any manipulations interfering with the calculation.
2505+
lowAddr = builder.CreatePointerCast(mapData.Pointers[firstMemberIdx],
2506+
builder.getPtrTy());
25042507
highAddr = builder.CreatePointerCast(
25052508
builder.CreateGEP(mapData.BaseType[lastMemberIdx],
25062509
mapData.Pointers[lastMemberIdx], builder.getInt64(1)),
@@ -2514,17 +2517,8 @@ static llvm::omp::OpenMPOffloadMappingFlags mapParentWithMembers(
25142517
/*isSigned=*/false);
25152518
combinedInfo.Sizes.push_back(size);
25162519

2517-
// TODO: This will need to be expanded to include the whole host of logic for
2518-
// the map flags that Clang currently supports (e.g. it should take the map
2519-
// flag of the parent map flag, remove the OMP_MAP_TARGET_PARAM and do some
2520-
// further case specific flag modifications). For the moment, it handles what
2521-
// we support as expected.
2522-
llvm::omp::OpenMPOffloadMappingFlags mapFlag =
2523-
llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
2524-
25252520
llvm::omp::OpenMPOffloadMappingFlags memberOfFlag =
25262521
ompBuilder.getMemberOfFlag(combinedInfo.BasePointers.size() - 1);
2527-
ompBuilder.setCorrectMemberOfFlag(mapFlag, memberOfFlag);
25282522

25292523
// This creates the initial MEMBER_OF mapping that consists of
25302524
// the parent/top level container (same as above effectively, except
@@ -2533,6 +2527,12 @@ static llvm::omp::OpenMPOffloadMappingFlags mapParentWithMembers(
25332527
// only relevant if the structure in its totality is being mapped,
25342528
// otherwise the above suffices.
25352529
if (!parentClause.getPartialMap()) {
2530+
// TODO: This will need to be expanded to include the whole host of logic
2531+
// for the map flags that Clang currently supports (e.g. it should do some
2532+
// further case specific flag modifications). For the moment, it handles
2533+
// what we support as expected.
2534+
llvm::omp::OpenMPOffloadMappingFlags mapFlag = mapData.Types[mapDataIndex];
2535+
ompBuilder.setCorrectMemberOfFlag(mapFlag, memberOfFlag);
25362536
combinedInfo.Types.emplace_back(mapFlag);
25372537
combinedInfo.DevicePointers.emplace_back(
25382538
llvm::OpenMPIRBuilder::DeviceInfoTy::None);
@@ -2583,6 +2583,24 @@ static void processMapMembersWithParent(
25832583

25842584
assert(memberDataIdx >= 0 && "could not find mapped member of structure");
25852585

2586+
if (checkIfPointerMap(memberClause)) {
2587+
auto mapFlag = llvm::omp::OpenMPOffloadMappingFlags(
2588+
memberClause.getMapType().value());
2589+
mapFlag &= ~llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TARGET_PARAM;
2590+
mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_MEMBER_OF;
2591+
ompBuilder.setCorrectMemberOfFlag(mapFlag, memberOfFlag);
2592+
combinedInfo.Types.emplace_back(mapFlag);
2593+
combinedInfo.DevicePointers.emplace_back(
2594+
llvm::OpenMPIRBuilder::DeviceInfoTy::None);
2595+
combinedInfo.Names.emplace_back(
2596+
LLVM::createMappingInformation(memberClause.getLoc(), ompBuilder));
2597+
combinedInfo.BasePointers.emplace_back(
2598+
mapData.BasePointers[mapDataIndex]);
2599+
combinedInfo.Pointers.emplace_back(mapData.BasePointers[memberDataIdx]);
2600+
combinedInfo.Sizes.emplace_back(builder.getInt64(
2601+
moduleTranslation.getLLVMModule()->getDataLayout().getPointerSize()));
2602+
}
2603+
25862604
// Same MemberOfFlag to indicate its link with parent and other members
25872605
// of.
25882606
auto mapFlag =
@@ -2598,7 +2616,14 @@ static void processMapMembersWithParent(
25982616
mapData.DevicePointers[memberDataIdx]);
25992617
combinedInfo.Names.emplace_back(
26002618
LLVM::createMappingInformation(memberClause.getLoc(), ompBuilder));
2601-
combinedInfo.BasePointers.emplace_back(mapData.BasePointers[mapDataIndex]);
2619+
2620+
if (checkIfPointerMap(memberClause))
2621+
combinedInfo.BasePointers.emplace_back(
2622+
mapData.BasePointers[memberDataIdx]);
2623+
else
2624+
combinedInfo.BasePointers.emplace_back(
2625+
mapData.BasePointers[mapDataIndex]);
2626+
26022627
combinedInfo.Pointers.emplace_back(mapData.Pointers[memberDataIdx]);
26032628
combinedInfo.Sizes.emplace_back(mapData.Sizes[memberDataIdx]);
26042629
}

mlir/test/Target/LLVMIR/omptarget-fortran-allocatable-types-host.mlir

+41-31
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s
22

33
// This test checks the offload sizes, map types and base pointers and pointers
4-
// provided to the OpenMP kernel argument structure are correct when lowering
5-
// to LLVM-IR from MLIR when a fortran allocatable descriptor type is provided
6-
// alongside the omp.map.info, the test utilises mapping of array sections,
4+
// provided to the OpenMP kernel argument structure are correct when lowering
5+
// to LLVM-IR from MLIR when a fortran allocatable descriptor type is provided
6+
// alongside the omp.map.info, the test utilises mapping of array sections,
77
// full arrays and individual allocated scalars.
88

99
module attributes {omp.is_target_device = false} {
@@ -60,9 +60,9 @@ module attributes {omp.is_target_device = false} {
6060

6161
// CHECK: @[[FULL_ARR_GLOB:.*]] = internal global { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] } undef
6262
// CHECK: @[[ARR_SECT_GLOB:.*]] = internal global { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] } undef
63-
// CHECK: @.offload_sizes = private unnamed_addr constant [9 x i64] [i64 0, i64 48, i64 0, i64 0, i64 48, i64 0, i64 0, i64 24, i64 4]
64-
// CHECK: @.offload_maptypes = private unnamed_addr constant [9 x i64] [i64 32, i64 281474976710657, i64 281474976710675, i64 32, i64 1125899906842625, i64 1125899906842643, i64 32, i64 1970324836974593, i64 1970324836974611]
65-
// CHECK: @.offload_mapnames = private constant [9 x ptr] [ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}]
63+
// CHECK: @.offload_sizes = private unnamed_addr constant [12 x i64] [i64 0, i64 48, i64 8, i64 0, i64 0, i64 48, i64 8, i64 0, i64 0, i64 24, i64 8, i64 4]
64+
// CHECK: @.offload_maptypes = private unnamed_addr constant [12 x i64] [i64 32, i64 281474976710659, i64 281474976710659, i64 281474976710675, i64 32, i64 1407374883553283, i64 1407374883553283, i64 1407374883553299, i64 32, i64 2533274790395907, i64 2533274790395907, i64 2533274790395923]
65+
// CHECK: @.offload_mapnames = private constant [12 x ptr] [ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}]
6666

6767
// CHECK: define void @_QQmain()
6868
// CHECK: %[[SCALAR_ALLOCA:.*]] = alloca { ptr, i64, i32, i8, i8, i8, i8 }, i64 1, align 8
@@ -94,53 +94,63 @@ module attributes {omp.is_target_device = false} {
9494
// CHECK: %[[SCALAR_DESC_SZ1:.*]] = sub i64 %[[SCALAR_DESC_SZ3]], %[[SCALAR_DESC_SZ2]]
9595
// CHECK: %[[SCALAR_DESC_SZ:.*]] = sdiv exact i64 %[[SCALAR_DESC_SZ1]], ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)
9696

97-
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 0
97+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 0
9898
// CHECK: store ptr @_QFEfull_arr, ptr %[[OFFLOADBASEPTRS]], align 8
99-
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 0
99+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 0
100100
// CHECK: store ptr @_QFEfull_arr, ptr %[[OFFLOADPTRS]], align 8
101-
102-
// CHECK: %[[OFFLOADSIZES:.*]] = getelementptr inbounds [9 x i64], ptr %.offload_sizes, i32 0, i32 0
101+
// CHECK: %[[OFFLOADSIZES:.*]] = getelementptr inbounds [12 x i64], ptr %.offload_sizes, i32 0, i32 0
103102
// CHECK: store i64 %[[FULL_ARR_DESC_SIZE]], ptr %[[OFFLOADSIZES]], align 8
104-
105-
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 1
103+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 1
104+
// CHECK: store ptr @_QFEfull_arr, ptr %[[OFFLOADBASEPTRS]], align 8
105+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 1
106+
// CHECK: store ptr @_QFEfull_arr, ptr %[[OFFLOADPTRS]], align 8
107+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 2
106108
// CHECK: store ptr @_QFEfull_arr, ptr %[[OFFLOADBASEPTRS]], align 8
107-
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 1
109+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 2
108110
// CHECK: store ptr @_QFEfull_arr, ptr %[[OFFLOADPTRS]], align 8
109-
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 2
111+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 3
110112
// CHECK: store ptr @_QFEfull_arr, ptr %[[OFFLOADBASEPTRS]], align 8
111-
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 2
113+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 3
112114
// CHECK: store ptr %[[FULL_ARR_PTR]], ptr %[[OFFLOADPTRS]], align 8
113-
// CHECK: %[[OFFLOADSIZES:.*]] = getelementptr inbounds [9 x i64], ptr %.offload_sizes, i32 0, i32 2
115+
// CHECK: %[[OFFLOADSIZES:.*]] = getelementptr inbounds [12 x i64], ptr %.offload_sizes, i32 0, i32 3
114116
// CHECK: store i64 %[[FULL_ARR_SIZE]], ptr %[[OFFLOADSIZES]], align 8
115117

116-
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 3
118+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 4
117119
// CHECK: store ptr @_QFEsect_arr, ptr %[[OFFLOADBASEPTRS]], align 8
118-
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 3
120+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 4
119121
// CHECK: store ptr @_QFEsect_arr, ptr %[[OFFLOADPTRS]], align 8
120-
// CHECK: %[[OFFLOADSIZES:.*]] = getelementptr inbounds [9 x i64], ptr %.offload_sizes, i32 0, i32 3
122+
// CHECK: %[[OFFLOADSIZES:.*]] = getelementptr inbounds [12 x i64], ptr %.offload_sizes, i32 0, i32 4
121123
// CHECK: store i64 %[[ARR_SECT_DESC_SIZE]], ptr %[[OFFLOADSIZES]], align 8
122-
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 4
124+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 5
125+
// CHECK: store ptr @_QFEsect_arr, ptr %[[OFFLOADBASEPTRS]], align 8
126+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 5
127+
// CHECK: store ptr @_QFEsect_arr, ptr %[[OFFLOADPTRS]], align 8
128+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 6
123129
// CHECK: store ptr @_QFEsect_arr, ptr %[[OFFLOADBASEPTRS]], align 8
124-
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 4
130+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 6
125131
// CHECK: store ptr @_QFEsect_arr, ptr %[[OFFLOADPTRS]], align 8
126-
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 5
132+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 7
127133
// CHECK: store ptr @_QFEsect_arr, ptr %[[OFFLOADBASEPTRS]], align 8
128-
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 5
134+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 7
129135
// CHECK: store ptr %[[ARR_SECT_PTR]], ptr %[[OFFLOADPTRS]], align 8
130-
// CHECK: %[[OFFLOADSIZES:.*]] = getelementptr inbounds [9 x i64], ptr %.offload_sizes, i32 0, i32 5
136+
// CHECK: %[[OFFLOADSIZES:.*]] = getelementptr inbounds [12 x i64], ptr %.offload_sizes, i32 0, i32 7
131137
// CHECK: store i64 %[[ARR_SECT_SIZE]], ptr %[[OFFLOADSIZES]], align 8
132138

133-
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 6
139+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 8
134140
// CHECK: store ptr %[[SCALAR_ALLOCA]], ptr %[[OFFLOADBASEPTRS]], align 8
135-
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 6
141+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 8
136142
// CHECK: store ptr %[[SCALAR_ALLOCA]], ptr %[[OFFLOADPTRS]], align 8
137-
// CHECK: %[[OFFLOADSIZES:.*]] = getelementptr inbounds [9 x i64], ptr %.offload_sizes, i32 0, i32 6
143+
// CHECK: %[[OFFLOADSIZES:.*]] = getelementptr inbounds [12 x i64], ptr %.offload_sizes, i32 0, i32 8
138144
// CHECK: store i64 %[[SCALAR_DESC_SZ]], ptr %[[OFFLOADSIZES]], align 8
139-
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 7
145+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 9
140146
// CHECK: store ptr %[[SCALAR_ALLOCA]], ptr %[[OFFLOADBASEPTRS]], align 8
141-
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 7
147+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 9
142148
// CHECK: store ptr %[[SCALAR_ALLOCA]], ptr %[[OFFLOADPTRS]], align 8
143-
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 8
149+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 10
144150
// CHECK: store ptr %[[SCALAR_ALLOCA]], ptr %[[OFFLOADBASEPTRS]], align 8
145-
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 8
151+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 10
152+
// CHECK: store ptr %[[SCALAR_BASE]], ptr %[[OFFLOADPTRS]], align 8
153+
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_baseptrs, i32 0, i32 11
154+
// CHECK: store ptr %[[SCALAR_BASE]], ptr %[[OFFLOADBASEPTRS]], align 8
155+
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [12 x ptr], ptr %.offload_ptrs, i32 0, i32 11
146156
// CHECK: store ptr %[[SCALAR_PTR_LOAD]], ptr %[[OFFLOADPTRS]], align 8

0 commit comments

Comments
 (0)