aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-01-14 10:47:09 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2010-01-14 10:47:09 +0100
commit5f8d50239ba11866a5e0251975142fee6632ab2f (patch)
treef281e4baaa435f4349cbed1f76a9f1ae97fba37a /gcc/fold-const.c
parent429c98c9a813a425c325f992126c365898f56d94 (diff)
downloadgcc-5f8d50239ba11866a5e0251975142fee6632ab2f.zip
gcc-5f8d50239ba11866a5e0251975142fee6632ab2f.tar.gz
gcc-5f8d50239ba11866a5e0251975142fee6632ab2f.tar.bz2
re PR c/42721 (possible integer wrong code bug)
PR c/42721 Port from no-undefined-overflow branch 2009-03-09 Richard Guenther <rguenther@suse.de> * fold-const.c (add_double_with_sign): Fix unsigned overflow detection. * gcc.c-torture/execute/pr42721.c: New test. From-SVN: r155887
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 9e40296..9d249cc 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -326,13 +326,17 @@ add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
HOST_WIDE_INT h;
l = l1 + l2;
- h = h1 + h2 + (l < l1);
+ h = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) h1
+ + (unsigned HOST_WIDE_INT) h2
+ + (l < l1));
*lv = l;
*hv = h;
if (unsigned_p)
- return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
+ return ((unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1
+ || (h == h1
+ && l < l1));
else
return OVERFLOW_SUM_SIGN (h1, h2, h);
}