This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Can a front end pass information to the Value Range Propagation Pass ?
- From: Richard Guenther <richard dot guenther at gmail dot com>
- To: Toon Moene <toon at moene dot org>
- Cc: gcc mailing list <gcc at gcc dot gnu dot org>
- Date: Sun, 8 Aug 2010 11:01:50 +0200
- Subject: Re: Can a front end pass information to the Value Range Propagation Pass ?
- References: <4C5DA975.70304@moene.org>
On Sat, Aug 7, 2010 at 8:44 PM, Toon Moene <toon@moene.org> wrote:
> Recently, Thomas Koenig introduced an optimization in the Fortran Front End
> that enables it do determine that in:
>
> subroutine foo(a,n,i,j)
> ?implicit none
> ?integer, intent(in) :: i,j,n
> ?real, dimension(20) :: a
> ?a(1:10) = a(i:j)
> ?...
> end subroutine foo
>
> the assignment of a(i:j) to a(1:10) does not need a temporary array to store
> a(i:j), because i cannot be smaller than 1 (the lower bound of the array a,
> by its declaration as "real, dimension(20) :: a", which establishes a as an
> array of real, a(1:20).)
>
> Because i cannot be legally smaller than 1, this assignment can be performed
> without a temporary (either it is a partial copy of an exactly overlapping
> array slice, or it copies from higher indices to lower).
>
> However, two more observations can be drawn from the fact that both sides of
> the assignment have to be conformable (of the same shape):
>
> 1 <= i <= 11 (because a ten element copy can't arrive after element 11).
> j = i + 9 ? ?(because the LHS is ten elements long, so the RHS).
>
> Can this information be passed from the Front End to GIMPLE, for use in
> Value Range Propagation optimization ? ?If so, how ?
It could already infer it if we'd infer value-ranges from general operations
based on when they'd invoke undefined behavior (thus, out-of-bound
array accesses).
But no, the frontend cannot currently communicate such things.
This would, btw, also disable array-bounds warnings - as that
does rely on "true" value ranges being used, like for
int a[3];
for (i = 0; i < 10; ++i)
tem += a[i];
if we'd infer [0, 2] for i from a[i] we'd no longer warn that you access
a out-of-bounds.
So I'm not sure it would be a good idea. It's better to communicate
object sizes to the middle-end (in case your example would have used
an allocatable array).
Richard.
> [ It might be hard to generalize this to multi-rank arrays, yet the
> ?opportunity is there ]
>
> Cheers,
>
> --
> Toon Moene - e-mail: toon@moene.org - phone: +31 346 214290
> Saturnushof 14, 3738 XG ?Maartensdijk, The Netherlands
> At home: http://moene.org/~toon/; weather: http://moene.org/~hirlam/
> Progress of GNU Fortran: http://gcc.gnu.org/gcc-4.5/changes.html#Fortran
>