Hi, I noticed that several testcases in the GMP-4.3.2 test suite are failing now which did not happen with GCC 4.9.0. I debugged the first one, mpz/convert, and found the file mpn/generic/get_str.c was miscompiled.
mpn/get_str.c.132t.dse2:
pretmp_183 = (sizetype) chars_per_limb_80;
pretmp_184 = -pretmp_183;
_23 = chars_per_limb_80 + 4294967295;
_68 = (sizetype) _23;
_28 = _68 + pretmp_184;
mpn/get_str.c.133t.forwprop4:
_28 = 4294967295;
That is wrong, because chars_per_limb is unsigned, and it is not zero.
So the right result should be -1. This makes the loop termination in that
function fail.
The reason for this is in this check-in:
r210807 | ebotcazou | 2014-05-22 16:32:56 +0200 (Thu, 22 May 2014) | 3 lines
* tree-ssa-forwprop.c (associate_plusminus): Extend (T)(P + A) - (T)P
-> (T)A transformation to integer types.
Because it implicitly assumes that integer overflow is not allowed with all
types,
including unsigned int.
The attached patch fixes these regressions, and because the reasoning depends
on the TYPE_OVERFLOW_UNDEFINED attribute, a strict overflow warning has to be
emitted here, at least for widening conversions.
Boot-strapped and regression-tested on x86_64-linux-gnu with all languages,
including Ada.
OK for trunk?
Thanks
Bernd.
gcc/ChangeLog: 2014-06-22 Bernd Edlinger <[email protected]> * tree-ssa-forwprop.c (associate_plusminus): For widening conversions check for undefined overflow in (T)(P + A) - (T)P -> (T)A. Issue a strict overflow warning if appropriate. testsuite/ChangeLog: 2014-06-22 Bernd Edlinger <[email protected]> * gcc.c-torture/execute/20140622-1.c: New test.
patch-forwprop.diff
Description: Binary data
