[flang-commits] [flang] 426c495 - [flang] Avoid to wrap box/class type with box/class
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Wed Mar 15 09:28:25 PDT 2023
Author: Valentin Clement
Date: 2023-03-15T17:28:16+01:00
New Revision: 426c495e88d73b40758d0f00a14f0a3ab5103f0b
URL: https://github.com/llvm/llvm-project/commit/426c495e88d73b40758d0f00a14f0a3ab5103f0b
DIFF: https://github.com/llvm/llvm-project/commit/426c495e88d73b40758d0f00a14f0a3ab5103f0b.diff
LOG: [flang] Avoid to wrap box/class type with box/class
Adapat the fix made in D146079 to just avoid the type
to be wrapped with an extra fir.box or fir.class. The potential
load is delegated to the code that is after.
Reviewed By: PeteSteinfeld
Differential Revision: https://reviews.llvm.org/D146120
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 64c3c26231eb2..5892d05e33b1a 100644
--- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp
+++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
@@ -516,11 +516,17 @@ mlir::Value fir::FirOpBuilder::createBox(mlir::Location loc,
<< itemAddr.getType();
llvm_unreachable("not a memory reference type");
}
- mlir::Type boxTy = fir::BoxType::get(elementType);
+ mlir::Type boxTy;
mlir::Value tdesc;
- if (isPolymorphic) {
- elementType = fir::updateTypeForUnlimitedPolymorphic(elementType);
- boxTy = fir::ClassType::get(elementType);
+ // Avoid to wrap a box/class with box/class.
+ if (elementType.isa<fir::BaseBoxType>()) {
+ boxTy = elementType;
+ } else {
+ boxTy = fir::BoxType::get(elementType);
+ if (isPolymorphic) {
+ elementType = fir::updateTypeForUnlimitedPolymorphic(elementType);
+ boxTy = fir::ClassType::get(elementType);
+ }
}
return exv.match(
diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90
index 6bb9f735f5d9a..dd023b9694ff1 100644
--- a/flang/test/Lower/polymorphic.f90
+++ b/flang/test/Lower/polymorphic.f90
@@ -1086,6 +1086,32 @@ subroutine test_parent_comp_opt(p)
! CHECK: %[[CONV:.*]] = fir.convert %[[RES]] : (!fir.box<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>) -> !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>
! CHECK: fir.call @_QMpolymorphic_testPtakes_p1_opt(%[[CONV]]) {{.*}} : (!fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>>) -> ()
+ subroutine class_with_entry(a)
+ class(p1) :: a,b
+ select type (a)
+ type is(p2)
+ print*, a%c
+ class default
+ print*, a%a
+ end select
+ return
+ entry d(b)
+ select type(b)
+ type is(p2)
+ print*,b%c
+ class default
+ print*,b%a
+ end select
+ end subroutine
+
+! CHECK-LABEL: func.func @_QMpolymorphic_testPclass_with_entry(
+! CHECK-SAME: %[[A:.*]]: !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>> {fir.bindc_name = "a"}) {
+! CHECK: %[[B:.*]] = fir.alloca !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>> {bindc_name = "b", uniq_name = "_QMpolymorphic_testFclass_with_entryEb"}
+
+! CHECK-LABEL: func.func @_QMpolymorphic_testPd(
+! CHECK-SAME: %[[B:.*]]: !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>> {fir.bindc_name = "b"}) {
+! CHECK: %[[A:.*]] = fir.alloca !fir.class<!fir.type<_QMpolymorphic_testTp1{a:i32,b:i32}>> {bindc_name = "a", uniq_name = "_QMpolymorphic_testFclass_with_entryEa"}
+
end module
program test
More information about the flang-commits
mailing list