http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50955

--- Comment #3 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-11-02 
12:48:23 UTC ---
The candidate

candidate 15
  depends on 3
  var_before ivtmp.161
  var_after ivtmp.161
  incremented before exit test
  type unsigned int
  base (unsigned int) pDst_39(D) - (unsigned int) &p1
  step (unsigned int) (pretmp.28_118 + 1)

is added via

#3  0x0000000000c99c0b in add_derived_ivs_candidates (data=0x7fffffffd990)
    at /space/rguenther/src/svn/trunk/gcc/tree-ssa-loop-ivopts.c:2531
2531              add_iv_value_candidates (data, use->iv, use);

for

$3 = {id = 7, type = USE_NONLINEAR_EXPR, iv = 0x1b3c840, 
  stmt = 0x2aaaad2ed268, op_p = 0x0, related_cands = 0x1b33a10, 
  n_map_members = 0, cost_map = 0x0, selected = 0x0}
(gdb) call debug_gimple_stmt (0x2aaaad2ed268)
D.6700_302 = D.6698_157 - p1.148_301;

which in turn is created by IVOPTs processing the innermost loop to:

<bb 6>:
  vect_pp1.50_189 = &p1;
  vect_pp1.57_199 = &MEM[(void *)&p1 + 1B];
  vect_pp1.66_217 = &MEM[(void *)&p1 + 2B];
  vect_cst_.72_231 = { 2, 2 };
  vect_cst_.74_236 = { 2, 2 };
  D.6600_244 = (sizetype) y_89;
  batmp.78_245 = pDst_88 + D.6600_244;
  vect_p.80_246 = batmp.78_245 + 1;
  ivtmp.127_156 = (unsigned int) &MEM[(void *)&p1 + 8B];

<bb 7>:
  # ivtmp.124_174 = PHI <ivtmp.124_280(17), 0(6)>
  # ivtmp.127_265 = PHI <ivtmp.127_170(17), ivtmp.127_156(6)>
  D.6698_157 = (unsigned int) batmp.78_245;
  p1.148_301 = (unsigned int) &p1;
  D.6700_302 = D.6698_157 - p1.148_301;
  D.6701_303 = D.6700_302 + ivtmp.127_265;
  D.6702_304 = D.6701_303 + 4294967289;
  D.6703_305 = (vector(8) unsigned char *) D.6702_304;
  vect_p.77_247 = D.6703_305;
  D.6693_281 = (void *) ivtmp.127_265;
  vect_var_.51_192 = MEM[base: D.6693_281, offset: 4294967288B];
...
  MEM[(unsigned char *)vect_p.77_247] = vect_var_.75_243;
  ivtmp.124_280 = ivtmp.124_174 + 1;
  ivtmp.127_170 = ivtmp.127_265 + 8;
  if (ivtmp.124_280 < bnd.44_152)
    goto <bb 17>;
  else
    goto <bb 8>;

<bb 17>:
  goto <bb 7>;

thus introducing this bogus pointer difference.


Reduced testcase:

void
foo1(unsigned char* pSrcLeft,
     unsigned char* pSrcAbove,
     unsigned char* pSrcAboveLeft,
     unsigned char* pDst,
     int dstStep,
     int leftStep, signed int y)
{
  signed int x, s;
  unsigned char  p1[5], p2[5],  p3;

  p1[0] = *pSrcAboveLeft;
  p2[0] = p1[0];
  p2[1] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[2] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[3] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[4] = pSrcLeft[0];

  p1[1] = pSrcAbove[0];
  p1[2] = pSrcAbove[1];
  p1[3] = pSrcAbove[2];
  p1[4] = pSrcAbove[3];

  p3 = (unsigned char)(((signed int)p1[1] + (signed int)p2[1]
                        + (signed int)p1[0] +(signed int)p1[0] + 2 ) >> 2 );

  for( x=y+1; x<4; x++ ) {
      s = ( p1[x-y-1] + p1[x-y] + p1[x-y] + p1[x-y+1] + 2 ) >> 2;
      pDst[x] = (unsigned char)s;
  }

  pDst[y] = p3;
}

Reply via email to