This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: SUBREG GIVs - Suggestion for a quick hack.
- To: rth at cygnus dot com
- Subject: Re: SUBREG GIVs - Suggestion for a quick hack.
- From: Toon Moene <toon at moene dot indiv dot nluug dot nl>
- Date: Wed, 1 Oct 97 21:04:36 +0200
- Cc: egcs at cygnus dot com, fortran at gnu dot ai dot mit dot edu, "Greg Lindahl" <lindahl at pbm dot com>
- Organization: Moene Computational Physics, Maartensdijk, The Netherlands
- References: <199710010009.RAA11405@dot.cygnus.com>
Richard Henderson wrote:
> Hmm.. FFECOM_FASTER_ARRAY_REFS seems to do the right
> thing for the simple case, off to try out the others you
> posted.
Indeed it does ... Also for rank > 1.
When FFECOM_FASTER_ARRAY_REFS is defined, the Fortran frontend goes
to greater lengths to spell out address computations resulting from
array indexing (instead of leaving it up to `expand_expr' in
expr.c). Apparently, this somehow circumvents the mode conversions
between the index variable(s) and the addresses themselves.
I first thought this was caused by the following code in expr.c
(line 4350):
if (TYPE_PRECISION (index_type) != TYPE_PRECISION (sizetype))
{
index = convert (type_for_size (TYPE_PRECISION
(sizetype), 0),
index);
index_type = TREE_TYPE (index);
}
but commenting it out is not a good idea (compiler runs into an
abort at explow.c:628 ...).
Still, I think this is the correct lead: The
`FFECOM_FASTER_ARRAY_REFS' code results in all address computation
being done in one mode, therefore circumventing the subreg ...
sign_extend trouble.
However, there probably is a more correct way of solving this.
BTW, the rank-3 benchmark code I previously talked about (10.2
seconds with an unmodified g77/egcs) now clocks in at 3.9, i.e. over
a factor of 2.5 better.
HTH,
Toon.
PS: The `FFECOM_FASTER_ARRAY_REFS' code is a hack that dates back
to April 1995, when g77 was just out for two months. We were
desperately trying to solve the inefficient array indexing code and
this was one of the "solutions", which was relegated to history a
month later, because for some architectures, it actually slowed
things down. Of course, this was before we knew the real problem
was the CEIL_DIV_EXPR in {int_}size_in_bytes ;-)