[flang-commits] [flang] 1d837cf - [flang] Do not try to rebox for assumed type
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Thu Mar 16 09:17:26 PDT 2023
Author: Valentin Clement
Date: 2023-03-16T17:16:45+01:00
New Revision: 1d837cf2cf17eee2be0d3a9b6dd7e54c03d67175
URL: https://github.com/llvm/llvm-project/commit/1d837cf2cf17eee2be0d3a9b6dd7e54c03d67175
DIFF: https://github.com/llvm/llvm-project/commit/1d837cf2cf17eee2be0d3a9b6dd7e54c03d67175.diff
LOG: [flang] Do not try to rebox for assumed type
Just use conversion from assuemd type to assumed type
because a rebox needs more information that are not available
with assumed type.
Also use `isAssumedType` instead of `isBoxNone` since assumed
type can have sequence information.
Depends on D146207
Reviewed By: PeteSteinfeld
Differential Revision: https://reviews.llvm.org/D146209
Added:
Modified:
flang/include/flang/Optimizer/Dialect/FIRType.h
flang/lib/Lower/ConvertExpr.cpp
flang/lib/Optimizer/Builder/FIRBuilder.cpp
flang/lib/Optimizer/Dialect/FIRType.cpp
flang/test/Lower/assumed-type.f90
Removed:
################################################################################
diff --git a/flang/include/flang/Optimizer/Dialect/FIRType.h b/flang/include/flang/Optimizer/Dialect/FIRType.h
index 83486ff614101..942c789bcb899 100644
--- a/flang/include/flang/Optimizer/Dialect/FIRType.h
+++ b/flang/include/flang/Optimizer/Dialect/FIRType.h
@@ -318,6 +318,9 @@ bool isPolymorphicType(mlir::Type ty);
/// value.
bool isUnlimitedPolymorphicType(mlir::Type ty);
+/// Return true iff `ty` is the type of an assumed type.
+bool isAssumedType(mlir::Type ty);
+
/// Return true iff `boxTy` wraps a record type or an unlimited polymorphic
/// entity. Polymorphic entities with intrinsic type spec do not have addendum
inline bool boxHasAddendum(fir::BaseBoxType boxTy) {
diff --git a/flang/lib/Lower/ConvertExpr.cpp b/flang/lib/Lower/ConvertExpr.cpp
index 0dcbb3093697d..03b803e8271b1 100644
--- a/flang/lib/Lower/ConvertExpr.cpp
+++ b/flang/lib/Lower/ConvertExpr.cpp
@@ -2715,12 +2715,12 @@ class ScalarExprLowering {
box = Fortran::evaluate::IsVariable(*expr)
? builder.createBox(loc, genBoxArg(*expr),
fir::isPolymorphicType(argTy),
- fir::isBoxNone(argTy))
+ fir::isAssumedType(argTy))
: builder.createBox(getLoc(), genTempExtAddr(*expr),
fir::isPolymorphicType(argTy),
- fir::isBoxNone(argTy));
+ fir::isAssumedType(argTy));
if (box.getType().isa<fir::BoxType>() &&
- fir::isPolymorphicType(argTy) && !fir::isBoxNone(argTy)) {
+ fir::isPolymorphicType(argTy) && !fir::isAssumedType(argTy)) {
mlir::Type actualTy = argTy;
if (Fortran::lower::isParentComponent(*expr))
actualTy = fir::BoxType::get(converter.genType(*expr));
diff --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
index 23cc3de23baed..244f972ca5a34 100644
--- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp
+++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
@@ -360,10 +360,11 @@ fir::FirOpBuilder::convertWithSemantics(mlir::Location loc, mlir::Type toTy,
return create<fir::EmboxProcOp>(loc, toTy, proc);
}
- if ((fir::isPolymorphicType(fromTy) &&
- (fir::isAllocatableType(fromTy) || fir::isPointerType(fromTy)) &&
- fir::isPolymorphicType(toTy)) ||
- (fir::isPolymorphicType(fromTy) && toTy.isa<fir::BoxType>()))
+ if (((fir::isPolymorphicType(fromTy) &&
+ (fir::isAllocatableType(fromTy) || fir::isPointerType(fromTy)) &&
+ fir::isPolymorphicType(toTy)) ||
+ (fir::isPolymorphicType(fromTy) && toTy.isa<fir::BoxType>())) &&
+ !(fir::isUnlimitedPolymorphicType(fromTy) && fir::isAssumedType(toTy)))
return create<fir::ReboxOp>(loc, toTy, val, mlir::Value{},
/*slice=*/mlir::Value{});
diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp
index c25c683b3e7db..c15244d349906 100644
--- a/flang/lib/Optimizer/Dialect/FIRType.cpp
+++ b/flang/lib/Optimizer/Dialect/FIRType.cpp
@@ -300,7 +300,7 @@ bool isScalarBoxedRecordType(mlir::Type ty) {
return false;
}
-static bool isAssumedType(mlir::Type ty) {
+bool isAssumedType(mlir::Type ty) {
if (auto boxTy = ty.dyn_cast<fir::BoxType>()) {
if (boxTy.getEleTy().isa<mlir::NoneType>())
return true;
diff --git a/flang/test/Lower/assumed-type.f90 b/flang/test/Lower/assumed-type.f90
index 25d4326b155d7..8425b7ddf819f 100644
--- a/flang/test/Lower/assumed-type.f90
+++ b/flang/test/Lower/assumed-type.f90
@@ -8,6 +8,12 @@ subroutine assumed(a)
end subroutine
end interface
+ interface
+ subroutine assumed_r(a)
+ type(*), intent(in), target :: a(*)
+ end subroutine
+ end interface
+
contains
subroutine call_assmued()
@@ -20,4 +26,17 @@ subroutine call_assmued()
! CHECK: %[[BOX_NONE:.*]] = fir.embox %[[I]] : (!fir.ref<i32>) -> !fir.box<none>
! CHECK: fir.call @_QPassumed(%[[BOX_NONE]]) fastmath<contract> : (!fir.box<none>) -> ()
+ subroutine call_assumed_r()
+ integer, target :: i(10)
+ call assumed_r(i)
+ end subroutine
+
+! CHECK-LABEL: func.func @_QMassumed_type_testPcall_assumed_r() {
+! CHECK: %[[C10:.*]] = arith.constant 10 : index
+! CHECK: %[[I:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "i", fir.target, uniq_name = "_QMassumed_type_testFcall_assumed_rEi"}
+! CHECK: %[[SHAPE:.*]] = fir.shape %[[C10]] : (index) -> !fir.shape<1>
+! CHECK: %[[BOX_NONE:.*]] = fir.embox %[[I]](%[[SHAPE]]) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<10xnone>>
+! CHECK: %[[CONV:.*]] = fir.convert %[[BOX_NONE]] : (!fir.box<!fir.array<10xnone>>) -> !fir.box<!fir.array<?xnone>>
+! CHECK: fir.call @_QPassumed_r(%[[CONV]]) {{.*}} : (!fir.box<!fir.array<?xnone>>) -> ()
+
end module
More information about the flang-commits
mailing list