Skip to content

Commit c993ac5

Browse files
committed
Add OpenMP to LLVM dialect conversion support for DeclareMapperOp.
1 parent 802c3df commit c993ac5

File tree

3 files changed

+74
-14
lines changed

3 files changed

+74
-14
lines changed

flang/test/Fir/convert-to-llvm-openmp-and-fir.fir

+23-4
Original file line numberDiff line numberDiff line change
@@ -936,9 +936,9 @@ func.func @omp_map_info_descriptor_type_conversion(%arg0 : !fir.ref<!fir.box<!fi
936936
%1 = omp.map.info var_ptr(%0 : !fir.llvm_ptr<!fir.ref<i32>>, i32) map_clauses(tofrom) capture(ByRef) -> !fir.llvm_ptr<!fir.ref<i32>> {name = ""}
937937
// CHECK: %[[DESC_MAP:.*]] = omp.map.info var_ptr(%[[ARG_0]] : !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>) map_clauses(always, delete) capture(ByRef) members(%[[MEMBER_MAP]] : [0] : !llvm.ptr) -> !llvm.ptr {name = ""}
938938
%2 = omp.map.info var_ptr(%arg0 : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.box<!fir.heap<i32>>) map_clauses(always, delete) capture(ByRef) members(%1 : [0] : !fir.llvm_ptr<!fir.ref<i32>>) -> !fir.ref<!fir.box<!fir.heap<i32>>> {name = ""}
939-
// CHECK: omp.target_exit_data map_entries(%[[DESC_MAP]] : !llvm.ptr)
939+
// CHECK: omp.target_exit_data map_entries(%[[DESC_MAP]] : !llvm.ptr)
940940
omp.target_exit_data map_entries(%2 : !fir.ref<!fir.box<!fir.heap<i32>>>)
941-
return
941+
return
942942
}
943943

