------- 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