[Bug tree-optimization/48702] [4.6/4.7 Regression] optimization regression with gcc-4.6 on x86_64-unknown-linux-gnu
xinliangli at gmail dot com
gcc-bugzilla@gcc.gnu.org
Tue May 17 17:40:00 GMT 2011
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
More information about the Gcc-bugs
mailing list