diff --git a/flang/docs/Intrinsics.md b/flang/docs/Intrinsics.md index 0196be10d8655..94bca7a3972b6 100644 --- a/flang/docs/Intrinsics.md +++ b/flang/docs/Intrinsics.md @@ -1052,6 +1052,9 @@ end program rename_proc This intrinsic is an alias for `CPU_TIME`: supporting both a subroutine and a function form. +### Non-standard Intrinsics: LNBLNK +This intrinsic is an alias for `LEN_TRIM`, without the optional KIND argument. + #### Usage and Info - **Standard:** GNU extension diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp index 1e27c0ae4216c..ff6ccf154f17a 100644 --- a/flang/lib/Evaluate/intrinsics.cpp +++ b/flang/lib/Evaluate/intrinsics.cpp @@ -616,6 +616,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{ DefaultLogical}, {"llt", {{"string_a", SameCharNoLen}, {"string_b", SameCharNoLen}}, DefaultLogical}, + {"lnblnk", {{"string", AnyChar}}, DefaultInt}, {"loc", {{"x", Addressable, Rank::anyOrAssumedRank}}, SubscriptInt, Rank::scalar}, {"log", {{"x", SameFloating}}, SameFloating}, diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index a2b327f45c693..ef9ac1cbb151b 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -434,6 +434,7 @@ static constexpr IntrinsicHandler handlers[]{ {"lgt", &I::genCharacterCompare}, {"lle", &I::genCharacterCompare}, {"llt", &I::genCharacterCompare}, + {"lnblnk", &I::genLenTrim}, {"loc", &I::genLoc, {{{"x", asBox}}}, /*isElemental=*/false}, {"malloc", &I::genMalloc}, {"maskl", &I::genMask}, diff --git a/flang/test/Lower/Intrinsics/len_trim.f90 b/flang/test/Lower/Intrinsics/len_trim.f90 index 8777e5857609f..e3483331ab5ab 100644 --- a/flang/test/Lower/Intrinsics/len_trim.f90 +++ b/flang/test/Lower/Intrinsics/len_trim.f90 @@ -18,3 +18,22 @@ integer function len_trim_test(c) ! CHECK: %[[len:.*]] = arith.addi %[[iterateResult]]#1, %[[c1]] ! CHECK: select %[[iterateResult]]#0, %[[c0]], %[[len]] end function + +! CHECK-LABEL: lnblnk_test +integer function lnblnk_test(c) +character(*) :: c +ltrim = lnblnk(c) +! CHECK-DAG: %[[c0:.*]] = arith.constant 0 : index +! CHECK-DAG: %[[c1:.*]] = arith.constant 1 : index +! CHECK-DAG: %[[cm1:.*]] = arith.constant -1 : index +! CHECK-DAG: %[[lastChar:.*]] = arith.subi {{.*}}, %[[c1]] +! CHECK: %[[iterateResult:.*]]:2 = fir.iterate_while (%[[index:.*]] = %[[lastChar]] to %[[c0]] step %[[cm1]]) and ({{.*}}) iter_args({{.*}}) { + ! CHECK: %[[addr:.*]] = fir.coordinate_of {{.*}}, %[[index]] + ! CHECK: %[[codeAddr:.*]] = fir.convert %[[addr]] + ! CHECK: %[[code:.*]] = fir.load %[[codeAddr]] + ! CHECK: %[[bool:.*]] = arith.cmpi eq + ! CHECK: fir.result %[[bool]], %[[index]] +! CHECK: } +! CHECK: %[[len:.*]] = arith.addi %[[iterateResult]]#1, %[[c1]] +! CHECK: select %[[iterateResult]]#0, %[[c0]], %[[len]] +end function