[PATCH] D119373: [flang] Make folding of LEN less aggressive

Eric Schweitz via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 9 13:27:07 PST 2022


schweitz created this revision.
schweitz added reviewers: clementval, jeanPerier, PeteSteinfeld, mleair, vdonaldson, svedanayagam, klausler.
schweitz added a project: Flang.
Herald added a subscriber: jdoerfert.
schweitz requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Folding in the front end was replacing calls to LEN and dropping
arguments even in situations where the arguments are required to compute
the LEN value at runtime.

      

Add tests.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D119373

Files:
  flang/lib/Evaluate/fold-integer.cpp
  flang/test/Evaluate/rewrite01.f90


Index: flang/test/Evaluate/rewrite01.f90
===================================================================
--- flang/test/Evaluate/rewrite01.f90
+++ flang/test/Evaluate/rewrite01.f90
@@ -76,4 +76,33 @@
   !CHECK: PRINT *, 1_4
   print *, lbound(returns_array_3(), dim=1)
 end subroutine
+
+subroutine len_test(a,b, c, d)
+  character(*) :: a, b
+  external b
+  character(10) :: c, d
+  external d
+
+  !CHECK: PRINT *, len(a)
+  print *, len(a)
+  !CHECK: PRINT *, 5_4
+  print *, len(a(1:5))
+  !CHECK: PRINT *, len(b(a))
+  print *, len(b(a))
+  !CHECK: PRINT *, len(b(a)//a)
+  print *, len(b(a) // a)
+  !CHECK: PRINT *, 10_4
+  print *, len(c)
+  !CHECK: PRINT *, len(c(int(i,kind=8):int(j,kind=8)))
+  print *, len(c(i:j))
+  !CHECK: PRINT *, 5_4
+  print *, len(c(1:5))
+  !CHECK: PRINT *, 10_4
+  print *, len(d(c))
+  !CHECK: PRINT *, 20_4
+  print *, len(d(c) // c)
+  !CHECK: PRINT *, 0_4
+  print *, len(a(10:4))
+end subroutine len_test
+
 end module
Index: flang/lib/Evaluate/fold-integer.cpp
===================================================================
--- flang/lib/Evaluate/fold-integer.cpp
+++ flang/lib/Evaluate/fold-integer.cpp
@@ -677,7 +677,11 @@
       return std::visit(
           [&](auto &kx) {
             if (auto len{kx.LEN()}) {
-              return Fold(context, ConvertToType<T>(*std::move(len)));
+              if (IsConstantExpr(len)) {
+                return Fold(context, ConvertToType<T>(*std::move(len)));
+              } else {
+                return Expr<T>{std::move(funcRef)};
+              }
             } else {
               return Expr<T>{std::move(funcRef)};
             }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D119373.407270.patch
Type: text/x-patch
Size: 1641 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220209/ee662e2e/attachment.bin>


More information about the llvm-commits mailing list