Commit 2a3f7997 by Richard Sandiford Committed by Richard Sandiford

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  <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
parent d554bf23
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
......
......@@ -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:
......
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
......
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment