mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-28 16:11:29 +00:00
[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
This commit is contained in:
parent
436c8f4420
commit
131585ab0f
@ -280,12 +280,6 @@ bool isAllocatableType(mlir::Type ty);
|
||||
/// e.g. !fir.box<!fir.type<derived>>
|
||||
bool isBoxedRecordType(mlir::Type ty);
|
||||
|
||||
/// Return true iff `ty` is a !fir.ref<!fir.box<T>> type.
|
||||
bool isRefBoxType(mlir::Type ty);
|
||||
|
||||
/// Return true iff `ty` is !fir.box<none> type.
|
||||
bool isOpaqueDescType(mlir::Type ty);
|
||||
|
||||
/// Return true iff `ty` is the type of an polymorphic entity or
|
||||
/// value.
|
||||
bool isPolymorphicType(mlir::Type ty);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -938,8 +938,7 @@ mlir::LogicalResult fir::ConvertOp::verify() {
|
||||
(inType.isa<fir::BoxProcType>() && outType.isa<fir::BoxProcType>()) ||
|
||||
(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");
|
||||
|
@ -274,19 +274,6 @@ bool isBoxedRecordType(mlir::Type ty) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isRefBoxType(mlir::Type ty) {
|
||||
if (auto refTy = ty.dyn_cast<fir::ReferenceType>())
|
||||
return refTy.getEleTy().isa<fir::BaseBoxType>();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isOpaqueDescType(mlir::Type ty) {
|
||||
if (auto boxTy = ty.dyn_cast<fir::BoxType>())
|
||||
if (boxTy.getEleTy().isa<mlir::NoneType>())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool isAssumedType(mlir::Type ty) {
|
||||
if (auto boxTy = ty.dyn_cast<fir::BoxType>()) {
|
||||
if (boxTy.getEleTy().isa<mlir::NoneType>())
|
||||
|
@ -141,9 +141,11 @@ module polymorphic_test
|
||||
! CHECK: %[[P:.*]] = fir.alloca !fir.class<!fir.ptr<!fir.array<?xnone>>> {bindc_name = "p", uniq_name = "_QMpolymorphic_testFassociate_up_pointerEp"}
|
||||
! CHECK: %[[FIELD_RP:.*]] = fir.field_index rp, !fir.type<_QMpolymorphic_testTr1{rp:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>
|
||||
! CHECK: %[[COORD_RP:.*]] = fir.coordinate_of %[[ARG0]], %[[FIELD_RP]] : (!fir.class<!fir.type<_QMpolymorphic_testTr1{rp:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
|
||||
! CHECK: %[[LOAD_RP:.*]] = fir.load %[[COORD_RP]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
|
||||
! CHECK: %[[REBOX_RP:.*]] = fir.rebox %[[LOAD_RP]](%{{.*}}) : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, !fir.shift<1>) -> !fir.box<!fir.array<?xf32>>
|
||||
! CHECK: %[[CONV_P:.*]] = fir.convert %[[P]] : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?xnone>>>>) -> !fir.ref<!fir.box<none>>
|
||||
! CHECK: %[[CONV_RP:.*]] = fir.convert %[[COORD_RP]] : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) -> !fir.box<none>
|
||||
! CHECK: %{{.*}} = fir.call @_FortranAPointerAssociate(%[[CONV_P]], %[[CONV_RP]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>) -> none
|
||||
! CHECK: %[[RP_BOX_NONE:.*]] = fir.convert %[[REBOX_RP]] : (!fir.box<!fir.array<?xf32>>) -> !fir.box<none>
|
||||
! CHECK: %{{.*}} = fir.call @_FortranAPointerAssociate(%[[CONV_P]], %[[RP_BOX_NONE]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>) -> none
|
||||
! CHECK: return
|
||||
|
||||
! Test that the fir.dispatch operation is created with the correct pass object
|
||||
|
Loading…
Reference in New Issue
Block a user