Skip to content

Commit af694df

Browse files
committed
[MLIR][OpenMP] Add conversion support from FIR to LLVM Dialect for OMP Target Data with region
This enables conversion of OpenMP Target Data op with region from FIR Dialect to LLVM IR Dialect. Differential Revision: https://reviews.llvm.org/D144380
1 parent dbf149c commit af694df

File tree

3 files changed

+127
-29
lines changed

3 files changed

+127
-29
lines changed

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

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ func.func @_QPsb2(%arg0: !fir.ref<i32> {fir.bindc_name = "x"}, %arg1: !fir.ref<i
7272
// CHECK: llvm.return
7373
// CHECK: }
7474

75-
7675
// -----
7776

7877
func.func @_QPsb(%arr: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arr"}) {
@@ -218,6 +217,8 @@ func.func @_QPsimd1(%arg0: !fir.ref<i32> {fir.bindc_name = "n"}, %arg1: !fir.ref
218217
// CHECK: llvm.return
219218
// CHECK: }
220219

220+
// -----
221+
221222
func.func @_QPomp_target_data() {
222223
%0 = fir.alloca !fir.array<1024xi32> {bindc_name = "a", uniq_name = "_QFomp_target_dataEa"}
223224
%1 = fir.alloca !fir.array<1024xi32> {bindc_name = "b", uniq_name = "_QFomp_target_dataEb"}
@@ -242,6 +243,84 @@ func.func @_QPomp_target_data() {
242243
// CHECK: llvm.return
243244
// CHECK: }
244245

246+
// -----
247+
248+
func.func @_QPopenmp_target_data_region() {
249+
%0 = fir.alloca !fir.array<1024xi32> {bindc_name = "a", uniq_name = "_QFopenmp_target_data_regionEa"}
250+
%1 = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFopenmp_target_data_regionEi"}
251+
omp.target_data map((tofrom -> %0 : !fir.ref<!fir.array<1024xi32>>)) {
252+
%c1_i32 = arith.constant 1 : i32
253+
%2 = fir.convert %c1_i32 : (i32) -> index
254+
%c1024_i32 = arith.constant 1024 : i32
255+
%3 = fir.convert %c1024_i32 : (i32) -> index
256+
%c1 = arith.constant 1 : index
257+
%4 = fir.convert %2 : (index) -> i32
258+
%5:2 = fir.do_loop %arg0 = %2 to %3 step %c1 iter_args(%arg1 = %4) -> (index, i32) {
259+
fir.store %arg1 to %1 : !fir.ref<i32>
260+
%6 = fir.load %1 : !fir.ref<i32>
261+
%7 = fir.load %1 : !fir.ref<i32>
262+
%8 = fir.convert %7 : (i32) -> i64
263+
%c1_i64 = arith.constant 1 : i64
264+
%9 = arith.subi %8, %c1_i64 : i64
265+
%10 = fir.coordinate_of %0, %9 : (!fir.ref<!fir.array<1024xi32>>, i64) -> !fir.ref<i32>
266+
fir.store %6 to %10 : !fir.ref<i32>
267+
%11 = arith.addi %arg0, %c1 : index
268+
%12 = fir.convert %c1 : (index) -> i32
269+
%13 = fir.load %1 : !fir.ref<i32>
270+
%14 = arith.addi %13, %12 : i32
271+
fir.result %11, %14 : index, i32
272+
}
273+
fir.store %5#1 to %1 : !fir.ref<i32>
274+
omp.terminator
275+
}
276+
return
277+
}
278+
279+
// CHECK-LABEL: llvm.func @_QPopenmp_target_data_region() {
280+
// CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1 : i64) : i64
281+
// CHECK: %[[VAL_1:.*]] = llvm.alloca %[[VAL_0]] x !llvm.array<1024 x i32> {bindc_name = "a", in_type = !fir.array<1024xi32>, operand_segment_sizes = array<i32: 0, 0>, uniq_name = "_QFopenmp_target_data_regionEa"} : (i64) -> !llvm.ptr<array<1024 x i32>>
282+
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i64) : i64
283+
// CHECK: %[[VAL_3:.*]] = llvm.alloca %[[VAL_2]] x i32 {bindc_name = "i", in_type = i32, operand_segment_sizes = array<i32: 0, 0>, uniq_name = "_QFopenmp_target_data_regionEi"} : (i64) -> !llvm.ptr<i32>
284+
// CHECK: omp.target_data map((tofrom -> %[[VAL_1]] : !llvm.ptr<array<1024 x i32>>)) {
285+
// CHECK: %[[VAL_4:.*]] = llvm.mlir.constant(1 : i32) : i32
286+
// CHECK: %[[VAL_5:.*]] = llvm.sext %[[VAL_4]] : i32 to i64
287+
// CHECK: %[[VAL_6:.*]] = llvm.mlir.constant(1024 : i32) : i32
288+
// CHECK: %[[VAL_7:.*]] = llvm.sext %[[VAL_6]] : i32 to i64
289+
// CHECK: %[[VAL_8:.*]] = llvm.mlir.constant(1 : index) : i64
290+
// CHECK: %[[VAL_9:.*]] = llvm.trunc %[[VAL_5]] : i64 to i32
291+
// CHECK: %[[VAL_10:.*]] = llvm.sub %[[VAL_7]], %[[VAL_5]] : i64
292+
// CHECK: %[[VAL_11:.*]] = llvm.add %[[VAL_10]], %[[VAL_8]] : i64
293+
// CHECK: llvm.br ^bb1(%[[VAL_5]], %[[VAL_9]], %[[VAL_11]] : i64, i32, i64)
294+
// CHECK: ^bb1(%[[VAL_12:.*]]: i64, %[[VAL_13:.*]]: i32, %[[VAL_14:.*]]: i64):
295+
// CHECK: %[[VAL_15:.*]] = llvm.mlir.constant(0 : index) : i64
296+
// CHECK: %[[VAL_16:.*]] = llvm.icmp "sgt" %[[VAL_14]], %[[VAL_15]] : i64
297+
// CHECK: llvm.cond_br %[[VAL_16]], ^bb2, ^bb3
298+
// CHECK: ^bb2:
299+
// CHECK: llvm.store %[[VAL_13]], %[[VAL_3]] : !llvm.ptr<i32>
300+
// CHECK: %[[VAL_17:.*]] = llvm.load %[[VAL_3]] : !llvm.ptr<i32>
301+
// CHECK: %[[VAL_18:.*]] = llvm.load %[[VAL_3]] : !llvm.ptr<i32>
302+
// CHECK: %[[VAL_19:.*]] = llvm.sext %[[VAL_18]] : i32 to i64
303+
// CHECK: %[[VAL_20:.*]] = llvm.mlir.constant(1 : i64) : i64
304+
// CHECK: %[[VAL_21:.*]] = llvm.sub %[[VAL_19]], %[[VAL_20]] : i64
305+
// CHECK: %[[VAL_22:.*]] = llvm.getelementptr %[[VAL_1]][0, %[[VAL_21]]] : (!llvm.ptr<array<1024 x i32>>, i64) -> !llvm.ptr<i32>
306+
// CHECK: llvm.store %[[VAL_17]], %[[VAL_22]] : !llvm.ptr<i32>
307+
// CHECK: %[[VAL_23:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] : i64
308+
// CHECK: %[[VAL_24:.*]] = llvm.trunc %[[VAL_8]] : i64 to i32
309+
// CHECK: %[[VAL_25:.*]] = llvm.load %[[VAL_3]] : !llvm.ptr<i32>
310+
// CHECK: %[[VAL_26:.*]] = llvm.add %[[VAL_25]], %[[VAL_24]] : i32
311+
// CHECK: %[[VAL_27:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] : i64
312+
// CHECK: %[[VAL_28:.*]] = llvm.mlir.constant(1 : index) : i64
313+
// CHECK: %[[VAL_29:.*]] = llvm.sub %[[VAL_14]], %[[VAL_28]] : i64
314+
// CHECK: llvm.br ^bb1(%[[VAL_27]], %[[VAL_26]], %[[VAL_29]] : i64, i32, i64)
315+
// CHECK: ^bb3:
316+
// CHECK: llvm.store %[[VAL_13]], %[[VAL_3]] : !llvm.ptr<i32>
317+
// CHECK: omp.terminator
318+
// CHECK: }
319+
// CHECK: llvm.return
320+
// CHECK: }
321+
322+
// -----
323+
245324
func.func @_QPsimdloop_with_nested_loop() {
246325
%0 = fir.alloca i32 {adapt.valuebyref}
247326
%1 = fir.alloca !fir.array<10xi32> {bindc_name = "a", uniq_name = "_QFsimdloop_with_nested_loopEa"}

mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -151,24 +151,23 @@ struct LegalizeDataOpForLLVMTranslation : public ConvertOpToLLVMPattern<Op> {
151151

152152
void mlir::configureOpenMPToLLVMConversionLegality(
153153
ConversionTarget &target, LLVMTypeConverter &typeConverter) {
154-
target.addDynamicallyLegalOp<mlir::omp::AtomicUpdateOp, mlir::omp::CriticalOp,
155-
mlir::omp::ParallelOp, mlir::omp::WsLoopOp,
156-
mlir::omp::SimdLoopOp, mlir::omp::MasterOp,
157-
mlir::omp::SectionOp, mlir::omp::SectionsOp,
158-
mlir::omp::SingleOp, mlir::omp::TaskOp>(
159-
[&](Operation *op) {
160-
return typeConverter.isLegal(&op->getRegion(0)) &&
161-
typeConverter.isLegal(op->getOperandTypes()) &&
162-
typeConverter.isLegal(op->getResultTypes());
163-
});
164-
target.addDynamicallyLegalOp<mlir::omp::AtomicReadOp,
165-
mlir::omp::AtomicWriteOp, mlir::omp::FlushOp,
166-
mlir::omp::ThreadprivateOp, mlir::omp::DataOp,
167-
mlir::omp::EnterDataOp, mlir::omp::ExitDataOp>(
168-
[&](Operation *op) {
169-
return typeConverter.isLegal(op->getOperandTypes()) &&
170-
typeConverter.isLegal(op->getResultTypes());
171-
});
154+
target.addDynamicallyLegalOp<
155+
mlir::omp::AtomicUpdateOp, mlir::omp::CriticalOp, mlir::omp::DataOp,
156+
mlir::omp::ParallelOp, mlir::omp::WsLoopOp, mlir::omp::SimdLoopOp,
157+
mlir::omp::MasterOp, mlir::omp::SectionOp, mlir::omp::SectionsOp,
158+
mlir::omp::SingleOp, mlir::omp::TaskOp>([&](Operation *op) {
159+
return typeConverter.isLegal(&op->getRegion(0)) &&
160+
typeConverter.isLegal(op->getOperandTypes()) &&
161+
typeConverter.isLegal(op->getResultTypes());
162+
});
163+
target
164+
.addDynamicallyLegalOp<mlir::omp::AtomicReadOp, mlir::omp::AtomicWriteOp,
165+
mlir::omp::FlushOp, mlir::omp::ThreadprivateOp,
166+
mlir::omp::EnterDataOp, mlir::omp::ExitDataOp>(
167+
[&](Operation *op) {
168+
return typeConverter.isLegal(op->getOperandTypes()) &&
169+
typeConverter.isLegal(op->getResultTypes());
170+
});
172171
target.addDynamicallyLegalOp<mlir::omp::ReductionOp>([&](Operation *op) {
173172
return typeConverter.isLegal(op->getOperandTypes());
174173
});
@@ -177,20 +176,20 @@ void mlir::configureOpenMPToLLVMConversionLegality(
177176
void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
178177
RewritePatternSet &patterns) {
179178
patterns.add<
180-
ReductionOpConversion, RegionOpConversion<omp::CriticalOp>,
181-
RegionOpConversion<omp::MasterOp>, ReductionOpConversion,
182-
RegionOpConversion<omp::MasterOp>, RegionOpConversion<omp::ParallelOp>,
183-
RegionOpConversion<omp::WsLoopOp>, RegionOpConversion<omp::SectionsOp>,
184-
RegionOpConversion<omp::SectionOp>, RegionOpConversion<omp::SimdLoopOp>,
185-
RegionOpConversion<omp::SingleOp>, RegionOpConversion<omp::TaskOp>,
179+
LegalizeDataOpForLLVMTranslation<omp::DataOp>,
180+
LegalizeDataOpForLLVMTranslation<omp::EnterDataOp>,
181+
LegalizeDataOpForLLVMTranslation<omp::ExitDataOp>, ReductionOpConversion,
182+
RegionOpConversion<omp::CriticalOp>, RegionOpConversion<omp::MasterOp>,
183+
ReductionOpConversion, RegionOpConversion<omp::MasterOp>,
184+
RegionOpConversion<omp::ParallelOp>, RegionOpConversion<omp::WsLoopOp>,
185+
RegionOpConversion<omp::SectionsOp>, RegionOpConversion<omp::SectionOp>,
186+
RegionOpConversion<omp::SimdLoopOp>, RegionOpConversion<omp::SingleOp>,
187+
RegionOpConversion<omp::TaskOp>, RegionOpConversion<omp::DataOp>,
186188
RegionLessOpWithVarOperandsConversion<omp::AtomicReadOp>,
187189
RegionLessOpWithVarOperandsConversion<omp::AtomicWriteOp>,
188190
RegionOpWithVarOperandsConversion<omp::AtomicUpdateOp>,
189191
RegionLessOpWithVarOperandsConversion<omp::FlushOp>,
190-
RegionLessOpWithVarOperandsConversion<omp::ThreadprivateOp>,
191-
LegalizeDataOpForLLVMTranslation<omp::DataOp>,
192-
LegalizeDataOpForLLVMTranslation<omp::EnterDataOp>,
193-
LegalizeDataOpForLLVMTranslation<omp::ExitDataOp>>(converter);
192+
RegionLessOpWithVarOperandsConversion<omp::ThreadprivateOp>>(converter);
194193
}
195194

196195
namespace {

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,26 @@ llvm.func @_QPomp_target_data(%a : !llvm.ptr<i32>, %b : !llvm.ptr<i32>, %c : !ll
205205

206206
// -----
207207

208+
// CHECK-LABEL: @_QPomp_target_data_region
209+
// CHECK: (%[[ARG0:.*]]: !llvm.ptr<array<1024 x i32>>, %[[ARG1:.*]]: !llvm.ptr<i32>) {
210+
// CHECK: omp.target_data map((tofrom -> %[[ARG0]] : !llvm.ptr<array<1024 x i32>>)) {
211+
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(10 : i32) : i32
212+
// CHECK: llvm.store %[[VAL_1]], %[[ARG1]] : !llvm.ptr<i32>
213+
// CHECK: omp.terminator
214+
// CHECK: }
215+
// CHECK: llvm.return
216+
217+
llvm.func @_QPomp_target_data_region(%a : !llvm.ptr<array<1024 x i32>>, %i : !llvm.ptr<i32>) {
218+
omp.target_data map((tofrom -> %a : !llvm.ptr<array<1024 x i32>>)) {
219+
%1 = llvm.mlir.constant(10 : i32) : i32
220+
llvm.store %1, %i : !llvm.ptr<i32>
221+
omp.terminator
222+
}
223+
llvm.return
224+
}
225+
226+
// -----
227+
208228
// CHECK-LABEL: @_QPsb
209229
// CHECK: omp.sections
210230
// CHECK: omp.section

0 commit comments

Comments
 (0)