[flang-commits] [flang] eb1eb7a - [flang] Do not resolve TRIM/REPEAT length to its argument length
Jean Perier via flang-commits
flang-commits at lists.llvm.org
Mon Oct 3 02:43:35 PDT 2022
Author: Jean Perier
Date: 2022-10-03T11:42:41+02:00
New Revision: eb1eb7a144ba44984ea9ce38961713fa535dff79
URL: https://github.com/llvm/llvm-project/commit/eb1eb7a144ba44984ea9ce38961713fa535dff79
DIFF: https://github.com/llvm/llvm-project/commit/eb1eb7a144ba44984ea9ce38961713fa535dff79.diff
LOG: [flang] Do not resolve TRIM/REPEAT length to its argument length
For TRIM and REPEAT calls, semantics was creating ProcedureDesignators
using the length parameter of the arguments. This caused bugs when
folding LEN(TRIM(char_explicit_constant_length)). The same did not
appeared in folding for REPEAT because it is rewritten at a higher
level to LEN(c)*N.
This is not only a folding issue since any place (like lowering) may
try to use the bad length parameter from the created ProcedureDesignator.
Update intrinsic resolution to not copy the length parameter for TRIM
and REPEAT.
Differential Revision: https://reviews.llvm.org/D134970
Added:
Modified:
flang/lib/Evaluate/intrinsics.cpp
flang/test/Evaluate/rewrite01.f90
Removed:
################################################################################
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index bd4d0fe2b217c..1d52e9b497109 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -78,7 +78,11 @@ ENUM_CLASS(KindCode, none, defaultIntegerKind,
defaultRealKind, // is also the default COMPLEX kind
doublePrecision, defaultCharKind, defaultLogicalKind,
any, // matches any kind value; each instance is independent
- same, // match any kind, but all "same" kinds must be equal
+ // match any kind, but all "same" kinds must be equal. For characters, also
+ // implies that lengths must be equal.
+ same,
+ // for character results, take "same" argument kind but not length
+ sameKindButNotLength,
operand, // match any kind, with promotion (non-standard)
typeless, // BOZ literals are INTEGER with this kind
teamType, // TEAM_TYPE from module ISO_FORTRAN_ENV (for coarrays)
@@ -149,6 +153,8 @@ static constexpr TypePattern SameComplex{ComplexType, KindCode::same};
static constexpr TypePattern SameFloating{FloatingType, KindCode::same};
static constexpr TypePattern SameNumeric{NumericType, KindCode::same};
static constexpr TypePattern SameChar{CharType, KindCode::same};
+static constexpr TypePattern SameCharNewLen{
+ CharType, KindCode::sameKindButNotLength};
static constexpr TypePattern SameLogical{LogicalType, KindCode::same};
static constexpr TypePattern SameRelatable{RelatableType, KindCode::same};
static constexpr TypePattern SameIntrinsic{IntrinsicType, KindCode::same};
@@ -702,7 +708,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
{"ordered", AnyLogical, Rank::scalar, Optionality::optional}},
SameType, Rank::scalar, IntrinsicClass::transformationalFunction},
{"repeat", {{"string", SameChar, Rank::scalar}, {"ncopies", AnyInt}},
- SameChar, Rank::scalar, IntrinsicClass::transformationalFunction},
+ SameCharNewLen, Rank::scalar, IntrinsicClass::transformationalFunction},
{"reshape",
{{"source", SameType, Rank::array}, {"shape", AnyInt, Rank::shape},
{"pad", SameType, Rank::array, Optionality::optional},
@@ -799,7 +805,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
SameType, Rank::vector, IntrinsicClass::transformationalFunction},
{"transpose", {{"matrix", SameType, Rank::matrix}}, SameType, Rank::matrix,
IntrinsicClass::transformationalFunction},
- {"trim", {{"string", SameChar, Rank::scalar}}, SameChar, Rank::scalar,
+ {"trim", {{"string", SameChar, Rank::scalar}}, SameCharNewLen, Rank::scalar,
IntrinsicClass::transformationalFunction},
{"ubound",
{{"array", AnyData, Rank::anyOrAssumedRank}, RequiredDIM,
@@ -1784,6 +1790,12 @@ std::optional<SpecificCall> IntrinsicInterface::Match(
}
}
break;
+ case KindCode::sameKindButNotLength:
+ CHECK(sameArg);
+ if (std::optional<DynamicType> aType{sameArg->GetType()}) {
+ resultType = DynamicType{*category, aType->kind()};
+ }
+ break;
case KindCode::operand:
CHECK(operandArg);
resultType = operandArg->GetType();
diff --git a/flang/test/Evaluate/rewrite01.f90 b/flang/test/Evaluate/rewrite01.f90
index 37fd11e7e8e8a..d841699688db8 100644
--- a/flang/test/Evaluate/rewrite01.f90
+++ b/flang/test/Evaluate/rewrite01.f90
@@ -112,6 +112,7 @@ subroutine len_test(a,b, c, d, e, n, m)
external d
integer, intent(in) :: n, m
character(n), intent(in) :: e
+ character(5), parameter :: cparam = "abc "
interface
function fun1(L)
character(L) :: fun1
@@ -155,6 +156,14 @@ end function mofun
print *, len(fun1(n-m))
!CHECK: PRINT *, len(mofun(m+1_4))
print *, len(mofun(m+1))
+ !CHECK: PRINT *, 3_4
+ print *, len(trim(cparam))
+ !CHECK: PRINT *, len(trim(c))
+ print *, len(trim(c))
+ !CHECK: PRINT *, 40_4
+ print *, len(repeat(c, 4))
+ !CHECK: PRINT *, len(repeat(c,int(i,kind=8)))
+ print *, len(repeat(c, i))
end subroutine len_test
!CHECK-LABEL: associate_tests
More information about the flang-commits
mailing list