Skip to content

Commit b05d436

Browse files
committed
[MLIR][OpenMP] Alterations to LLVM-IR lowering of OpenMP Dialect due to Bounds and MapEntry operations
This patch adjusts the lower to LLVM-IR inside of OpenMPToLLVMIRTranslation to faciliate the changes made to Target related operations to add the new Map related operations. It also includes adjustments to tests to support these changes, primarily modifying the MLIR as opposed to the LLVM-IR, the LLVM-IR should be identical after this patch. Depends on D158735 Reviewers: kiranchandramohan, TIFitis, razvanlupusoru Differential Revision: https://reviews.llvm.org/D158737
1 parent eaa0d28 commit b05d436

File tree

6 files changed

+103
-37
lines changed

6 files changed

+103
-37
lines changed

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

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,27 +1540,34 @@ static void genMapInfos(llvm::IRBuilderBase &builder,
15401540

15411541
unsigned index = 0;
15421542
for (const auto &mapOp : mapOperands) {
1543+
// Unlike dev_ptr and dev_addr operands these map operands point
1544+
// to a map entry operation which contains further information
1545+
// on the variable being mapped and how it should be mapped.
1546+
auto MapInfoOp =
1547+
mlir::dyn_cast<mlir::omp::MapInfoOp>(mapOp.getDefiningOp());
1548+
15431549
// TODO: Only LLVMPointerTypes are handled.
1544-
if (!mapOp.getType().isa<LLVM::LLVMPointerType>())
1550+
if (!MapInfoOp.getType().isa<LLVM::LLVMPointerType>())
15451551
return fail();
15461552

1547-
llvm::Value *mapOpValue = moduleTranslation.lookupValue(mapOp);
1553+
llvm::Value *mapOpValue =
1554+
moduleTranslation.lookupValue(MapInfoOp.getVarPtr());
15481555
combinedInfo.BasePointers.emplace_back(mapOpValue);
15491556
combinedInfo.Pointers.emplace_back(mapOpValue);
15501557
combinedInfo.DevicePointers.emplace_back(
15511558
llvm::OpenMPIRBuilder::DeviceInfoTy::None);
1552-
combinedInfo.Names.emplace_back(
1553-
LLVM::createMappingInformation(mapOp.getLoc(), *ompBuilder));
1559+
combinedInfo.Names.emplace_back(LLVM::createMappingInformation(
1560+
MapInfoOp.getVarPtr().getLoc(), *ompBuilder));
15541561

15551562
combinedInfo.Types.emplace_back(
15561563
llvm::omp::OpenMPOffloadMappingFlags(
1557-
mapTypes[index].dyn_cast<IntegerAttr>().getInt()) |
1564+
mapTypes[index].dyn_cast<IntegerAttr>().getUInt()) |
15581565
(IsTargetParams
15591566
? llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TARGET_PARAM
15601567
: llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_NONE));
15611568

15621569
combinedInfo.Sizes.emplace_back(
1563-
builder.getInt64(getSizeInBytes(DL, mapOp.getType())));
1570+
builder.getInt64(getSizeInBytes(DL, MapInfoOp.getVarPtr().getType())));
15641571
index++;
15651572
}
15661573

