Skip to content

Commit 03289dc

Browse files
committed
[flang][openacc] Add missing piece to translate to LLVM IR dialect
Add missing pieces to translate handle OpenACC dialect in the translation. Depends on D147825 Reviewed By: PeteSteinfeld, razvanlupusoru Differential Revision: https://reviews.llvm.org/D147828
1 parent 68bcd64 commit 03289dc

File tree

6 files changed

+75
-3
lines changed

6 files changed

+75
-3
lines changed

flang/lib/Optimizer/CodeGen/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ add_flang_library(FIRCodeGen
2323
MLIRMathToFuncs
2424
MLIRMathToLLVM
2525
MLIRMathToLibm
26+
MLIROpenACCToLLVM
2627
MLIROpenMPToLLVM
2728
MLIRBuiltinToLLVMIRTranslation
2829
MLIRLLVMToLLVMIRTranslation

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,11 @@
3131
#include "mlir/Conversion/MathToFuncs/MathToFuncs.h"
3232
#include "mlir/Conversion/MathToLLVM/MathToLLVM.h"
3333
#include "mlir/Conversion/MathToLibm/MathToLibm.h"
34+
#include "mlir/Conversion/OpenACCToLLVM/ConvertOpenACCToLLVM.h"
3435
#include "mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h"
36+
#include "mlir/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.h"
3537
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
38+
#include "mlir/Dialect/OpenACC/OpenACC.h"
3639
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
3740
#include "mlir/IR/BuiltinTypes.h"
3841
#include "mlir/IR/Matchers.h"
@@ -3640,6 +3643,29 @@ struct MustBeDeadConversion : public FIROpConversion<FromOp> {
36403643
}
36413644
};
36423645

