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