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