https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70130

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org

--- Comment #12 from Richard Biener <rguenth at gcc dot gnu.org> ---
The preprocessed source hints at the

  for (j=0; j < MB_BLOCK_SIZE; j++)
  {
    for (i=0; i < MB_BLOCK_SIZE; i++)
    {
      img->mprr_2[VERT_PRED_16][j][i]=s[i][0]; // store vertical prediction
      img->mprr_2[HOR_PRED_16 ][j][i]=s[j][1]; // store horizontal prediction
      img->mprr_2[DC_PRED_16  ][j][i]=s0;      // store DC prediction
    }
  }

loop instead.  Where I see

bb3:
  vect__39.11_16 = MEM[(int *)vectp_s.13_15];
  vect__39.14_17 = __builtin_altivec_mask_for_load (vectp_s.13_13);
...
bb4:
  # vect__39.15_18 = PHI <vect__39.18_24(8), vect__39.11_16(3)>
  # vectp_s.16_20 = PHI <vectp_s.16_22(8), vectp_s.17_19(3)>
  vectp_s.16_23 = vectp_s.16_20 & -16B;
  vect__39.18_24 = MEM[(int *)vectp_s.16_23];
  vect__39.19_1 = REALIGN_LOAD <vect__39.15_18, vect__39.18_24,
vect__39.14_17>;
  vectp_s.16_314 = vectp_s.16_20 + 18446744073709551608;
(oops)
...
  vectp_s.16_22 = vectp_s.16_314 + 16;
...
  if (ivtmp_210 < 15)
    goto <bb 8>;
  else
    goto <bb 7>;

  <bb 8>:
  goto <bb 4>;

the (oops) marked IV adjustment breaks the realign-optimized handling
I believe.  It adjusts for the group gap (it subtracts 8 from the pointer)
and thus makes both the mask and the previous load value invalid.

Reply via email to