Question about vectorization limit
Toon Moene
toon@moene.org
Fri May 31 13:49:00 GMT 2013
On 05/31/2013 03:41 PM, Jakub Jelinek wrote:
> On Fri, May 31, 2013 at 03:21:51PM +0200, Toon Moene wrote:
>> SUBROUTINE XYZ(A, B, N)
>> DIMENSION A(N), B(N)
>> DO I = 1, N
>> IF (A(I)> 0.0) THEN
>> A(I) = B(I) / A(I)
>> ELSE
>> A(I) = B(I)
>> ENDIF
>> ENDDO
>> END
>
> Well, in this case (with -Ofast) it is just the case that ifcvt
> or earlier passes did a poor job at moving the load from B(I)
> before the conditional, which, if we ignore exceptions, should be possible,
> as both branches read from the same memory.
> The store to A(I) is already hoisted by cselim out of the conditional.
>
> If you rewrite the above into:
> SUBROUTINE XYZ(A, B, N)
> DIMENSION A(N), B(N)
> DO I = 1, N
> C = B(I)
> IF (A(I)> 0.0) THEN
> A(I) = C / A(I)
> ELSE
> A(I) = C
> ENDIF
> ENDDO
> END
>
> then it is vectorized just fine.
But this "inner loop" has at least 3 basic blocks - so what does the
"loop->num_nodes != 2" test exactly codify ?
Is Dehao just looking at the wrong test ? And why is this test there ?
--
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/wiki/GFortran#news
More information about the Gcc
mailing list