Serious performance regression -- some tree optimizer questions

Toon Moene toon@moene.indiv.nluug.nl
Sun Dec 26 18:06:00 GMT 2004


Ulrich Weigand wrote:

> The reason for this appears to be a combination of the new Fortran
> front end generating different code, and the new loop optimizers not
> quite being able to handle that code.  The hot spot of the test case
> is this single loop:
> 
>       DO 600 I3=2,N-1
>       DO 600 I2=2,N-1
>       DO 600 I1=2,N-1
>  600  R(I1,I2,I3)=V(I1,I2,I3)
>      >      -A(0)*( U(I1,  I2,  I3  ) )
>      >      -A(1)*( U(I1-1,I2,  I3  ) + U(I1+1,I2,  I3  )
>      >                 +  U(I1,  I2-1,I3  ) + U(I1,  I2+1,I3  )
>      >                 +  U(I1,  I2,  I3-1) + U(I1,  I2,  I3+1) )
>      >      -A(2)*( U(I1-1,I2-1,I3  ) + U(I1+1,I2-1,I3  )
>      >                 +  U(I1-1,I2+1,I3  ) + U(I1+1,I2+1,I3  )
>      >                 +  U(I1,  I2-1,I3-1) + U(I1,  I2+1,I3-1)
>      >                 +  U(I1,  I2-1,I3+1) + U(I1,  I2+1,I3+1)
>      >                 +  U(I1-1,I2,  I3-1) + U(I1-1,I2,  I3+1)
>      >                 +  U(I1+1,I2,  I3-1) + U(I1+1,I2,  I3+1) )
>      >      -A(3)*( U(I1-1,I2-1,I3-1) + U(I1+1,I2-1,I3-1)
>      >                 +  U(I1-1,I2+1,I3-1) + U(I1+1,I2+1,I3-1)
>      >                 +  U(I1-1,I2-1,I3+1) + U(I1+1,I2-1,I3+1)
>      >                 +  U(I1-1,I2+1,I3+1) + U(I1+1,I2+1,I3+1) )

> Any suggestions how to further investigate this?  Is this just
> the way things are with the current tree optimizers, or is this
> supposed to work and we just need to find the bug?

[ Sorry for my late reply ]

Well, I hope the original authors of the lno-branch know how to code 
their way out of this hole, because this sort of programming is *very* 
common in Fortran.

The point is that induction variable analysis has to (and *should* be 
able to) prove that in the end, only 12 integer/address registers are 
necessary to code the inner loop, if the target architecture supports 
register+offset addressing.

- All A's: one register with different offsets.
- R: one register
- V: one register
- All U's: one register for every unique second/third index pair,
   of which there are nine.

-- 
Toon Moene - e-mail: toon@moene.indiv.nluug.nl - phone: +31 346 214290
Saturnushof 14, 3738 XG  Maartensdijk, The Netherlands
Maintainer, GNU Fortran 77: http://gcc.gnu.org/onlinedocs/g77_news.html
A maintainer of GNU Fortran 95: http://gcc.gnu.org/fortran/



More information about the Gcc mailing list