From: Georg-Johann Lay Date: Tue, 22 Aug 2017 10:07:51 +0000 (+0000) Subject: backport: re PR rtl-optimization/75964 (insn combiner removes comparison after ABS) X-Git-Tag: releases/gcc-5.5.0~105 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5568877d2c9ae00ea677fab426cf301ae7bbab79;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/75964 (insn combiner removes comparison after ABS) gcc/ Backport from 2017-05-06 trunk r247719. PR rtl-optimization/75964 * simplify-rtx.c (simplify_const_relational_operation): Remove invalid handling of comparisons of integer ABS. gcc/testsuite/ Backport from 2017-05-06 trunk r247719. PR rtl-optimization/75964 * gcc.dg/torture/pr75964.c: New test. From-SVN: r251271 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bf7af04a3417..fc3d5a57e5e8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-08-22 Georg-Johann Lay + + Backport from trunk r247719. + 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-08-22 Georg-Johann Lay Backport from 2017-07-05 trunk r249995. diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 5f732b279c8c..2388fd0e0b98 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -5117,34 +5117,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 && flag_strict_overflow))) - { - 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 && flag_strict_overflow))) - { - 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 139ea0c5e3b0..d437045a9373 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2017-08-22 Georg-Johann Lay + + Backport from trunk r247719. + 2017-05-06 Richard Sandiford + + PR rtl-optimization/75964 + * gcc.dg/torture/pr75964.c: New test. + 2017-08-22 Georg-Johann Lay Backport from 2017-07-05 trunk r249995, r249996. diff --git a/gcc/testsuite/gcc.dg/torture/pr75964.c b/gcc/testsuite/gcc.dg/torture/pr75964.c new file mode 100644 index 000000000000..3b895ba7085c --- /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; +}