[flang-commits] [flang] 545db9c - [flang] Handle polymorphic argument when expecting boxed derived-type
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Mon Nov 28 11:56:36 PST 2022
Author: Valentin Clement
Date: 2022-11-28T20:56:27+01:00
New Revision: 545db9c41fba7877cb7a935ae571ed0a1be5396c
URL: https://github.com/llvm/llvm-project/commit/545db9c41fba7877cb7a935ae571ed0a1be5396c
DIFF: https://github.com/llvm/llvm-project/commit/545db9c41fba7877cb7a935ae571ed0a1be5396c.diff
LOG: [flang] Handle polymorphic argument when expecting boxed derived-type
Perform a rebox instead of a convert operation when the input type is
polymorphic and the output type is a boxed derived-type.
Reviewed By: PeteSteinfeld
Differential Revision: https://reviews.llvm.org/D138831
Added:
Modified:
flang/lib/Optimizer/Builder/FIRBuilder.cpp
flang/test/Lower/polymorphic.f90
Removed:
################################################################################
diff --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
index 920b4de96740b..28cfb20c6eea2 100644
--- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp
+++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
@@ -337,12 +337,12 @@ fir::FirOpBuilder::convertWithSemantics(mlir::Location loc, mlir::Type toTy,
return create<fir::BoxAddrOp>(loc, toTy, val);
}
- if (fir::isPolymorphicType(fromTy) &&
- (fir::isAllocatableType(fromTy) || fir::isPointerType(fromTy)) &&
- fir::isPolymorphicType(toTy)) {
+ if ((fir::isPolymorphicType(fromTy) &&
+ (fir::isAllocatableType(fromTy) || fir::isPointerType(fromTy)) &&
+ fir::isPolymorphicType(toTy)) ||
+ (fir::isPolymorphicType(fromTy) && toTy.isa<fir::BoxType>()))
return create<fir::ReboxOp>(loc, toTy, val, mlir::Value{},
/*slice=*/mlir::Value{});
- }
return createConvert(loc, toTy, val);
}
diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90
index 2edc1669d6939..946f6f0b07f61 100644
--- a/flang/test/Lower/polymorphic.f90
+++ b/flang/test/Lower/polymorphic.f90
@@ -165,4 +165,21 @@ subroutine call_get_tmp(c)
! CHECK-SAME: %[[ARG0:.*]]: !fir.class<!fir.type<_QMpolymorphic_testTc1{tmp:!fir.char<1,2>}>> {fir.bindc_name = "c"}) {
! CHECK: %{{.*}} = fir.dispatch "get_tmp"(%[[ARG0]] : !fir.class<!fir.type<_QMpolymorphic_testTc1{tmp:!fir.char<1,2>}>>) (%{{.*}}, %{{.*}}, %[[ARG0]] : !fir.ref<!fir.char<1,2>>, index, !fir.class<!fir.type<_QMpolymorphic_testTc1{tmp:!fir.char<1,2>}>>) -> !fir.boxchar<1> {pass_arg_pos = 2 : i32}
+ subroutine sub_with_type_array(a)
+ type(p1) :: a(:)
+ end subroutine
+
+! CHECK-LABEL: func.func @_QMpolymorphic_testPsub_with_type_array(%{{.*}}: !fir.box<!fir.array<?x!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>> {fir.bindc_name = "a"})
+
+ subroutine call_sub_with_type_array(p)
+ class(p1), pointer :: p(:)
+ call sub_with_type_array(p)
+ end subroutine
+
+! CHECK-LABEL: func.func @_QMpolymorphic_testPcall_sub_with_type_array(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>>>> {fir.bindc_name = "p"}) {
+! CHECK: %[[CLASS:.*]] = fir.load %[[ARG0]] : !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>>>>
+! CHECK: %[[REBOX:.*]] = fir.rebox %[[CLASS]] : (!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>>>) -> !fir.box<!fir.array<?x!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>>
+! CHECK: fir.call @_QMpolymorphic_testPsub_with_type_array(%[[REBOX]]) {{.*}} : (!fir.box<!fir.array<?x!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>>) -> ()
+
end module
More information about the flang-commits
mailing list