From 131585ab0fd0ed43d6fd7325ff75d6fa6e623a4b Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Thu, 1 Dec 2022 11:12:01 +0100 Subject: [PATCH] [flang] Use genExprBox for the rhs when calling PointerAssociate for unlimited polymorphic pointer In D139019 the assumption was made that the rhs was also the MutableBox but this is not a constraint. Use genExprBox instead. Also the allowed conversion in D139019 was not correct. Remoed it since it is not needed anymore. Reviewed By: jeanPerier Differential Revision: https://reviews.llvm.org/D139081 --- flang/include/flang/Optimizer/Dialect/FIRType.h | 6 ------ flang/lib/Lower/Bridge.cpp | 3 ++- flang/lib/Optimizer/Dialect/FIROps.cpp | 3 +-- flang/lib/Optimizer/Dialect/FIRType.cpp | 13 ------------- flang/test/Lower/polymorphic.f90 | 6 ++++-- 5 files changed, 7 insertions(+), 24 deletions(-) diff --git a/flang/include/flang/Optimizer/Dialect/FIRType.h b/flang/include/flang/Optimizer/Dialect/FIRType.h index ae50d08..0928e85 100644 --- a/flang/include/flang/Optimizer/Dialect/FIRType.h +++ b/flang/include/flang/Optimizer/Dialect/FIRType.h @@ -280,12 +280,6 @@ bool isAllocatableType(mlir::Type ty); /// e.g. !fir.box> bool isBoxedRecordType(mlir::Type ty); -/// Return true iff `ty` is a !fir.ref> type. -bool isRefBoxType(mlir::Type ty); - -/// Return true iff `ty` is !fir.box type. -bool isOpaqueDescType(mlir::Type ty); - /// Return true iff `ty` is the type of an polymorphic entity or /// value. bool isPolymorphicType(mlir::Type ty); diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index c98d838..ec380b2 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -2718,7 +2718,8 @@ private: // course base_addr might need to be updated. if (lhsType && lhsType->IsUnlimitedPolymorphic()) { mlir::Value lhs = genExprMutableBox(loc, assign.lhs).getAddr(); - mlir::Value rhs = genExprMutableBox(loc, assign.rhs).getAddr(); + mlir::Value rhs = + fir::getBase(genExprBox(loc, assign.rhs, stmtCtx)); Fortran::lower::genPointerAssociate(*builder, loc, lhs, rhs); return; } diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp index 0adeb6bc..6eb9be5 100644 --- a/flang/lib/Optimizer/Dialect/FIROps.cpp +++ b/flang/lib/Optimizer/Dialect/FIROps.cpp @@ -938,8 +938,7 @@ mlir::LogicalResult fir::ConvertOp::verify() { (inType.isa() && outType.isa()) || (fir::isa_complex(inType) && fir::isa_complex(outType)) || (fir::isBoxedRecordType(inType) && fir::isPolymorphicType(outType)) || - (fir::isPolymorphicType(inType) && fir::isPolymorphicType(outType)) || - (fir::isRefBoxType(inType) && fir::isOpaqueDescType(outType))) + (fir::isPolymorphicType(inType) && fir::isPolymorphicType(outType))) return mlir::success(); llvm::errs() << inType << " / " << outType << "\n"; return emitOpError("invalid type conversion"); diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp index a2906e8..89a806c 100644 --- a/flang/lib/Optimizer/Dialect/FIRType.cpp +++ b/flang/lib/Optimizer/Dialect/FIRType.cpp @@ -274,19 +274,6 @@ bool isBoxedRecordType(mlir::Type ty) { return false; } -bool isRefBoxType(mlir::Type ty) { - if (auto refTy = ty.dyn_cast()) - return refTy.getEleTy().isa(); - return false; -} - -bool isOpaqueDescType(mlir::Type ty) { - if (auto boxTy = ty.dyn_cast()) - if (boxTy.getEleTy().isa()) - return true; - return false; -} - static bool isAssumedType(mlir::Type ty) { if (auto boxTy = ty.dyn_cast()) { if (boxTy.getEleTy().isa()) diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90 index 662aca9..a1e4b59 100644 --- a/flang/test/Lower/polymorphic.f90 +++ b/flang/test/Lower/polymorphic.f90 @@ -141,9 +141,11 @@ module polymorphic_test ! CHECK: %[[P:.*]] = fir.alloca !fir.class>> {bindc_name = "p", uniq_name = "_QMpolymorphic_testFassociate_up_pointerEp"} ! CHECK: %[[FIELD_RP:.*]] = fir.field_index rp, !fir.type<_QMpolymorphic_testTr1{rp:!fir.box>>}> ! CHECK: %[[COORD_RP:.*]] = fir.coordinate_of %[[ARG0]], %[[FIELD_RP]] : (!fir.class>>}>>, !fir.field) -> !fir.ref>>> +! CHECK: %[[LOAD_RP:.*]] = fir.load %[[COORD_RP]] : !fir.ref>>> +! CHECK: %[[REBOX_RP:.*]] = fir.rebox %[[LOAD_RP]](%{{.*}}) : (!fir.box>>, !fir.shift<1>) -> !fir.box> ! CHECK: %[[CONV_P:.*]] = fir.convert %[[P]] : (!fir.ref>>>) -> !fir.ref> -! CHECK: %[[CONV_RP:.*]] = fir.convert %[[COORD_RP]] : (!fir.ref>>>) -> !fir.box -! CHECK: %{{.*}} = fir.call @_FortranAPointerAssociate(%[[CONV_P]], %[[CONV_RP]]) {{.*}} : (!fir.ref>, !fir.box) -> none +! CHECK: %[[RP_BOX_NONE:.*]] = fir.convert %[[REBOX_RP]] : (!fir.box>) -> !fir.box +! CHECK: %{{.*}} = fir.call @_FortranAPointerAssociate(%[[CONV_P]], %[[RP_BOX_NONE]]) {{.*}} : (!fir.ref>, !fir.box) -> none ! CHECK: return ! Test that the fir.dispatch operation is created with the correct pass object -- 2.7.4