This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
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 ENDWell, 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
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |