[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