[C PATCH] Discard P - (P + CST) optimization in pointer_diff (PR c/61240)
Richard Biener
rguenther@suse.de
Mon Aug 4 12:07:00 GMT 2014
On Mon, 4 Aug 2014, Marek Polacek wrote:
> On Mon, Aug 04, 2014 at 12:26:01PM +0200, Richard Biener wrote:
> > On Mon, 4 Aug 2014, Marek Polacek wrote:
> >
> > > This PR is about bogus overflow warning that we issue for e.g.
> > > int *q = &i + 1;
> > > q - (q - 1);
> > > because pointer_diff receives p - (p + -1U) which gets simplified to
> > > 1U - with overflow. We could drop the overflow flag to suppress the
> > > warning, but I think we should just remove the optimization
> > > altogether. First, FE shouldn't perform such transformations at
> > > all. Second, C++ FE has its own pointer_diff function that doesn't
> > > do such optimization. With this patch, the C FE will generate the
> > > same expression as the C++ FE. It's true that we should try to
> > > optimize this, but not in the front end. It ought to be easy to
> > > write a pattern for match-and-simplify that would handle this.
> >
> > I think that tree-ssa-forwprop.c already simplifies this in
> > associate_plusminus with (T)(P + A) - (T)P -> (T)A. Well,
> > maybe not - but then the code should be massages to handle it.
> >
> > Can you double-check and do that?
>
> Looks like .fre can optimize "q - (q - 1)" into 1:
> <bb 2>:
> q.0_3 = (long int) &MEM[(void *)&i + 4B];
> _5 = (long int) &i;
> - _6 = q.0_3 - _5;
> - t.1_7 = _6 /[ex] 4;
> - t ={v} t.1_7;
> + t ={v} 1;
> i ={v} {CLOBBER};
> return;
>
> But associate_plusminus doesn't optimize it:
> else if (code == MINUS_EXPR
> && CONVERT_EXPR_CODE_P (def_code)
> && TREE_CODE (gimple_assign_rhs1 (def_stmt)) == SSA_NAME
> && TREE_CODE (rhs2) == SSA_NAME)
> {
> /* (T)(P + A) - (T)P -> (T)A. */
> becase gimple_assign_rhs1 (def_stmt) is not an SSA_NAME, but ADDR_EXPR (it's
> &MEM[(void *)&i + 4B]). Then there's transformation A - (A +- B) -> -+ B
> below, but that doesn't handle casts.
>
> So - should I try to handle it in associate_plusminus?
Yes please, with a (few) testcase(s).
Thanks,
Richard.
More information about the Gcc-patches
mailing list