Skip to content

Commit a536d3e

Browse files
committed
[MLIR][OpenMP] Add conversion support from FIR to LLVM Dialect for OMP Target Data directives
This enables conversion of OpenMP Target Data, Enter Data and Exit Data from FIR Dialect to LLVM IR Dialect. Differential Revision: https://reviews.llvm.org/D142629
1 parent 6f15919 commit a536d3e

File tree

3 files changed

+62
-8
lines changed

3 files changed

+62
-8
lines changed

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,30 @@ func.func @_QPsimd1(%arg0: !fir.ref<i32> {fir.bindc_name = "n"}, %arg1: !fir.ref
218218
// CHECK: llvm.return
219219
// CHECK: }
220220

221+
func.func @_QPomp_target_data() {
222+
%0 = fir.alloca !fir.array<1024xi32> {bindc_name = "a", uniq_name = "_QFomp_target_dataEa"}
223+
%1 = fir.alloca !fir.array<1024xi32> {bindc_name = "b", uniq_name = "_QFomp_target_dataEb"}
224+
%2 = fir.alloca !fir.array<1024xi32> {bindc_name = "c", uniq_name = "_QFomp_target_dataEc"}
225+
%3 = fir.alloca !fir.array<1024xi32> {bindc_name = "d", uniq_name = "_QFomp_target_dataEd"}
226+
omp.target_enter_data map((to -> %0 : !fir.ref<!fir.array<1024xi32>>), (to -> %1 : !fir.ref<!fir.array<1024xi32>>), (always, alloc -> %2 : !fir.ref<!fir.array<1024xi32>>))
227+
omp.target_exit_data map((from -> %0 : !fir.ref<!fir.array<1024xi32>>), (from -> %1 : !fir.ref<!fir.array<1024xi32>>), (release -> %2 : !fir.ref<!fir.array<1024xi32>>), (always, delete -> %3 : !fir.ref<!fir.array<1024xi32>>))
228+
return
229+
}
230+
231+
// CHECK-LABEL: llvm.func @_QPomp_target_data() {
232+
// CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1 : i64) : i64
233+
// 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 = "_QFomp_target_dataEa"} : (i64) -> !llvm.ptr<array<1024 x i32>>
234+
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i64) : i64
235+
// CHECK: %[[VAL_3:.*]] = llvm.alloca %[[VAL_2]] x !llvm.array<1024 x i32> {bindc_name = "b", in_type = !fir.array<1024xi32>, operand_segment_sizes = array<i32: 0, 0>, uniq_name = "_QFomp_target_dataEb"} : (i64) -> !llvm.ptr<array<1024 x i32>>
236+
// CHECK: %[[VAL_4:.*]] = llvm.mlir.constant(1 : i64) : i64
237+
// CHECK: %[[VAL_5:.*]] = llvm.alloca %[[VAL_4]] x !llvm.array<1024 x i32> {bindc_name = "c", in_type = !fir.array<1024xi32>, operand_segment_sizes = array<i32: 0, 0>, uniq_name = "_QFomp_target_dataEc"} : (i64) -> !llvm.ptr<array<1024 x i32>>
238+
// CHECK: %[[VAL_6:.*]] = llvm.mlir.constant(1 : i64) : i64
239+
// CHECK: %[[VAL_7:.*]] = llvm.alloca %[[VAL_6]] x !llvm.array<1024 x i32> {bindc_name = "d", in_type = !fir.array<1024xi32>, operand_segment_sizes = array<i32: 0, 0>, uniq_name = "_QFomp_target_dataEd"} : (i64) -> !llvm.ptr<array<1024 x i32>>
240+
// CHECK: omp.target_enter_data map((to -> %[[VAL_1]] : !llvm.ptr<array<1024 x i32>>), (to -> %[[VAL_3]] : !llvm.ptr<array<1024 x i32>>), (always, alloc -> %[[VAL_5]] : !llvm.ptr<array<1024 x i32>>))
241+
// CHECK: omp.target_exit_data map((from -> %[[VAL_1]] : !llvm.ptr<array<1024 x i32>>), (from -> %[[VAL_3]] : !llvm.ptr<array<1024 x i32>>), (release -> %[[VAL_5]] : !llvm.ptr<array<1024 x i32>>), (always, delete -> %[[VAL_7]] : !llvm.ptr<array<1024 x i32>>))
242+
// CHECK: llvm.return
243+
// CHECK: }
244+
221245
func.func @_QPsimdloop_with_nested_loop() {
222246
%0 = fir.alloca i32 {adapt.valuebyref}
223247
%1 = fir.alloca !fir.array<10xi32> {bindc_name = "a", uniq_name = "_QFsimdloop_with_nested_loopEa"}

mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,18 @@ struct ReductionOpConversion : public ConvertOpToLLVMPattern<omp::ReductionOp> {
9797
return success();
9898
}
9999
};
100+
101+
template <typename Op>
102+
struct LegalizeDataOpForLLVMTranslation : public ConvertOpToLLVMPattern<Op> {
103+
using ConvertOpToLLVMPattern<Op>::ConvertOpToLLVMPattern;
104+
LogicalResult
105+
matchAndRewrite(Op curOp, typename Op::Adaptor adaptor,
106+
ConversionPatternRewriter &rewriter) const override {
107+
rewriter.replaceOpWithNewOp<Op>(curOp, TypeRange(), adaptor.getOperands(),
108+
curOp.getOperation()->getAttrs());
109+
return success();
110+
}
111+
};
100112
} // namespace
101113

