[flang-commits] [flang] 67318df - [flang] Handle parent component in user function argument for special cases
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Mon Mar 13 12:48:54 PDT 2023
Author: Valentin Clement
Date: 2023-03-13T20:48:29+01:00
New Revision: 67318df027ca2a652b0a568769d2ad1dc8fa488b
URL: https://github.com/llvm/llvm-project/commit/67318df027ca2a652b0a568769d2ad1dc8fa488b
DIFF: https://github.com/llvm/llvm-project/commit/67318df027ca2a652b0a568769d2ad1dc8fa488b.diff
LOG: [flang] Handle parent component in user function argument for special cases
In some cases the argument is already handled by a fir.rebox operation. Just
adapat the type to match the parent component in that case.
Depends on D145928
Differential Revision: https://reviews.llvm.org/D145931
Added:
Modified:
flang/lib/Lower/ConvertExpr.cpp
flang/test/Lower/polymorphic.f90
Removed:
################################################################################
diff --git a/flang/lib/Lower/ConvertExpr.cpp b/flang/lib/Lower/ConvertExpr.cpp
index a64bc54bd0a7..5396feb2a7c2 100644
--- a/flang/lib/Lower/ConvertExpr.cpp
+++ b/flang/lib/Lower/ConvertExpr.cpp
@@ -2693,32 +2693,36 @@ class ScalarExprLowering {
if (box.getType().isa<fir::BoxType>() &&
fir::isPolymorphicType(argTy)) {
+ mlir::Type actualTy = argTy;
+ if (Fortran::lower::isParentComponent(*expr))
+ actualTy = fir::BoxType::get(converter.genType(*expr));
// Rebox can only be performed on a present argument.
if (arg.isOptional()) {
mlir::Value isPresent =
genActualIsPresentTest(builder, loc, box);
box = builder
- .genIfOp(loc, {argTy}, isPresent,
+ .genIfOp(loc, {actualTy}, isPresent,
/*withElseRegion=*/true)
.genThen([&]() {
- auto rebox = builder
- .create<fir::ReboxOp>(
- loc, argTy, box, mlir::Value{},
- /*slice=*/mlir::Value{})
- .getResult();
+ auto rebox =
+ builder
+ .create<fir::ReboxOp>(
+ loc, actualTy, box, mlir::Value{},
+ /*slice=*/mlir::Value{})
+ .getResult();
builder.create<fir::ResultOp>(loc, rebox);
})
.genElse([&]() {
auto absent =
- builder.create<fir::AbsentOp>(loc, argTy)
+ builder.create<fir::AbsentOp>(loc, actualTy)
.getResult();
builder.create<fir::ResultOp>(loc, absent);
})
.getResults()[0];
} else {
- box =
- builder.create<fir::ReboxOp>(loc, argTy, box, mlir::Value{},
- /*slice=*/mlir::Value{});
+ box = builder.create<fir::ReboxOp>(loc, actualTy, box,
+ mlir::Value{},
+ /*slice=*/mlir::Value{});
}
} else if (Fortran::lower::isParentComponent(*expr)) {
fir::ExtendedValue newExv =
diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90
index ddd23ffab647..6bb9f735f5d9 100644
--- a/flang/test/Lower/polymorphic.f90
+++ b/flang/test/Lower/polymorphic.f90
@@ -1067,6 +1067,25 @@ subroutine test_parent_comp_normal(a)
! CHECK: %[[CONV:.*]] = fir.convert %[[REBOX]] : (!fir.box<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>) -> !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>
! CHECK: fir.call @_QMpolymorphic_testPprint(%[[CONV]]) {{.*}} : (!fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>) -> ()
+ subroutine takes_p1_opt(a)
+ class(p1), optional :: a
+ end subroutine
+
+ subroutine test_parent_comp_opt(p)
+ type(p2), allocatable :: p
+ allocate(p)
+ call takes_p1_opt(p%p1)
+ end subroutine
+
+! CHECK-LABEL: func.func @_QMpolymorphic_testPtest_parent_comp_opt(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.type<_QMpolymorphic_testTp2{a:i32,b:i32,c:f32}>>>> {fir.bindc_name = "p"}) {
+! CHECK: %[[LOAD_ARG0:.*]] = fir.load %[[ARG0]] : !fir.ref<!fir.box<!fir.heap<!fir.type<_QMpolymorphic_testTp2{a:i32,b:i32,c:f32}>>>>
+! CHECK: %[[RES:.*]] = fir.if %{{.*}} -> (!fir.box<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>) {
+! CHECK: %[[REBOX:.*]] = fir.rebox %[[LOAD_ARG0:.*]] : (!fir.box<!fir.heap<!fir.type<_QMpolymorphic_testTp2{a:i32,b:i32,c:f32}>>>) -> !fir.box<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>
+! CHECK: fir.result %[[REBOX]] : !fir.box<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>
+! CHECK: %[[CONV:.*]] = fir.convert %[[RES]] : (!fir.box<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>) -> !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>
+! CHECK: fir.call @_QMpolymorphic_testPtakes_p1_opt(%[[CONV]]) {{.*}} : (!fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>) -> ()
+
end module
program test
More information about the flang-commits
mailing list