From 63dfbb95054c0ee31a1e8647316e1ef7015875a5 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 9 Jul 2014 17:14:11 +0000 Subject: 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 --- gcc/c-family/ChangeLog | 7 +++++++ gcc/c-family/c-gimplify.c | 4 +--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/c-c++-common/torture/pr61741.c | 22 ++++++++++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/torture/pr61741.c (limited to 'gcc') diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 5bd9c1e..2445597 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 16bffd2..8fbff603 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 77cddaf..b2e6a01 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 0000000..b5f9b93 --- /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; +} -- cgit v1.1