From: Richard Biener Date: Wed, 9 Jul 2014 17:14:11 +0000 (+0000) Subject: re PR c/61741 (wrong code with -fno-strict-overflow) X-Git-Tag: releases/gcc-5.1.0~6434 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=63dfbb95054c0ee31a1e8647316e1ef7015875a5;p=thirdparty%2Fgcc.git re PR c/61741 (wrong code with -fno-strict-overflow) 2014-07-09 Richard Biener PR c-family/61741 * c-gimplify.c (c_gimplify_expr): Gimplify self-modify expressions using unsigned arithmetic if overflow does not wrap instead of if overflow is undefined. * c-c++-common/torture/pr61741.c: New testcase. From-SVN: r212400 --- diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 5bd9c1e435ca..24455978734f 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2014-07-09 Richard Biener + + PR c-family/61741 + * c-gimplify.c (c_gimplify_expr): Gimplify self-modify expressions + using unsigned arithmetic if overflow does not wrap instead of + if overflow is undefined. + 2014-07-06 Marek Polacek PR c/6940 diff --git a/gcc/c-family/c-gimplify.c b/gcc/c-family/c-gimplify.c index 16bffd297bd6..8fbff603ca8a 100644 --- a/gcc/c-family/c-gimplify.c +++ b/gcc/c-family/c-gimplify.c @@ -240,9 +240,7 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED, tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 0)); if (INTEGRAL_TYPE_P (type) && c_promoting_integer_type_p (type)) { - if (TYPE_OVERFLOW_UNDEFINED (type) - || ((flag_sanitize & SANITIZE_SI_OVERFLOW) - && !TYPE_OVERFLOW_WRAPS (type))) + if (!TYPE_OVERFLOW_WRAPS (type)) type = unsigned_type_for (type); return gimplify_self_mod_expr (expr_p, pre_p, post_p, 1, type); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 77cddaf5157d..b2e6a0168b89 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-07-09 Richard Biener + + PR c-family/61741 + * c-c++-common/torture/pr61741.c: New testcase. + 2014-07-09 Pat Haugen * lib/target-supports.exp diff --git a/gcc/testsuite/c-c++-common/torture/pr61741.c b/gcc/testsuite/c-c++-common/torture/pr61741.c new file mode 100644 index 000000000000..b5f9b9322dda --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/pr61741.c @@ -0,0 +1,22 @@ +/* { dg-do run } */ + +int a = 1, b; + +void +foo (void) +{ + char c = 0; + for (; a; a--) + for (; c >= 0; c++); + if (!c) + b = 1; +} + +int +main () +{ + foo (); + if (b != 0) + __builtin_abort (); + return 0; +}