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

Reply via email to