https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94234
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Last reconfirmed| |2020-03-20
Keywords| |missed-optimization
Version|unknown |10.0
Status|UNCONFIRMED |NEW
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed. Might be also a regression since POINTER_DIFF_EXPR introduction.
We have
(simplify
(pointer_diff (pointer_plus @@0 @1) (pointer_plus @0 @2))
/* The second argument of pointer_plus must be interpreted as signed, and
thus sign-extended if necessary. */
(with { tree stype = signed_type_for (TREE_TYPE (@1)); }
/* Use view_convert instead of convert here, as POINTER_PLUS_EXPR
second arg is unsigned even when we need to consider it as signed,
we don't want to diagnose overflow here. */
(minus (convert (view_convert:stype @1))
(convert (view_convert:stype @2)))))))
which triggers here but appearantly the resulting minus isn't simplified.
_1 = n_5(D) * 8;
b1_7 = a_6(D) + _1;
_2 = n_5(D) + 18446744073709551615;
_3 = _2 * 8;
b2_8 = a_6(D) + _3;
and we need to simplify _1 - _3. Possibly the excessive conversions above
mess with the constraint of CCP not wanting new stmts. You can see what
forwprop does which applies all foldings possible and computes:
_1 = n_5(D) * 8;
_2 = n_5(D) + 18446744073709551615;
_3 = _2 * 8;
_11 = (signed long) _1;
_12 = (signed long) _3;
_4 = _11 - _12;
_9 = (long unsigned int) _4;
return _9;
I don't think we have match.pd patterns simplifying that.