Commit da186c1f by Richard Biener Committed by Richard Biener

re PR middle-end/77407 (Optimize integer i / abs (i) into the sign of i)

2016-09-29  Richard Biener  <rguenther@suse.de>

	PR middle-end/77407
	* match.pd: Add X / abs (X) -> X < 0 ? -1 : 1 and
	X / -X -> -1 simplifications.

	* gcc.dg/pr77407.c: New testcase.

From-SVN: r240616
parent d657e995
2016-09-29 Richard Biener <rguenther@suse.de> 2016-09-29 Richard Biener <rguenther@suse.de>
PR middle-end/77407
* match.pd: Add X / abs (X) -> X < 0 ? -1 : 1 and
X / -X -> -1 simplifications.
2016-09-29 Richard Biener <rguenther@suse.de>
PR middle-end/55152 PR middle-end/55152
* match.pd: Add max(a,-a) -> abs(a) pattern. * match.pd: Add max(a,-a) -> abs(a) pattern.
* tree-ssa-phiopt.c (minmax_replacement): Disable for * tree-ssa-phiopt.c (minmax_replacement): Disable for
......
...@@ -147,12 +147,25 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) ...@@ -147,12 +147,25 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(op @0 integer_onep) (op @0 integer_onep)
(non_lvalue @0))) (non_lvalue @0)))
/* X / -1 is -X. */
(for div (trunc_div ceil_div floor_div round_div exact_div) (for div (trunc_div ceil_div floor_div round_div exact_div)
/* X / -1 is -X. */
(simplify (simplify
(div @0 integer_minus_onep@1) (div @0 integer_minus_onep@1)
(if (!TYPE_UNSIGNED (type)) (if (!TYPE_UNSIGNED (type))
(negate @0)))) (negate @0)))
/* X / abs (X) is X < 0 ? -1 : 1. */
(simplify
(div @0 (abs @0))
(if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
&& TYPE_OVERFLOW_UNDEFINED (type))
(cond (lt @0 { build_zero_cst (type); })
{ build_minus_one_cst (type); } { build_one_cst (type); })))
/* X / -X is -1. */
(simplify
(div @0 (negate @0))
(if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
&& TYPE_OVERFLOW_UNDEFINED (type))
{ build_minus_one_cst (type); })))
/* For unsigned integral types, FLOOR_DIV_EXPR is the same as /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
TRUNC_DIV_EXPR. Rewrite into the latter in this case. */ TRUNC_DIV_EXPR. Rewrite into the latter in this case. */
......
2016-09-28 Richard Biener <rguenther@suse.de>
PR middle-end/77407
* gcc.dg/pr77407.c: New testcase.
2016-09-29 Richard Biener <rguenther@suse.de> 2016-09-29 Richard Biener <rguenther@suse.de>
PR middle-end/55152 PR middle-end/55152
......
/* { dg-do compile } */
/* { dg-options "-O -fstrict-overflow -fdump-tree-gimple" } */
int foo (int c)
{
if (c != 0)
c /= __builtin_abs (c);
return c;
}
int bar (int c)
{
if (c != 0)
c /= -c;
return c;
}
/* { dg-final { scan-tree-dump-times "/" 0 "gimple" } } */
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