[Bug middle-end/94715] Squared multiplies are incorrectly signextended
wilco at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Apr 23 10:37:21 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94715
Wilco <wilco at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2020-04-23
Ever confirmed|0 |1
Status|RESOLVED |REOPENED
Resolution|INVALID |---
--- Comment #2 from Wilco <wilco at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #1)
> I think GCC is correct in assuming that x * x is positive since overflow
> with signed arithmetic is undefined. Thus on GIMPLE we elide
>
> _1 = x_2(D) * x_2(D);
> t_3 = (unsigned int) _1;
> _4 = (long long unsigned int) t_3;
>
> to
>
> _1 = x_2(D) * x_2(D);
> _4 = (long long unsigned int) _1;
If we assume x * x is always positive, using unsigned extension would make more
sense. It still adds an unnecessary extra instruction on most targets which
cannot be removed in RTL.
More information about the Gcc-bugs
mailing list