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  <bernd.edlin...@hotmail.de>

        * 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  <bernd.edlin...@hotmail.de>

        * gcc.c-torture/execute/20140622-1.c: New test.

Attachment: patch-forwprop.diff
Description: Binary data

Reply via email to