From ef063270631a9b4a02c12ddd4e0d3f2db610f891 Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Thu, 1 Dec 2022 11:18:12 +0100 Subject: [PATCH] [flang] Make sure PointerNullifyDerived is called on pointer array Record type was not correctly retrived so the runtime call was not produced correctly. Fix how the record type is retrived so the correct call is produced. Reviewed By: jeanPerier Differential Revision: https://reviews.llvm.org/D139084 --- flang/include/flang/Optimizer/Dialect/FIRType.h | 3 +++ flang/lib/Optimizer/Builder/MutableBox.cpp | 3 ++- flang/lib/Optimizer/CodeGen/CodeGen.cpp | 13 ++----------- flang/lib/Optimizer/Dialect/FIRType.cpp | 10 ++++++++++ flang/test/Lower/polymorphic.f90 | 16 ++++++++++++++++ 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/flang/include/flang/Optimizer/Dialect/FIRType.h b/flang/include/flang/Optimizer/Dialect/FIRType.h index 0928e85..b4f9528 100644 --- a/flang/include/flang/Optimizer/Dialect/FIRType.h +++ b/flang/include/flang/Optimizer/Dialect/FIRType.h @@ -280,6 +280,9 @@ bool isAllocatableType(mlir::Type ty); /// e.g. !fir.box> bool isBoxedRecordType(mlir::Type ty); +/// Return the nested RecordType if one if found. Return ty otherwise. +mlir::Type getDerivedType(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/Optimizer/Builder/MutableBox.cpp b/flang/lib/Optimizer/Builder/MutableBox.cpp index 7773125..3788554 100644 --- a/flang/lib/Optimizer/Builder/MutableBox.cpp +++ b/flang/lib/Optimizer/Builder/MutableBox.cpp @@ -658,7 +658,8 @@ void fir::factory::disassociateMutableBox(fir::FirOpBuilder &builder, // same as its declared type. auto boxTy = box.getBoxTy().dyn_cast(); auto eleTy = fir::dyn_cast_ptrOrBoxEleTy(boxTy.getEleTy()); - if (auto recTy = eleTy.dyn_cast()) + mlir::Type derivedType = fir::getDerivedType(eleTy); + if (auto recTy = derivedType.dyn_cast()) fir::runtime::genNullifyDerivedType(builder, loc, box.getAddr(), recTy, box.rank()); return; diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index fad77e6..ffc3a88 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -936,17 +936,8 @@ struct DispatchOpConversion : public FIROpConversion { return emitError(loc) << "no binding tables found"; // Get derived type information. - auto declaredType = - llvm::TypeSwitch( - dispatch.getObject().getType().getEleTy()) - .Case( - [](auto p) { - if (auto seq = - p.getEleTy().template dyn_cast()) - return seq.getEleTy(); - return p.getEleTy(); - }) - .Default([](mlir::Type t) { return t; }); + mlir::Type declaredType = + fir::getDerivedType(dispatch.getObject().getType().getEleTy()); assert(declaredType.isa() && "expecting fir.type"); auto recordType = declaredType.dyn_cast(); diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp index 89a806c..27bd29c 100644 --- a/flang/lib/Optimizer/Dialect/FIRType.cpp +++ b/flang/lib/Optimizer/Dialect/FIRType.cpp @@ -198,6 +198,16 @@ bool isa_fir_or_std_type(mlir::Type t) { return isa_fir_type(t) || isa_std_type(t); } +mlir::Type getDerivedType(mlir::Type ty) { + return llvm::TypeSwitch(ty) + .Case([](auto p) { + if (auto seq = p.getEleTy().template dyn_cast()) + return seq.getEleTy(); + return p.getEleTy(); + }) + .Default([](mlir::Type t) { return t; }); +} + mlir::Type dyn_cast_ptrEleTy(mlir::Type t) { return llvm::TypeSwitch(t) .Case>) -> !fir.ptr> ! CHECK: fir.store %[[CONVERT]] to %[[PTR]] : !fir.ref>> + subroutine nullify_pointer_array(a) + type(p3) :: a + nullify(a%p) + end subroutine + +! CHECK-LABEL: func.func @_QMpolymorphic_testPnullify_pointer_array( +! CHECK-SAME: %[[ARG0:.*]]: !fir.ref>>>}>> {fir.bindc_name = "a"}) { +! CHECK: %[[FIELD_P:.*]] = fir.field_index p, !fir.type<_QMpolymorphic_testTp3{p:!fir.class>>>}> +! CHECK: %[[COORD_P:.*]] = fir.coordinate_of %[[ARG0]], %[[FIELD_P]] : (!fir.ref>>>}>>, !fir.field) -> !fir.ref>>>}>>>>> +! CHECK: %[[TYPE_DESC_ADDR:.*]] = fir.address_of(@_QMpolymorphic_testE.dt.p3) : !fir.ref> +! CHECK: %[[CONV_P:.*]] = fir.convert %[[COORD_P]] : (!fir.ref>>>}>>>>>) -> !fir.ref> +! CHECK: %[[CONV_TDESC:.*]] = fir.convert %[[TYPE_DESC_ADDR]] : (!fir.ref>) -> !fir.ref +! CHECK: %[[C1:.*]] = arith.constant 1 : i32 +! CHECK: %[[C0:.*]] = arith.constant 0 : i32 +! CHECK: %{{.*}} = fir.call @_FortranAPointerNullifyDerived(%[[CONV_P]], %[[CONV_TDESC]], %[[C1]], %[[C0]]) {{.*}} : (!fir.ref>, !fir.ref, i32, i32) -> none + end module -- 2.7.4