http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48702
--- Comment #14 from davidxl <xinliangli at gmail dot com> 2011-05-17 17:17:11 UTC --- (In reply to comment #13) > (In reply to comment #12) > > (In reply to comment #3) > > > I have a patch that makes it fail on trunk as well. IVOPTs generates > > > > > > for (p = &a; p != &a - 3; --p) > > > *(p + 3) = ... > > > > > > and alias analysis doesn't like this invalid pointer. > > > > > > I wonder why ivopt does not select the iv candidate whose base is &a+3. > > I think that one is not in the list of initial candidates. > > I think for that sake we would want to add stripped &base + object size (+ 1?) > (if we know it) as IV candidate iff iv->step is negative, iff iv->step is > positive continue to add &base. > > I don't like the alias oracle fixups too much, but I guess we have to > benchmark both alternatives. The candidate is actually there: candidate 8 var_before ivtmp.13 var_after ivtmp.13 incremented before exit test type long unsigned int base (long unsigned int) &MEM[(int *)&array][3]{lb: 0 sz: 4} step 0x0fffffffffffffffc base object (void *) &array The following patch fixes the problem. Is it ok? David --- tree-ssa-loop-ivopts.c (revision 173278) +++ tree-ssa-loop-ivopts.c (working copy) @@ -3968,7 +3968,7 @@ get_computation_cost_at (struct ivopts_d int *inv_expr_id) { tree ubase = use->iv->base, ustep = use->iv->step; - tree cbase, cstep; + tree cbase, cstep, cbase_strip; tree utype = TREE_TYPE (ubase), ctype; unsigned HOST_WIDE_INT cstepi, offset = 0; HOST_WIDE_INT ratio, aratio; @@ -4026,6 +4026,13 @@ get_computation_cost_at (struct ivopts_d if (!constant_multiple_of (ustep, cstep, &rat)) return infinite_cost; + cbase_strip = STRIP_NOPS (cbase); + /* Avoid confusing aliaser. */ + if (TREE_CODE (cbase_strip) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (cbase_strip, 0)) == VAR_DECL + && (HOST_WIDE_INT) cstepi < 0) + return infinite_cost; + if (double_int_fits_in_shwi_p (rat)) ratio = double_int_to_shwi (rat); else