[flang] Lower length on character storage

This patch adds lowering for SetLength used to set
different length on character storage around calls where
the dummy and actual length differ.

This patch is part of the upstreaming effort from fir-dev branch.

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D122000

Co-authored-by: Jean Perier <jperier@nvidia.com>
This commit is contained in:
Valentin Clement 2022-03-18 14:49:34 +01:00
parent 28c53b384d
commit 32306b9cf7
No known key found for this signature in database
GPG Key ID: 086D54783C928776
2 changed files with 31 additions and 1 deletions

View File

@ -1092,7 +1092,9 @@ public:
template <int KIND>
ExtValue genval(const Fortran::evaluate::SetLength<KIND> &x) {
TODO(getLoc(), "genval SetLength<KIND>");
mlir::Value newLenValue = genunbox(x.right());
fir::ExtendedValue lhs = gen(x.left());
return replaceScalarCharacterLength(lhs, newLenValue);
}
template <int KIND>

View File

@ -0,0 +1,28 @@
! Test evaluate::SetLength lowering (used to set a different length on a
! character storage around calls where the dummy and actual length differ).
! RUN: bbc -emit-fir -o - %s | FileCheck %s
subroutine takes_length_4(c)
character c(3)*4
!do i = 1,3
print *, c(i)
!enddo
end
! CHECK-LABEL: func @_QPfoo(
subroutine foo(c)
character c(4)*3
! evaluate::Expr is: CALL s(%SET_LENGTH(c(1_8),4_8)) after semantics.
call takes_length_4(c(1))
! CHECK: %[[VAL_2:.*]] = arith.constant 4 : i64
! CHECK: %[[VAL_6:.*]] = fir.coordinate_of %{{.*}}, %{{.*}} : (!fir.ref<!fir.array<4x!fir.char<1,3>>>, i64) -> !fir.ref<!fir.char<1,3>>
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (!fir.ref<!fir.char<1,3>>) -> !fir.ref<!fir.char<1,?>>
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_2]] : (i64) -> index
! CHECK: %[[VAL_9:.*]] = fir.emboxchar %[[VAL_7]], %[[VAL_8]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
! CHECK: fir.call @_QPtakes_length_4(%[[VAL_9]]) : (!fir.boxchar<1>) -> ()
end subroutine
character(3) :: c(4) = ["abc", "def", "ghi", "klm"]
call foo(c)
end