[flang-commits] [PATCH] D151413: [flang][hlfir] Use actual type when copying an actual argument variable
Jean Perier via Phabricator via flang-commits
flang-commits at lists.llvm.org
Thu May 25 08:44:20 PDT 2023
This revision was automatically updated to reflect the committed changes.
Closed by commit rGd07f23e03322: [flang][hlfir] Use actual type when copying an actual argument variable (authored by jeanPerier).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D151413/new/
https://reviews.llvm.org/D151413
Files:
flang/lib/Lower/ConvertCall.cpp
flang/test/Lower/HLFIR/calls-constant-expr-arg-polymorphic.f90
Index: flang/test/Lower/HLFIR/calls-constant-expr-arg-polymorphic.f90
===================================================================
--- /dev/null
+++ flang/test/Lower/HLFIR/calls-constant-expr-arg-polymorphic.f90
@@ -0,0 +1,29 @@
+! RUN: bbc -emit-fir -hlfir --polymorphic-type -o - %s | FileCheck %s
+
+! Test when constant argument are copied in memory
+! and passed to polymorphic arguments.
+! The copy is done in case the dummy later appear in a
+! copy-out that would create write to this memory location.
+ type t1
+ integer :: i
+ end type
+ type, extends(t1) :: t2
+ integer :: j
+ end type
+ interface
+ subroutine foo(x)
+ import :: t1
+ class(t1) :: x(:)
+ end subroutine
+ end interface
+
+ call foo([t2(0,0)])
+end
+! CHECK-LABEL: func.func @_QQmain() {
+! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %{{.*}}(%[[VAL_2:.*]]) {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro.1x_QFTt2.0"}
+! CHECK: %[[VAL_4:.*]] = hlfir.as_expr %[[VAL_3]]#0 : (!fir.ref<!fir.array<1x!fir.type<_QFTt2{i:i32,j:i32}>>>) -> !hlfir.expr<1x!fir.type<_QFTt2{i:i32,j:i32}>>
+! CHECK: %[[VAL_5:.*]]:3 = hlfir.associate %[[VAL_4]](%[[VAL_2]]) {uniq_name = "adapt.valuebyref"} : (!hlfir.expr<1x!fir.type<_QFTt2{i:i32,j:i32}>>, !fir.shape<1>) -> (!fir.ref<!fir.array<1x!fir.type<_QFTt2{i:i32,j:i32}>>>, !fir.ref<!fir.array<1x!fir.type<_QFTt2{i:i32,j:i32}>>>, i1)
+! CHECK: %[[VAL_6:.*]] = fir.embox %[[VAL_5]]#0(%[[VAL_2]]) : (!fir.ref<!fir.array<1x!fir.type<_QFTt2{i:i32,j:i32}>>>, !fir.shape<1>) -> !fir.box<!fir.array<1x!fir.type<_QFTt2{i:i32,j:i32}>>>
+! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (!fir.box<!fir.array<1x!fir.type<_QFTt2{i:i32,j:i32}>>>) -> !fir.class<!fir.array<?x!fir.type<_QFTt1{i:i32}>>>
+! CHECK: fir.call @_QPfoo(%[[VAL_7]]) {{.*}}: (!fir.class<!fir.array<?x!fir.type<_QFTt1{i:i32}>>>) -> ()
+! CHECK: hlfir.end_associate %[[VAL_5]]#1, %[[VAL_5]]#2 : !fir.ref<!fir.array<1x!fir.type<_QFTt2{i:i32,j:i32}>>>, i1
Index: flang/lib/Lower/ConvertCall.cpp
===================================================================
--- flang/lib/Lower/ConvertCall.cpp
+++ flang/lib/Lower/ConvertCall.cpp
@@ -921,8 +921,9 @@
entity.isParameter()) {
// Make a copy in a temporary.
auto copy = builder.create<hlfir::AsExprOp>(loc, entity);
+ mlir::Type storageType = entity.getType();
hlfir::AssociateOp associate = hlfir::genAssociateExpr(
- loc, builder, hlfir::Entity{copy}, dummyType, "adapt.valuebyref");
+ loc, builder, hlfir::Entity{copy}, storageType, "adapt.valuebyref");
entity = hlfir::Entity{associate.getBase()};
// Register the temporary destruction after the call.
preparedDummy.setExprAssociateCleanUp(
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D151413.525643.patch
Type: text/x-patch
Size: 2798 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20230525/d2339901/attachment.bin>
More information about the flang-commits
mailing list