[Bug tree-optimization/42108] [4.4/4.5 Regression] Vectorizer cannot deal with PAREN_EXPR gracefully, 50% performance regression
rguenther at suse dot de
gcc-bugzilla@gcc.gnu.org
Sat Nov 21 12:19:00 GMT 2009
------- Comment #16 from rguenther at suse dot de 2009-11-21 12:19 -------
Subject: Re: [4.4/4.5 Regression] Vectorizer
cannot deal with PAREN_EXPR gracefully, 50% performance regression
On Sat, 21 Nov 2009, toon at moene dot org wrote:
> ------- Comment #15 from toon at moene dot org 2009-11-21 12:11 -------
> > I don't see that the standard suggests the specific code the Frontend
> > generates. In fact it should be valid to increment the DO variable
> > by m3 and express the exit test in terms of the DO variable as well.
>
> The Standard doesn't prescribe the code the Frontend generates - however, to be
> sure one follows the Standard, it's most easy to simply implement the steps
> given.
>
> To illustrate this with a simple example:
>
> DO I = M1, M2, M3
> B(I) = A(I)
> ENDDO
>
> would be most easily, and atraightforwardly, implemented as follows:
>
> IF (M3 > 0 .AND. M1 < M2) GOTO 200 ! Loop executed zero times
> IF (M3 < 0 .AND. M1 > M2) GOTO 200 ! Ditto
> ITEMP = (M2 - M1 + M3) / M3 ! Temporary loop count
> I = M1
> 100 CONTINUE
> B(I) = A(I)
> ITEMP = ITEMP - 1 ! Adjust internal loop counter
> I = I + M3 ! Adjust DO loop variable
> IF (ITEMP > 0) GOTO 100
> 200 CONTINUE
>
> That there are two induction variables in this loop is inconsequential - one of
> them should be eliminated by induction variable elimination (at least, that was
> the case with g77 and the RTL loop optimization pass).
Sure, but the frontend generates
if (M3 > 0)
ITEMP = (M2 - M1) / M3
else
ITEMP = (M1 - M2) / -M3
I = M1
100 CONTINUE
B(I) = A(I)
I = I + M3
if (ITEMP == 0) GOTO 200
ITEMP = ITEMP - 1
GOTO 100
200 CONTINUE
The conditional setting of ITEMP is what confuses GCC. Also I don't
see the test for zero-time executing loops (but maybe I omitted it
from my pasting in comment #12).
Richard.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42108
More information about the Gcc-bugs
mailing list