PR 75964: Invalid integer ABS handling in simplify-rtx.c
authorRichard Sandiford <richard.sandiford@linaro.org>
Sat, 6 May 2017 07:44:13 +0000 (07:44 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sat, 6 May 2017 07:44:13 +0000 (07:44 +0000)
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  <richard.sandiford@linaro.org>

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
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr75964.c [new file with mode: 0644]

index faeac95..58f09a1 100644 (file)
@@ -1,3 +1,9 @@
+2017-05-06  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR rtl-optimization/75964
+       * simplify-rtx.c (simplify_const_relational_operation): Remove
+       invalid handling of comparisons of integer ABS.
+
 2017-05-06  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.c (ext_80387_constant_init): Do not explicitly
index ac85a56..7cab26a 100644 (file)
@@ -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:
index fb66adf..587e482 100644 (file)
@@ -1,3 +1,8 @@
+2017-05-06  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR rtl-optimization/75964
+       * gcc.dg/torture/pr75964.c: New test.
+
 2017-05-06  Tom de Vries  <tom@codesourcery.com>
 
        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 (file)
index 0000000..3b895ba
--- /dev/null
@@ -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;
+}