102114
void mlir::configureOpenMPToLLVMConversionLegality(
@@ -109,13 +121,14 @@ void mlir::configureOpenMPToLLVMConversionLegality(
109121
typeConverter.isLegal(op->getOperandTypes()) &&
110122
typeConverter.isLegal(op->getResultTypes());
111123
});
112-
target
113-
.addDynamicallyLegalOp<mlir::omp::AtomicReadOp, mlir::omp::AtomicWriteOp,
114-
mlir::omp::FlushOp, mlir::omp::ThreadprivateOp>(
115-
[&](Operation *op) {
116-
return typeConverter.isLegal(op->getOperandTypes()) &&
117-
typeConverter.isLegal(op->getResultTypes());
118-
});
124+
target.addDynamicallyLegalOp<mlir::omp::AtomicReadOp,
125+
mlir::omp::AtomicWriteOp, mlir::omp::FlushOp,
126+
mlir::omp::ThreadprivateOp, mlir::omp::DataOp,
127+
mlir::omp::EnterDataOp, mlir::omp::ExitDataOp>(
128+
[&](Operation *op) {
129+
return typeConverter.isLegal(op->getOperandTypes()) &&
130+
typeConverter.isLegal(op->getResultTypes());
131+
});
119132
target.addDynamicallyLegalOp<mlir::omp::ReductionOp>([&](Operation *op) {
120133
return typeConverter.isLegal(op->getOperandTypes());
121134
});
@@ -132,7 +145,10 @@ void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
132145
RegionLessOpWithVarOperandsConversion<omp::AtomicReadOp>,
133146
RegionLessOpWithVarOperandsConversion<omp::AtomicWriteOp>,
134147
RegionLessOpWithVarOperandsConversion<omp::FlushOp>,
135-
RegionLessOpWithVarOperandsConversion<omp::ThreadprivateOp>>(converter);
148+
RegionLessOpWithVarOperandsConversion<omp::ThreadprivateOp>,
149+
LegalizeDataOpForLLVMTranslation<omp::DataOp>,
150+
LegalizeDataOpForLLVMTranslation<omp::EnterDataOp>,
151+
LegalizeDataOpForLLVMTranslation<omp::ExitDataOp>>(converter);
136152
}
137153

138154
namespace {

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,17 @@ func.func @simdloop_block_arg(%val : i32, %ub : i32, %i : index) {
145145
}
146146
return
147147
}
148+
149+
// -----
150+
151+
// CHECK-LABEL: @_QPomp_target_data
152+
// CHECK: (%[[ARG0:.*]]: !llvm.ptr<i32>, %[[ARG1:.*]]: !llvm.ptr<i32>, %[[ARG2:.*]]: !llvm.ptr<i32>, %[[ARG3:.*]]: !llvm.ptr<i32>)
153+
// CHECK: omp.target_enter_data map((to -> %[[ARG0]] : !llvm.ptr<i32>), (to -> %[[ARG1]] : !llvm.ptr<i32>), (always, alloc -> %[[ARG2]] : !llvm.ptr<i32>))
154+
// CHECK: omp.target_exit_data map((from -> %[[ARG0]] : !llvm.ptr<i32>), (from -> %[[ARG1]] : !llvm.ptr<i32>), (release -> %[[ARG2]] : !llvm.ptr<i32>), (always, delete -> %[[ARG3]] : !llvm.ptr<i32>))
155+
// CHECK: llvm.return
156+
157+
llvm.func @_QPomp_target_data(%a : !llvm.ptr<i32>, %b : !llvm.ptr<i32>, %c : !llvm.ptr<i32>, %d : !llvm.ptr<i32>) {
158+
omp.target_enter_data map((to -> %a : !llvm.ptr<i32>), (to -> %b : !llvm.ptr<i32>), (always, alloc -> %c : !llvm.ptr<i32>))
159+
omp.target_exit_data map((from -> %a : !llvm.ptr<i32>), (from -> %b : !llvm.ptr<i32>), (release -> %c : !llvm.ptr<i32>), (always, delete -> %d : !llvm.ptr<i32>))
160+
llvm.return
161+
}

0 commit comments

Comments
 (0)