[flang-commits] [PATCH] D117686: [flang] Prevent any non constant result extent to be inlined on caller side
Jean Perier via Phabricator via flang-commits
flang-commits at lists.llvm.org
Wed Jan 19 10:16:25 PST 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rG81c66933292b: [flang] Prevent any non constant result extent to be inlined on caller side (authored by jeanPerier).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D117686/new/
https://reviews.llvm.org/D117686
Files:
flang/lib/Evaluate/shape.cpp
flang/test/Evaluate/rewrite01.f90
Index: flang/test/Evaluate/rewrite01.f90
===================================================================
--- flang/test/Evaluate/rewrite01.f90
+++ flang/test/Evaluate/rewrite01.f90
@@ -12,6 +12,17 @@
returns_array = 0
end function
+function returns_array_2(n)
+ integer, intent(in) :: n
+ integer :: returns_array_2(n)
+ returns_array_2 = 0
+end function
+
+function returns_array_3()
+ integer :: returns_array_3(7:46+2)
+ returns_array_3 = 0
+end function
+
subroutine ubound_test(x, n, m)
integer :: x(n, m)
!CHECK: PRINT *, [INTEGER(4)::int(size(x,dim=1),kind=4),int(size(x,dim=2),kind=4)]
@@ -20,6 +31,10 @@
print *, ubound(returns_array(n, m))
!CHECK: PRINT *, ubound(returns_array(n,m),dim=1_4)
print *, ubound(returns_array(n, m), dim=1)
+ !CHECK: PRINT *, ubound(returns_array_2(m))
+ print *, ubound(returns_array_2(m))
+ !CHECK: PRINT *, 42_8
+ print *, ubound(returns_array_3(), dim=1, kind=8)
end subroutine
subroutine size_test(x, n, m)
@@ -30,6 +45,10 @@
print *, size(returns_array(n, m))
!CHECK: PRINT *, size(returns_array(n,m),dim=1_4)
print *, size(returns_array(n, m), dim=1)
+ !CHECK: PRINT *, size(returns_array_2(m))
+ print *, size(returns_array_2(m))
+ !CHECK: PRINT *, 42_8
+ print *, size(returns_array_3(), kind=8)
end subroutine
subroutine shape_test(x, n, m)
@@ -38,6 +57,10 @@
print *, shape(x)
!CHECK: PRINT *, shape(returns_array(n,m))
print *, shape(returns_array(n, m))
+ !CHECK: PRINT *, shape(returns_array_2(m))
+ print *, shape(returns_array_2(m))
+ !CHECK: PRINT *, [INTEGER(8)::42_8]
+ print *, shape(returns_array_3(), kind=8)
end subroutine
subroutine lbound_test(x, n, m)
@@ -48,5 +71,9 @@
print *, lbound(returns_array(n, m))
!CHECK: PRINT *, 1_4
print *, lbound(returns_array(n, m), dim=1)
+ !CHECK: PRINT *, 1_4
+ print *, lbound(returns_array_2(m), dim=1)
+ !CHECK: PRINT *, 1_4
+ print *, lbound(returns_array_3(), dim=1)
end subroutine
end module
Index: flang/lib/Evaluate/shape.cpp
===================================================================
--- flang/lib/Evaluate/shape.cpp
+++ flang/lib/Evaluate/shape.cpp
@@ -560,13 +560,12 @@
if (subp.isFunction()) {
auto resultShape{(*this)(subp.result())};
if (resultShape && !useResultSymbolShape_) {
- // Ensure the shape does not contain descriptor inquiries, they
- // may refer to symbols belonging to the called subprogram scope
- // that are meaningless on the caller side without the related
- // call expression.
+ // Ensure the shape is constant. Otherwise, it may be referring
+ // to symbols that belong to the subroutine scope and are
+ // meaningless on the caller side without the related call
+ // expression.
for (auto extent : *resultShape) {
- if (extent &&
- std::holds_alternative<DescriptorInquiry>(extent->u)) {
+ if (extent && !IsConstantExpr(*extent)) {
return std::nullopt;
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D117686.401320.patch
Type: text/x-patch
Size: 3184 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220119/d53b71c3/attachment.bin>
More information about the flang-commits
mailing list