3646+
struct UnrealizedConversionCastOpConversion
3647+
: public FIROpConversion<mlir::UnrealizedConversionCastOp> {
3648+
using FIROpConversion::FIROpConversion;
3649+
3650+
mlir::LogicalResult
3651+
matchAndRewrite(mlir::UnrealizedConversionCastOp op, OpAdaptor adaptor,
3652+
mlir::ConversionPatternRewriter &rewriter) const override {
3653+
assert(op.getOutputs().getTypes().size() == 1 && "expect a single type");
3654+
mlir::Type convertedType = convertType(op.getOutputs().getTypes()[0]);
3655+
if (convertedType == adaptor.getInputs().getTypes()[0]) {
3656+
rewriter.replaceOp(op, adaptor.getInputs());
3657+
return mlir::success();
3658+
}
3659+
3660+
convertedType = adaptor.getInputs().getTypes()[0];
3661+
if (convertedType == op.getOutputs().getType()[0]) {
3662+
rewriter.replaceOp(op, adaptor.getInputs());
3663+
return mlir::success();
3664+
}
3665+
return mlir::failure();
3666+
}
3667+
};
3668+
36433669
struct ShapeOpConversion : public MustBeDeadConversion<fir::ShapeOp> {
36443670
using MustBeDeadConversion::MustBeDeadConversion;
36453671
};
@@ -3762,9 +3788,11 @@ class FIRToLLVMLowering
37623788
SliceOpConversion, StoreOpConversion, StringLitOpConversion,
37633789
SubcOpConversion, TypeDescOpConversion, UnboxCharOpConversion,
37643790
UnboxProcOpConversion, UndefOpConversion, UnreachableOpConversion,
3765-
XArrayCoorOpConversion, XEmboxOpConversion, XReboxOpConversion,
3766-
ZeroOpConversion>(typeConverter, options);
3791+
UnrealizedConversionCastOpConversion, XArrayCoorOpConversion,
3792+
XEmboxOpConversion, XReboxOpConversion, ZeroOpConversion>(typeConverter,
3793+
options);
37673794
mlir::populateFuncToLLVMConversionPatterns(typeConverter, pattern);
3795+
mlir::populateOpenACCToLLVMConversionPatterns(typeConverter, pattern);
37683796
mlir::populateOpenMPToLLVMConversionPatterns(typeConverter, pattern);
37693797
mlir::arith::populateArithToLLVMConversionPatterns(typeConverter, pattern);
37703798
mlir::cf::populateControlFlowToLLVMConversionPatterns(typeConverter,
@@ -3781,6 +3809,7 @@ class FIRToLLVMLowering
37813809
// legalize conversion of OpenMP operations without regions.
37823810
mlir::configureOpenMPToLLVMConversionLegality(target, typeConverter);
37833811
target.addLegalDialect<mlir::omp::OpenMPDialect>();
3812+
target.addLegalDialect<mlir::acc::OpenACCDialect>();
37843813

37853814
// required NOPs for applying a full conversion
37863815
target.addLegalOp<mlir::ModuleOp>();

flang/lib/Optimizer/Support/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ add_flang_library(FIRSupport
1313
LINK_LIBS
1414
${dialect_libs}
1515
MLIRBuiltinToLLVMIRTranslation
16+
MLIROpenACCToLLVMIRTranslation
1617
MLIROpenMPToLLVMIRTranslation
1718
MLIRLLVMToLLVMIRTranslation
1819
MLIRTargetLLVMIRExport

flang/lib/Optimizer/Support/InitFIR.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
#include "flang/Optimizer/Support/InitFIR.h"
1010
#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
1111
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
12+
#include "mlir/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.h"
1213
#include "mlir/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.h"
1314

1415
void fir::support::registerLLVMTranslation(mlir::MLIRContext &context) {
1516
mlir::DialectRegistry registry;
17+
// Register OpenACC dialect interface here as well.
18+
registerOpenACCDialectTranslation(registry);
1619
// Register OpenMP dialect interface here as well.
1720
registerOpenMPDialectTranslation(registry);
1821
// Register LLVM-IR dialect interface.

flang/lib/Optimizer/Transforms/OpenACC/OpenACCDataOperandConversion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ void OpenACCDataOperandConversion::runOnOperation() {
111111
ConversionTarget target(*context);
112112
target.addLegalDialect<fir::FIROpsDialect>();
113113
target.addLegalDialect<LLVM::LLVMDialect>();
114-
target.addLegalOp<UnrealizedConversionCastOp>();
114+
target.addLegalOp<mlir::UnrealizedConversionCastOp>();
115115

116116
auto allDataOperandsAreConverted = [](ValueRange operands) {
117117
for (Value operand : operands) {

flang/test/Transforms/OpenACC/convert-data-operands-to-llvmir.fir

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
// RUN: fir-opt -fir-openacc-data-operand-conversion='use-opaque-pointers=1' -split-input-file %s | FileCheck %s
2+
// RUN: fir-opt -fir-openacc-data-operand-conversion='use-opaque-pointers=1' -split-input-file %s | fir-opt --fir-to-llvm-ir | FileCheck %s --check-prefix=LLVMIR
3+
4+
fir.global internal @_QFEa : !fir.array<10xf32> {
5+
%0 = fir.undefined !fir.array<10xf32>
6+
fir.has_value %0 : !fir.array<10xf32>
7+
}
28

39
func.func @_QQsub1() attributes {fir.bindc_name = "arr"} {
410
%0 = fir.address_of(@_QFEa) : !fir.ref<!fir.array<10xf32>>
@@ -13,8 +19,17 @@ func.func @_QQsub1() attributes {fir.bindc_name = "arr"} {
1319
// CHECK: %[[CAST:.*]] = builtin.unrealized_conversion_cast %[[ADDR]] : !fir.ref<!fir.array<10xf32>> to !llvm.ptr<array<10 x f32>>
1420
// CHECK: acc.data copy(%[[CAST]] : !llvm.ptr<array<10 x f32>>)
1521

22+
// LLVMIR-LABEL: llvm.func @_QQsub1() attributes {fir.bindc_name = "arr"} {
23+
// LLVMIR: %[[ADDR:.*]] = llvm.mlir.addressof @_QFEa : !llvm.ptr<array<10 x f32>>
24+
// LLVMIR: acc.data copy(%[[ADDR]] : !llvm.ptr<array<10 x f32>>) {
25+
1626
// -----
1727

28+
fir.global internal @_QFEa : !fir.array<10xf32> {
29+
%0 = fir.undefined !fir.array<10xf32>
30+
fir.has_value %0 : !fir.array<10xf32>
31+
}
32+
1833
func.func @_QQsub_enter_exit() attributes {fir.bindc_name = "a"} {
1934
%0 = fir.address_of(@_QFEa) : !fir.ref<!fir.array<10xf32>>
2035
acc.enter_data copyin(%0 : !fir.ref<!fir.array<10xf32>>)
@@ -29,8 +44,18 @@ func.func @_QQsub_enter_exit() attributes {fir.bindc_name = "a"} {
2944
// CHECK: %[[CAST1:.*]] = builtin.unrealized_conversion_cast %[[ADDR]] : !fir.ref<!fir.array<10xf32>> to !llvm.ptr<array<10 x f32>>
3045
// CHECK: acc.exit_data copyout(%[[CAST1]] : !llvm.ptr<array<10 x f32>>)
3146

47+
// LLVMIR-LABEL: llvm.func @_QQsub_enter_exit() attributes {fir.bindc_name = "a"} {
48+
// LLVMIR: %[[ADDR:.*]] = llvm.mlir.addressof @_QFEa : !llvm.ptr<array<10 x f32>>
49+
// LLVMIR: acc.enter_data copyin(%[[ADDR]] : !llvm.ptr<array<10 x f32>>)
50+
// LLVMIR: acc.exit_data copyout(%[[ADDR]] : !llvm.ptr<array<10 x f32>>)
51+
3252
// -----
3353

54+
fir.global internal @_QFEa : !fir.array<10xf32> {
55+
%0 = fir.undefined !fir.array<10xf32>
56+
fir.has_value %0 : !fir.array<10xf32>
57+
}
58+
3459
func.func @_QQsub_update() attributes {fir.bindc_name = "a"} {
3560
%0 = fir.address_of(@_QFEa) : !fir.ref<!fir.array<10xf32>>
3661
acc.update device(%0 : !fir.ref<!fir.array<10xf32>>)
@@ -42,8 +67,17 @@ func.func @_QQsub_update() attributes {fir.bindc_name = "a"} {
4267
// CHECK: %[[CAST:.*]] = builtin.unrealized_conversion_cast %[[ADDR]] : !fir.ref<!fir.array<10xf32>> to !llvm.ptr<array<10 x f32>>
4368
// CHECK: acc.update device(%[[CAST]] : !llvm.ptr<array<10 x f32>>)
4469

70+
// LLVMIR-LABEL: llvm.func @_QQsub_update() attributes {fir.bindc_name = "a"} {
71+
// LLVMIR: %[[ADDR:.*]] = llvm.mlir.addressof @_QFEa : !llvm.ptr<array<10 x f32>>
72+
// LLVMIR: acc.update device(%[[ADDR]] : !llvm.ptr<array<10 x f32>>)
73+
4574
// -----
4675

76+
fir.global internal @_QFEa : !fir.array<10xf32> {
77+
%0 = fir.undefined !fir.array<10xf32>
78+
fir.has_value %0 : !fir.array<10xf32>
79+
}
80+
4781
func.func @_QQsub_parallel() attributes {fir.bindc_name = "test"} {
4882
%0 = fir.address_of(@_QFEa) : !fir.ref<!fir.array<10xf32>>
4983
%1 = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFEi"}
@@ -82,3 +116,7 @@ func.func @_QQsub_parallel() attributes {fir.bindc_name = "test"} {
82116
// CHECK: %[[ADDR:.*]] = fir.address_of(@_QFEa) : !fir.ref<!fir.array<10xf32>>
83117
// CHECK: %[[CAST:.*]] = builtin.unrealized_conversion_cast %[[ADDR]] : !fir.ref<!fir.array<10xf32>> to !llvm.ptr<array<10 x f32>>
84118
// CHECK: acc.parallel copyin(%[[CAST]]: !llvm.ptr<array<10 x f32>>) {
119+
120+
// LLVMIR-LABEL: llvm.func @_QQsub_parallel() attributes {fir.bindc_name = "test"} {
121+
// LLVMIR: %[[ADDR:.*]] = llvm.mlir.addressof @_QFEa : !llvm.ptr<array<10 x f32>>
122+
// LLVMIR: acc.parallel copyin(%[[ADDR]]: !llvm.ptr<array<10 x f32>>) {

0 commit comments

Comments
 (0)