------- Comment #31 from rguenth at gcc dot gnu dot org 2007-10-24 12:23
-------
This is a partitioning issue. We allocate the same MPT to loads and stores
in a loop. Fixed with for example --param max-aliased-vops=10000.
Diego, this is yours. Avoiding false aliasing of loads and stores should
be top priority in the partitioning heuristics.
Though even with no paritioning we are not able to move the invariant load
of dtvol:
.L68:
movsd (%rsi), %xmm0
addl $1, %ecx
addq %rdi, %rsi
subsd (%rdx), %xmm0
addq %rdi, %rdx
mulsd __les3d_data_MOD_dtvol(%rip), %xmm0
xorpd %xmm1, %xmm0
movsd %xmm0, (%rax)
addq %r8, %rax
cmpl $6, %ecx
jne .L68
because:
# VUSE <dtvol_613>
dtvol.23_424 = dtvol;
D.1276_425 = D.1274_423 * dtvol.23_424;
D.1277_426 = -D.1276_425;
# dtvol_1865 = VDEF <dtvol_613>
# HEAP.185_1160 = VDEF <HEAP.185_609>
# HEAP.186_1142 = VDEF <HEAP.186_1194>
# HEAP.202_1108 = VDEF <HEAP.202_1177>
(*pretmp.248_955)[D.1259_397] = D.1277_426;
as we think that pretmp.248_955 might point to dtvol. The pointers just
have a constraint like
pretmp.246_921 = du
and
du = &ANYTHING
du.ubound = &ANYTHING
du.lbound = &ANYTHING
du.stride = &ANYTHING
du.ubound = &ANYTHING
du.lbound = &ANYTHING
du.stride = &ANYTHING
du.ubound = &ANYTHING
du.lbound = &ANYTHING
du.stride = &ANYTHING
du.ubound = &ANYTHING
du.lbound = &ANYTHING
du.stride = &ANYTHING
du.dtype = &ANYTHING
du.offset = &ANYTHING
and dtvol and DU are global variables. So we are possibly out of luck
for this one.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32921