[Bug tree-optimization/56595] New: Tree-ssa-pre can create loop carried dependencies which prevent loop vectorization.
ysrumyan at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Mar 11 13:35:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56595
Bug #: 56595
Summary: Tree-ssa-pre can create loop carried dependencies
which prevent loop vectorization.
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: ysrumyan@gmail.com
In some cases pre can create loop carried dependencies spanning multiple
iterations aka scalar replacement. This deficiency can be illustrated with
attached test-case. After pre for stmt
DO I = 0,I2
T1 = 0.5D0 * (U1(I,J,K) + U1(I+1,J,K))
pre creates loop carried dependence:
<bb 172>:
...
pretmp_690 = MEM[(real(kind=8)[0:] *)pretmp_675][pretmp_689];
...
<bb 107>:
# i_1 = PHI <0(172), i_437(175)>
# prephitmp_691 = PHI <pretmp_690(172), _440(175)>
Note that in this particular test-case we have arrays with unknown stride1. If
we have arrays with stride1 == 1 such transformation does not happen as for the
following simple test-case which is successfully vectorized:
subroutine bar(a,b,c,d,n, m)
integer n, m
real*8 a(n,*), b(n,*), c(n,*), d(n,*)
do j=1,m
do i=1,m
x1 = 0.5 * (a(i,j) + a(i+1,j))
x2 = 0.5 * (b(i,j) + b(i+1,j))
x3 = 0.5 * (c(i,j) + c(i+1,j))
d(i,j) = (x1 + x2 + x3) / 3.0
enddo
enddo
end
More information about the Gcc-bugs
mailing list