944944
// -----
@@ -956,8 +956,8 @@ func.func @omp_map_info_derived_type_explicit_member_conversion(%arg0 : !fir.ref
956956
%3 = fir.field_index real, !fir.type<_QFderived_type{real:f32,array:!fir.array<10xi32>,int:i32}>
957957
%4 = fir.coordinate_of %arg0, %3 : (!fir.ref<!fir.type<_QFderived_type{real:f32,array:!fir.array<10xi32>,int:i32}>>, !fir.field) -> !fir.ref<f32>
958958
// CHECK: %[[MAP_MEMBER_2:.*]] = omp.map.info var_ptr(%[[GEP_2]] : !llvm.ptr, f32) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = "dtype%real"}
959-
%5 = omp.map.info var_ptr(%4 : !fir.ref<f32>, f32) map_clauses(tofrom) capture(ByRef) -> !fir.ref<f32> {name = "dtype%real"}
960-
// CHECK: %[[MAP_PARENT:.*]] = omp.map.info var_ptr(%[[ARG_0]] : !llvm.ptr, !llvm.struct<"_QFderived_type", (f32, array<10 x i32>, i32)>) map_clauses(tofrom) capture(ByRef) members(%[[MAP_MEMBER_1]], %[[MAP_MEMBER_2]] : [2], [0] : !llvm.ptr, !llvm.ptr) -> !llvm.ptr {name = "dtype", partial_map = true}
959+
%5 = omp.map.info var_ptr(%4 : !fir.ref<f32>, f32) map_clauses(tofrom) capture(ByRef) -> !fir.ref<f32> {name = "dtype%real"}
960+
// CHECK: %[[MAP_PARENT:.*]] = omp.map.info var_ptr(%[[ARG_0]] : !llvm.ptr, !llvm.struct<"_QFderived_type", (f32, array<10 x i32>, i32)>) map_clauses(tofrom) capture(ByRef) members(%[[MAP_MEMBER_1]], %[[MAP_MEMBER_2]] : [2], [0] : !llvm.ptr, !llvm.ptr) -> !llvm.ptr {name = "dtype", partial_map = true}
961961
%6 = omp.map.info var_ptr(%arg0 : !fir.ref<!fir.type<_QFderived_type{real:f32,array:!fir.array<10xi32>,int:i32}>>, !fir.type<_QFderived_type{real:f32,array:!fir.array<10xi32>,int:i32}>) map_clauses(tofrom) capture(ByRef) members(%2, %5 : [2], [0] : !fir.ref<i32>, !fir.ref<f32>) -> !fir.ref<!fir.type<_QFderived_type{real:f32,array:!fir.array<10xi32>,int:i32}>> {name = "dtype", partial_map = true}
962962
// CHECK: omp.target map_entries(%[[MAP_MEMBER_1]] -> %[[ARG_1:.*]], %[[MAP_MEMBER_2]] -> %[[ARG_2:.*]], %[[MAP_PARENT]] -> %[[ARG_3:.*]] : !llvm.ptr, !llvm.ptr, !llvm.ptr) {
963963
omp.target map_entries(%2 -> %arg1, %5 -> %arg2, %6 -> %arg3 : !fir.ref<i32>, !fir.ref<f32>, !fir.ref<!fir.type<_QFderived_type{real:f32,array:!fir.array<10xi32>,int:i32}>>) {
@@ -1275,3 +1275,22 @@ func.func @map_nested_dtype_alloca_mem2(%arg0 : !fir.ref<!fir.type<_QFRecTy{i:f3
12751275
}
12761276
return
12771277
}
1278+
1279+
// -----
1280+
1281+
// CHECK-LABEL: omp.declare_mapper @my_mapper : !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)> {
1282+
omp.declare_mapper @my_mapper : !fir.type<_QFdeclare_mapperTmy_type{data:i32}> {
1283+
// CHECK: ^bb0(%[[VAL_0:.*]]: !llvm.ptr):
1284+
^bb0(%0: !fir.ref<!fir.type<_QFdeclare_mapperTmy_type{data:i32}>>):
1285+
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(0 : i32) : i32
1286+
%1 = fir.field_index data, !fir.type<_QFdeclare_mapperTmy_type{data:i32}>
1287+
// CHECK: %[[VAL_2:.*]] = llvm.getelementptr %[[VAL_0]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)>
1288+
%2 = fir.coordinate_of %0, %1 : (!fir.ref<!fir.type<_QFdeclare_mapperTmy_type{data:i32}>>, !fir.field) -> !fir.ref<i32>
1289+
// CHECK: %[[VAL_3:.*]] = omp.map.info var_ptr(%[[VAL_2]] : !llvm.ptr, i32) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = "var%[[VAL_4:.*]]"}
1290+
%3 = omp.map.info var_ptr(%2 : !fir.ref<i32>, i32) map_clauses(tofrom) capture(ByRef) -> !fir.ref<i32> {name = "var%data"}
1291+
// CHECK: %[[VAL_5:.*]] = omp.map.info var_ptr(%[[VAL_0]] : !llvm.ptr, !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)>) map_clauses(tofrom) capture(ByRef) members(%[[VAL_3]] : [0] : !llvm.ptr) -> !llvm.ptr {name = "var", partial_map = true}
1292+
%4 = omp.map.info var_ptr(%0 : !fir.ref<!fir.type<_QFdeclare_mapperTmy_type{data:i32}>>, !fir.type<_QFdeclare_mapperTmy_type{data:i32}>) map_clauses(tofrom) capture(ByRef) members(%3 : [0] : !fir.ref<i32>) -> !fir.ref<!fir.type<_QFdeclare_mapperTmy_type{data:i32}>> {name = "var", partial_map = true}
1293+
// CHECK: omp.declare_mapper_info map_entries(%[[VAL_5]], %[[VAL_3]] : !llvm.ptr, !llvm.ptr)
1294+
omp.declare_mapper_info map_entries(%4, %3 : !fir.ref<!fir.type<_QFdeclare_mapperTmy_type{data:i32}>>, !fir.ref<i32>)
1295+
// CHECK: }
1296+
}

mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp

+38-10
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,32 @@ struct MapInfoOpConversion : public ConvertOpToLLVMPattern<omp::MapInfoOp> {
186186
}
187187
};
188188

189+
struct DeclMapperOpConversion
190+
: public ConvertOpToLLVMPattern<omp::DeclareMapperOp> {
191+
using ConvertOpToLLVMPattern<omp::DeclareMapperOp>::ConvertOpToLLVMPattern;
192+
LogicalResult
193+
matchAndRewrite(omp::DeclareMapperOp curOp, OpAdaptor adaptor,
194+
ConversionPatternRewriter &rewriter) const override {
195+
const TypeConverter *converter = ConvertToLLVMPattern::getTypeConverter();
196+
SmallVector<NamedAttribute> newAttrs;
197+
newAttrs.emplace_back(curOp.getSymNameAttrName(), curOp.getSymNameAttr());
198+
newAttrs.emplace_back(
199+
curOp.getVarTypeAttrName(),
200+
TypeAttr::get(converter->convertType(curOp.getVarType())));
201+
202+
auto newOp = rewriter.create<omp::DeclareMapperOp>(
203+
curOp.getLoc(), TypeRange(), adaptor.getOperands(), newAttrs);
204+
rewriter.inlineRegionBefore(curOp.getRegion(), newOp.getRegion(),
205+
newOp.getRegion().end());
206+
if (failed(rewriter.convertRegionTypes(&newOp.getRegion(),
207+
*this->getTypeConverter())))
208+
return failure();
209+
210+
rewriter.eraseOp(curOp);
211+
return success();
212+
}
213+
};
214+
189215
template <typename OpType>
190216
struct MultiRegionOpConversion : public ConvertOpToLLVMPattern<OpType> {
191217
using ConvertOpToLLVMPattern<OpType>::ConvertOpToLLVMPattern;
@@ -225,19 +251,20 @@ void mlir::configureOpenMPToLLVMConversionLegality(
225251
ConversionTarget &target, const LLVMTypeConverter &typeConverter) {
226252
target.addDynamicallyLegalOp<
227253
omp::AtomicReadOp, omp::AtomicWriteOp, omp::CancellationPointOp,
228-
omp::CancelOp, omp::CriticalDeclareOp, omp::FlushOp, omp::MapBoundsOp,
229-
omp::MapInfoOp, omp::OrderedOp, omp::ScanOp, omp::TargetEnterDataOp,
230-
omp::TargetExitDataOp, omp::TargetUpdateOp, omp::ThreadprivateOp,
231-
omp::YieldOp>([&](Operation *op) {
254+
omp::CancelOp, omp::CriticalDeclareOp, omp::DeclareMapperInfoOp,
255+
omp::FlushOp, omp::MapBoundsOp, omp::MapInfoOp, omp::OrderedOp, omp::ScanOp,
256+
omp::TargetEnterDataOp, omp::TargetExitDataOp, omp::TargetUpdateOp,
257+
omp::ThreadprivateOp, omp::YieldOp>([&](Operation *op) {
232258
return typeConverter.isLegal(op->getOperandTypes()) &&
233259
typeConverter.isLegal(op->getResultTypes());
234260
});
235261
target.addDynamicallyLegalOp<
236-
omp::AtomicUpdateOp, omp::CriticalOp, omp::DeclareReductionOp,
237-
omp::DistributeOp, omp::LoopNestOp, omp::LoopOp, omp::MasterOp,
238-
omp::OrderedRegionOp, omp::ParallelOp, omp::SectionOp, omp::SectionsOp,
239-
omp::SimdOp, omp::SingleOp, omp::TargetDataOp, omp::TargetOp,
240-
omp::TaskgroupOp, omp::TaskloopOp, omp::TaskOp, omp::TeamsOp,
262+
omp::AtomicUpdateOp, omp::CriticalOp, omp::DeclareMapperOp,
263+
omp::DeclareReductionOp, omp::DistributeOp, omp::LoopNestOp, omp::LoopOp,
264+
omp::MasterOp, omp::OrderedRegionOp, omp::ParallelOp,
265+
omp::PrivateClauseOp, omp::SectionOp, omp::SectionsOp, omp::SimdOp,
266+
omp::SingleOp, omp::TargetDataOp, omp::TargetOp, omp::TaskgroupOp,
267+
omp::TaskloopOp, omp::TaskOp, omp::TeamsOp,
241268
omp::WsloopOp>([&](Operation *op) {
242269
return std::all_of(op->getRegions().begin(), op->getRegions().end(),
243270
[&](Region &region) {
@@ -267,12 +294,13 @@ void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
267294
[&](omp::MapBoundsType type) -> Type { return type; });
268295

269296
patterns.add<
270-
AtomicReadOpConversion, MapInfoOpConversion,
297+
AtomicReadOpConversion, DeclMapperOpConversion, MapInfoOpConversion,
271298
MultiRegionOpConversion<omp::DeclareReductionOp>,
272299
MultiRegionOpConversion<omp::PrivateClauseOp>,
273300
RegionLessOpConversion<omp::CancellationPointOp>,
274301
RegionLessOpConversion<omp::CancelOp>,
275302
RegionLessOpConversion<omp::CriticalDeclareOp>,
303+
RegionLessOpConversion<omp::DeclareMapperInfoOp>,
276304
RegionLessOpConversion<omp::OrderedOp>,
277305
RegionLessOpConversion<omp::ScanOp>,
278306
RegionLessOpConversion<omp::TargetEnterDataOp>,

mlir/test/Conversion/OpenMPToLLVM/convert-to-llvmir.mlir

+13
Original file line numberDiff line numberDiff line change
@@ -601,3 +601,16 @@ func.func @omp_taskloop(%arg0: index, %arg1 : memref<i32>) {
601601
}
602602
return
603603
}
604+
605+
// -----
606+
607+
// CHECK-LABEL: omp.declare_mapper @my_mapper : !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)> {
608+
omp.declare_mapper @my_mapper : !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)> {
609+
^bb0(%arg0: !llvm.ptr):
610+
%0 = llvm.mlir.constant(0 : i32) : i32
611+
%1 = llvm.getelementptr %arg0[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)>
612+
%2 = omp.map.info var_ptr(%1 : !llvm.ptr, i32) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = "var%data"}
613+
%3 = omp.map.info var_ptr(%arg0 : !llvm.ptr, !llvm.struct<"_QFdeclare_mapperTmy_type", (i32)>) map_clauses(tofrom) capture(ByRef) members(%2 : [0] : !llvm.ptr) -> !llvm.ptr {name = "var", partial_map = true}
614+
// CHECK: omp.declare_mapper_info map_entries(%{{.*}}, %{{.*}} : !llvm.ptr, !llvm.ptr)
615+
omp.declare_mapper_info map_entries(%3, %2 : !llvm.ptr, !llvm.ptr)
616+
}

0 commit comments

Comments
 (0)