diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 5bd9c1e435c..24455978734 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 16bffd297bd..8fbff603ca8 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 77cddaf5157..b2e6a0168b8 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 00000000000..b5f9b9322dd --- /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; +}