[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