@@ -1609,6 +1616,19 @@ convertOmpTargetData(Operation *op, llvm::IRBuilderBase &builder,
16091616

16101617
llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder();
16111618

1619+
auto getMapTypes = [](mlir::OperandRange mapOperands,
1620+
mlir::MLIRContext *ctx) {
1621+
SmallVector<mlir::Attribute> mapTypes;
1622+
for (auto mapValue : mapOperands) {
1623+
if (mapValue.getDefiningOp()) {
1624+
auto mapOp =
1625+
mlir::dyn_cast<mlir::omp::MapInfoOp>(mapValue.getDefiningOp());
1626+
mapTypes.push_back(mapOp.getMapTypeAttr());
1627+
}
1628+
}
1629+
return mlir::ArrayAttr::get(ctx, mapTypes);
1630+
};
1631+
16121632
LogicalResult result =
16131633
llvm::TypeSwitch<Operation *, LogicalResult>(op)
16141634
.Case([&](omp::DataOp dataOp) {
@@ -1622,8 +1642,8 @@ convertOmpTargetData(Operation *op, llvm::IRBuilderBase &builder,
16221642
deviceID = intAttr.getInt();
16231643

16241644
mapOperands = dataOp.getMapOperands();
1625-
if (dataOp.getMapTypes())
1626-
mapTypes = dataOp.getMapTypes().value();
1645+
mapTypes =
1646+
getMapTypes(dataOp.getMapOperands(), dataOp->getContext());
16271647
useDevPtrOperands = dataOp.getUseDevicePtr();
16281648
useDevAddrOperands = dataOp.getUseDeviceAddr();
16291649
return success();
@@ -1642,7 +1662,8 @@ convertOmpTargetData(Operation *op, llvm::IRBuilderBase &builder,
16421662
deviceID = intAttr.getInt();
16431663
RTLFn = llvm::omp::OMPRTL___tgt_target_data_begin_mapper;
16441664
mapOperands = enterDataOp.getMapOperands();
1645-
mapTypes = enterDataOp.getMapTypes();
1665+
mapTypes = getMapTypes(enterDataOp.getMapOperands(),
1666+
enterDataOp->getContext());
16461667
return success();
16471668
})
16481669
.Case([&](omp::ExitDataOp exitDataOp) {
@@ -1660,7 +1681,8 @@ convertOmpTargetData(Operation *op, llvm::IRBuilderBase &builder,
16601681

16611682
RTLFn = llvm::omp::OMPRTL___tgt_target_data_end_mapper;
16621683
mapOperands = exitDataOp.getMapOperands();
1663-
mapTypes = exitDataOp.getMapTypes();
1684+
mapTypes = getMapTypes(exitDataOp.getMapOperands(),
1685+
exitDataOp->getContext());
16641686
return success();
16651687
})
16661688
.Default([&](Operation *op) {
@@ -1887,7 +1909,22 @@ convertOmpTarget(Operation &opInst, llvm::IRBuilderBase &builder,
18871909

18881910
DataLayout DL = DataLayout(opInst.getParentOfType<ModuleOp>());
18891911
SmallVector<Value> mapOperands = targetOp.getMapOperands();
1890-
ArrayAttr mapTypes = targetOp.getMapTypes().value_or(nullptr);
1912+
1913+
auto getMapTypes = [](mlir::OperandRange mapOperands,
1914+
mlir::MLIRContext *ctx) {
1915+
SmallVector<mlir::Attribute> mapTypes;
1916+
for (auto mapValue : mapOperands) {
1917+
if (mapValue.getDefiningOp()) {
1918+
auto mapOp =
1919+
mlir::dyn_cast<mlir::omp::MapInfoOp>(mapValue.getDefiningOp());
1920+
mapTypes.push_back(mapOp.getMapTypeAttr());
1921+
}
1922+
}
1923+
return mlir::ArrayAttr::get(ctx, mapTypes);
1924+
};
1925+
1926+
ArrayAttr mapTypes =
1927+
getMapTypes(targetOp.getMapOperands(), targetOp->getContext());
18911928

18921929
llvm::OpenMPIRBuilder::MapInfosTy combinedInfos;
18931930
auto genMapInfoCB = [&](llvm::OpenMPIRBuilder::InsertPointTy codeGenIP)
@@ -2170,6 +2207,12 @@ LogicalResult OpenMPDialectLLVMIRTranslationInterface::convertOperation(
21702207
.Case([&](omp::TargetOp) {
21712208
return convertOmpTarget(*op, builder, moduleTranslation);
21722209
})
2210+
.Case<omp::MapInfoOp, omp::DataBoundsOp>([&](auto op) {
2211+
// No-op, should be handled by relevant owning operations e.g.
2212+
// TargetOp, EnterDataOp, ExitDataOp, DataOp etc. and then
2213+
// discarded
2214+
return success();
2215+
})
21732216
.Default([&](Operation *inst) {
21742217
return inst->emitError("unsupported OpenMP operation: ")
21752218
<< inst->getName();

mlir/test/Target/LLVMIR/omptarget-llvm.mlir

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
llvm.func @_QPopenmp_target_data() {
44
%0 = llvm.mlir.constant(1 : i64) : i64
5-
%1 = llvm.alloca %0 x i32 {bindc_name = "i", in_type = i32, operandSegmentSizes = array<i32: 0, 0>, uniq_name = "_QFopenmp_target_dataEi"} : (i64) -> !llvm.ptr<i32>
6-
omp.target_data map((tofrom -> %1 : !llvm.ptr<i32>)) {
7-
%2 = llvm.mlir.constant(99 : i32) : i32
8-
llvm.store %2, %1 : !llvm.ptr<i32>
5+
%1 = llvm.alloca %0 x i32 {bindc_name = "i", in_type = i32, operand_segment_sizes = array<i32: 0, 0>, uniq_name = "_QFopenmp_target_dataEi"} : (i64) -> !llvm.ptr<i32>
6+
%2 = omp.map_info var_ptr(%1 : !llvm.ptr<i32>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
7+
omp.target_data map_entries(%2 : !llvm.ptr<i32>) {
8+
%3 = llvm.mlir.constant(99 : i32) : i32
9+
llvm.store %3, %1 : !llvm.ptr<i32>
910
omp.terminator
1011
}
1112
llvm.return
@@ -38,13 +39,14 @@ llvm.func @_QPopenmp_target_data() {
3839
// -----
3940

4041
llvm.func @_QPopenmp_target_data_region(%1 : !llvm.ptr<array<1024 x i32>>) {
41-
omp.target_data map((from -> %1 : !llvm.ptr<array<1024 x i32>>)) {
42-
%2 = llvm.mlir.constant(99 : i32) : i32
43-
%3 = llvm.mlir.constant(1 : i64) : i64
42+
%2 = omp.map_info var_ptr(%1 : !llvm.ptr<array<1024 x i32>>) map_clauses(from) capture(ByRef) -> !llvm.ptr<array<1024 x i32>> {name = ""}
43+
omp.target_data map_entries(%2 : !llvm.ptr<array<1024 x i32>>) {
44+
%3 = llvm.mlir.constant(99 : i32) : i32
4445
%4 = llvm.mlir.constant(1 : i64) : i64
45-
%5 = llvm.mlir.constant(0 : i64) : i64
46-
%6 = llvm.getelementptr %1[0, %5] : (!llvm.ptr<array<1024 x i32>>, i64) -> !llvm.ptr<i32>
47-
llvm.store %2, %6 : !llvm.ptr<i32>
46+
%5 = llvm.mlir.constant(1 : i64) : i64
47+
%6 = llvm.mlir.constant(0 : i64) : i64
48+
%7 = llvm.getelementptr %1[0, %6] : (!llvm.ptr<array<1024 x i32>>, i64) -> !llvm.ptr<i32>
49+
llvm.store %3, %7 : !llvm.ptr<i32>
4850
omp.terminator
4951
}
5052
llvm.return
@@ -90,12 +92,16 @@ llvm.func @_QPomp_target_enter_exit(%1 : !llvm.ptr<array<1024 x i32>>, %3 : !llv
9092
%11 = llvm.mlir.constant(10 : i32) : i32
9193
%12 = llvm.icmp "slt" %10, %11 : i32
9294
%13 = llvm.load %5 : !llvm.ptr<i32>
93-
omp.target_enter_data if(%12 : i1) device(%13 : i32) map((to -> %1 : !llvm.ptr<array<1024 x i32>>), (alloc -> %3 : !llvm.ptr<array<512 x i32>>))
95+
%map1 = omp.map_info var_ptr(%1 : !llvm.ptr<array<1024 x i32>>) map_clauses(to) capture(ByRef) -> !llvm.ptr<array<1024 x i32>> {name = ""}
96+
%map2 = omp.map_info var_ptr(%3 : !llvm.ptr<array<512 x i32>>) map_clauses(exit_release_or_enter_alloc) capture(ByRef) -> !llvm.ptr<array<512 x i32>> {name = ""}
97+
omp.target_enter_data if(%12 : i1) device(%13 : i32) map_entries(%map1, %map2 : !llvm.ptr<array<1024 x i32>>, !llvm.ptr<array<512 x i32>>)
9498
%14 = llvm.load %7 : !llvm.ptr<i32>
9599
%15 = llvm.mlir.constant(10 : i32) : i32
96100
%16 = llvm.icmp "sgt" %14, %15 : i32
97101
%17 = llvm.load %5 : !llvm.ptr<i32>
98-
omp.target_exit_data if(%16 : i1) device(%17 : i32) map((from -> %1 : !llvm.ptr<array<1024 x i32>>), (release -> %3 : !llvm.ptr<array<512 x i32>>))
102+
%map3 = omp.map_info var_ptr(%1 : !llvm.ptr<array<1024 x i32>>) map_clauses(from) capture(ByRef) -> !llvm.ptr<array<1024 x i32>> {name = ""}
103+
%map4 = omp.map_info var_ptr(%3 : !llvm.ptr<array<512 x i32>>) map_clauses(exit_release_or_enter_alloc) capture(ByRef) -> !llvm.ptr<array<512 x i32>> {name = ""}
104+
omp.target_exit_data if(%16 : i1) device(%17 : i32) map_entries(%map3, %map4 : !llvm.ptr<array<1024 x i32>>, !llvm.ptr<array<512 x i32>>)
99105
llvm.return
100106
}
101107

@@ -172,7 +178,8 @@ llvm.func @_QPomp_target_enter_exit(%1 : !llvm.ptr<array<1024 x i32>>, %3 : !llv
172178
llvm.func @_QPopenmp_target_use_dev_ptr() {
173179
%0 = llvm.mlir.constant(1 : i64) : i64
174180
%a = llvm.alloca %0 x !llvm.ptr<!llvm.ptr<i32>> : (i64) -> !llvm.ptr<!llvm.ptr<i32>>
175-
omp.target_data map((from -> %a : !llvm.ptr<!llvm.ptr<i32>>)) use_device_ptr(%a : !llvm.ptr<!llvm.ptr<i32>>) {
181+
%map1 = omp.map_info var_ptr(%a : !llvm.ptr<!llvm.ptr<i32>>) map_clauses(from) capture(ByRef) -> !llvm.ptr<!llvm.ptr<i32>> {name = ""}
182+
omp.target_data map_entries(%map1 : !llvm.ptr<!llvm.ptr<i32>>) use_device_ptr(%a : !llvm.ptr<!llvm.ptr<i32>>) {
176183
^bb0(%arg0: !llvm.ptr<!llvm.ptr<i32>>):
177184
%1 = llvm.mlir.constant(10 : i32) : i32
178185
%2 = llvm.load %arg0 : !llvm.ptr<!llvm.ptr<i32>>
@@ -215,7 +222,8 @@ llvm.func @_QPopenmp_target_use_dev_ptr() {
215222
llvm.func @_QPopenmp_target_use_dev_addr() {
216223
%0 = llvm.mlir.constant(1 : i64) : i64
217224
%a = llvm.alloca %0 x !llvm.ptr<!llvm.ptr<i32>> : (i64) -> !llvm.ptr<!llvm.ptr<i32>>
218-
omp.target_data map((from -> %a : !llvm.ptr<!llvm.ptr<i32>>)) use_device_addr(%a : !llvm.ptr<!llvm.ptr<i32>>) {
225+
%map = omp.map_info var_ptr(%a : !llvm.ptr<!llvm.ptr<i32>>) map_clauses(from) capture(ByRef) -> !llvm.ptr<!llvm.ptr<i32>> {name = ""}
226+
omp.target_data map_entries(%map : !llvm.ptr<!llvm.ptr<i32>>) use_device_addr(%a : !llvm.ptr<!llvm.ptr<i32>>) {
219227
^bb0(%arg0: !llvm.ptr<!llvm.ptr<i32>>):
220228
%1 = llvm.mlir.constant(10 : i32) : i32
221229
%2 = llvm.load %arg0 : !llvm.ptr<!llvm.ptr<i32>>
@@ -256,7 +264,8 @@ llvm.func @_QPopenmp_target_use_dev_addr() {
256264
llvm.func @_QPopenmp_target_use_dev_addr_no_ptr() {
257265
%0 = llvm.mlir.constant(1 : i64) : i64
258266
%a = llvm.alloca %0 x !llvm.ptr<i32> : (i64) -> !llvm.ptr<i32>
259-
omp.target_data map((tofrom -> %a : !llvm.ptr<i32>)) use_device_addr(%a : !llvm.ptr<i32>) {
267+
%map = omp.map_info var_ptr(%a : !llvm.ptr<i32>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
268+
omp.target_data map_entries(%map : !llvm.ptr<i32>) use_device_addr(%a : !llvm.ptr<i32>) {
260269
^bb0(%arg0: !llvm.ptr<i32>):
261270
%1 = llvm.mlir.constant(10 : i32) : i32
262271
llvm.store %1, %arg0 : !llvm.ptr<i32>
@@ -297,7 +306,8 @@ llvm.func @_QPopenmp_target_use_dev_addr_nomap() {
297306
%a = llvm.alloca %0 x !llvm.ptr<!llvm.ptr<i32>> : (i64) -> !llvm.ptr<!llvm.ptr<i32>>
298307
%1 = llvm.mlir.constant(1 : i64) : i64
299308
%b = llvm.alloca %0 x !llvm.ptr<!llvm.ptr<i32>> : (i64) -> !llvm.ptr<!llvm.ptr<i32>>
300-
omp.target_data map((from -> %b : !llvm.ptr<!llvm.ptr<i32>>)) use_device_addr(%a : !llvm.ptr<!llvm.ptr<i32>>) {
309+
%map = omp.map_info var_ptr(%b : !llvm.ptr<!llvm.ptr<i32>>) map_clauses(from) capture(ByRef) -> !llvm.ptr<!llvm.ptr<i32>> {name = ""}
310+
omp.target_data map_entries(%map : !llvm.ptr<!llvm.ptr<i32>>) use_device_addr(%a : !llvm.ptr<!llvm.ptr<i32>>) {
301311
^bb0(%arg0: !llvm.ptr<!llvm.ptr<i32>>):
302312
%2 = llvm.mlir.constant(10 : i32) : i32
303313
%3 = llvm.load %arg0 : !llvm.ptr<!llvm.ptr<i32>>
@@ -352,7 +362,9 @@ llvm.func @_QPopenmp_target_use_dev_both() {
352362
%a = llvm.alloca %0 x !llvm.ptr<!llvm.ptr<i32>> : (i64) -> !llvm.ptr<!llvm.ptr<i32>>
353363
%1 = llvm.mlir.constant(1 : i64) : i64
354364
%b = llvm.alloca %0 x !llvm.ptr<!llvm.ptr<i32>> : (i64) -> !llvm.ptr<!llvm.ptr<i32>>
355-
omp.target_data map((tofrom -> %a : !llvm.ptr<!llvm.ptr<i32>>), (tofrom -> %b : !llvm.ptr<!llvm.ptr<i32>>)) use_device_ptr(%a : !llvm.ptr<!llvm.ptr<i32>>) use_device_addr(%b : !llvm.ptr<!llvm.ptr<i32>>) {
365+
%map = omp.map_info var_ptr(%a : !llvm.ptr<!llvm.ptr<i32>>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<!llvm.ptr<i32>> {name = ""}
366+
%map1 = omp.map_info var_ptr(%b : !llvm.ptr<!llvm.ptr<i32>>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<!llvm.ptr<i32>> {name = ""}
367+
omp.target_data map_entries(%map, %map1 : !llvm.ptr<!llvm.ptr<i32>>, !llvm.ptr<!llvm.ptr<i32>>) use_device_ptr(%a : !llvm.ptr<!llvm.ptr<i32>>) use_device_addr(%b : !llvm.ptr<!llvm.ptr<i32>>) {
356368
^bb0(%arg0: !llvm.ptr<!llvm.ptr<i32>>, %arg1: !llvm.ptr<!llvm.ptr<i32>>):
357369
%2 = llvm.mlir.constant(10 : i32) : i32
358370
%3 = llvm.load %arg0 : !llvm.ptr<!llvm.ptr<i32>>

mlir/test/Target/LLVMIR/omptarget-region-device-llvm.mlir

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ module attributes {omp.is_target_device = true} {
1212
%7 = llvm.alloca %6 x i32 {bindc_name = "c", in_type = i32, operandSegmentSizes = array<i32: 0, 0>, uniq_name = "_QFomp_target_regionEc"} : (i64) -> !llvm.ptr<i32>
1313
llvm.store %1, %3 : !llvm.ptr<i32>
1414
llvm.store %0, %5 : !llvm.ptr<i32>
15-
omp.target map((to -> %3 : !llvm.ptr<i32>), (to -> %5 : !llvm.ptr<i32>), (from -> %7 : !llvm.ptr<i32>)) {
15+
%map1 = omp.map_info var_ptr(%3 : !llvm.ptr<i32>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
16+
%map2 = omp.map_info var_ptr(%5 : !llvm.ptr<i32>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
17+
%map3 = omp.map_info var_ptr(%7 : !llvm.ptr<i32>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
18+
omp.target map_entries(%map1, %map2, %map3 : !llvm.ptr<i32>, !llvm.ptr<i32>, !llvm.ptr<i32>) {
1619
%8 = llvm.load %3 : !llvm.ptr<i32>
1720
%9 = llvm.load %5 : !llvm.ptr<i32>
1821
%10 = llvm.add %8, %9 : i32

mlir/test/Target/LLVMIR/omptarget-region-llvm-target-device.mlir

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@
44

55
module attributes {omp.is_target_device = true} {
66
llvm.func @writeindex_omp_outline_0_(%arg0: !llvm.ptr<i32>, %arg1: !llvm.ptr<i32>) attributes {omp.outline_parent_name = "writeindex_"} {
7-
omp.target map((from -> %arg0 : !llvm.ptr<i32>), (implicit -> %arg1: !llvm.ptr<i32>)) {
8-
%0 = llvm.mlir.constant(20 : i32) : i32
9-
%1 = llvm.mlir.constant(10 : i32) : i32
10-
llvm.store %1, %arg0 : !llvm.ptr<i32>
11-
llvm.store %0, %arg1 : !llvm.ptr<i32>
7+
%0 = omp.map_info var_ptr(%arg0 : !llvm.ptr<i32>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
8+
%1 = omp.map_info var_ptr(%arg1 : !llvm.ptr<i32>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
9+
omp.target map_entries(%0, %1 : !llvm.ptr<i32>, !llvm.ptr<i32>) {
10+
%2 = llvm.mlir.constant(20 : i32) : i32
11+
%3 = llvm.mlir.constant(10 : i32) : i32
12+
llvm.store %3, %arg0 : !llvm.ptr<i32>
13+
llvm.store %2, %arg1 : !llvm.ptr<i32>
1214
omp.terminator
1315
}
1416
llvm.return
1517
}
1618
}
1719

18-
// CHECK: define {{.*}} void @__omp_offloading_{{.*}}_{{.*}}_writeindex__l7(ptr {{.*}}, ptr {{.*}}) {
20+
// CHECK: define {{.*}} void @__omp_offloading_{{.*}}_{{.*}}_writeindex__l{{.*}}(ptr {{.*}}, ptr {{.*}}) {

mlir/test/Target/LLVMIR/omptarget-region-llvm.mlir

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ module attributes {omp.is_target_device = false} {
1212
%7 = llvm.alloca %6 x i32 {bindc_name = "c", in_type = i32, operandSegmentSizes = array<i32: 0, 0>, uniq_name = "_QFomp_target_regionEc"} : (i64) -> !llvm.ptr<i32>
1313
llvm.store %1, %3 : !llvm.ptr<i32>
1414
llvm.store %0, %5 : !llvm.ptr<i32>
15-
omp.target map((to -> %3 : !llvm.ptr<i32>), (to -> %5 : !llvm.ptr<i32>), (from -> %7 : !llvm.ptr<i32>)) {
15+
%map1 = omp.map_info var_ptr(%3 : !llvm.ptr<i32>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
16+
%map2 = omp.map_info var_ptr(%5 : !llvm.ptr<i32>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
17+
%map3 = omp.map_info var_ptr(%7 : !llvm.ptr<i32>) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
18+
omp.target map_entries(%map1, %map2, %map3 : !llvm.ptr<i32>, !llvm.ptr<i32>, !llvm.ptr<i32>) {
1619
%8 = llvm.load %3 : !llvm.ptr<i32>
1720
%9 = llvm.load %5 : !llvm.ptr<i32>
1821
%10 = llvm.add %8, %9 : i32

mlir/test/Target/LLVMIR/omptarget-region-parallel-llvm.mlir

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ module attributes {omp.is_target_device = false} {
1212
%7 = llvm.alloca %6 x i32 {bindc_name = "c", in_type = i32, operandSegmentSizes = array<i32: 0, 0>, uniq_name = "_QFomp_target_regionEc"} : (i64) -> !llvm.ptr<i32>
1313
llvm.store %1, %3 : !llvm.ptr<i32>
1414
llvm.store %0, %5 : !llvm.ptr<i32>
15-
omp.target map((to -> %3 : !llvm.ptr<i32>), (to -> %5 : !llvm.ptr<i32>), (from -> %7 : !llvm.ptr<i32>)) {
15+
%map1 = omp.map_info var_ptr(%3 : !llvm.ptr<i32>) map_clauses(tofrommap_info) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
16+
%map2 = omp.map_info var_ptr(%5 : !llvm.ptr<i32>) map_clauses(tofrommap_info) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
17+
%map3 = omp.map_info var_ptr(%7 : !llvm.ptr<i32>) map_clauses(tofrommap_info) capture(ByRef) -> !llvm.ptr<i32> {name = ""}
18+
omp.target map_entries( %map1, %map2, %map3 : !llvm.ptr<i32>, !llvm.ptr<i32>, !llvm.ptr<i32>) {
1619
omp.parallel {
1720
%8 = llvm.load %3 : !llvm.ptr<i32>
1821
%9 = llvm.load %5 : !llvm.ptr<i32>

0 commit comments

Comments
 (0)