From 2a3f79973f7ff22ab936b3919c31df5c704e1715 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sat, 6 May 2017 07:44:13 +0000 Subject: [PATCH] PR 75964: Invalid integer ABS handling in simplify-rtx.c RTL has no distinction between signed and unsigned values, so it doesn't make sense to test for signed overflow. 2017-05-06 Richard Sandiford gcc/ PR rtl-optimization/75964 * simplify-rtx.c (simplify_const_relational_operation): Remove invalid handling of comparisons of integer ABS. gcc/testsuite/ PR rtl-optimization/75964 * gcc.dg/torture/pr75964.c: New test. From-SVN: r247719 --- gcc/ChangeLog | 6 ++++++ gcc/simplify-rtx.c | 28 ++++---------------------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr75964.c | 28 ++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 24 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr75964.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index faeac950cd3..58f09a19f6d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-05-06 Richard Sandiford + + PR rtl-optimization/75964 + * simplify-rtx.c (simplify_const_relational_operation): Remove + invalid handling of comparisons of integer ABS. + 2017-05-06 Uros Bizjak * config/i386/i386.c (ext_80387_constant_init): Do not explicitly diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index ac85a564b10..7cab26a0e34 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -5316,34 +5316,14 @@ simplify_const_relational_operation (enum rtx_code code, { case LT: /* Optimize abs(x) < 0.0. */ - if (!HONOR_SNANS (mode) - && (!INTEGRAL_MODE_P (mode) - || (!flag_wrapv && !flag_trapv))) - { - if (INTEGRAL_MODE_P (mode) - && (issue_strict_overflow_warning - (WARN_STRICT_OVERFLOW_CONDITIONAL))) - warning (OPT_Wstrict_overflow, - ("assuming signed overflow does not occur when " - "assuming abs (x) < 0 is false")); - return const0_rtx; - } + if (!INTEGRAL_MODE_P (mode) && !HONOR_SNANS (mode)) + return const0_rtx; break; case GE: /* Optimize abs(x) >= 0.0. */ - if (!HONOR_NANS (mode) - && (!INTEGRAL_MODE_P (mode) - || (!flag_wrapv && !flag_trapv))) - { - if (INTEGRAL_MODE_P (mode) - && (issue_strict_overflow_warning - (WARN_STRICT_OVERFLOW_CONDITIONAL))) - warning (OPT_Wstrict_overflow, - ("assuming signed overflow does not occur when " - "assuming abs (x) >= 0 is true")); - return const_true_rtx; - } + if (!INTEGRAL_MODE_P (mode) && !HONOR_NANS (mode)) + return const_true_rtx; break; case UNGE: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fb66adf278b..587e4821b65 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-05-06 Richard Sandiford + + PR rtl-optimization/75964 + * gcc.dg/torture/pr75964.c: New test. + 2017-05-06 Tom de Vries PR testsuite/80606 diff --git a/gcc/testsuite/gcc.dg/torture/pr75964.c b/gcc/testsuite/gcc.dg/torture/pr75964.c new file mode 100644 index 00000000000..3b895ba7085 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr75964.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ + +typedef __UINT8_TYPE__ uint8_t; + +uint8_t __attribute__ ((noinline, noclone)) +abs8 (uint8_t x) +{ + if (x & 0x80) + x = -x; + + if (x & 0x80) + x = 0x7f; + + return x; +} + +int +main (void) +{ + if (abs8 (0) != 0 + || abs8 (1) != 1 + || abs8 (127) != 127 + || abs8 (128) != 127 + || abs8 (129) != 127 + || abs8 (255) != 1) + __builtin_abort (); + return 0; +} -- 2.30.2