2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-21 10:20:29 +08:00

match.pd: Canonicalize (X + (X >> (prec - 1))) ^ (X >> (prec - 1)) to abs (X) [PR94783]

The following patch canonicalizes M = X >> (prec - 1); (X + M) ^ M
for signed integral types into ABS_EXPR (X).  For X == min it is already
UB because M is -1 and min + -1 is UB, so we can use ABS_EXPR rather than
say ABSU_EXPR + cast.

The backend might then emit the abs code back using the shift and addition
and xor if it is the best sequence for the target, but could do something
different that is better.

2020-05-08  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/94783
	* match.pd ((X + (X >> (prec - 1))) ^ (X >> (prec - 1)) to abs (X)):
	New simplification.

	* gcc.dg/tree-ssa/pr94783.c: New test.
This commit is contained in:
Jakub Jelinek 2020-05-08 09:35:41 +02:00
parent df569f7da5
commit a0d732eea2
4 changed files with 28 additions and 0 deletions
gcc
ChangeLogmatch.pd
testsuite
ChangeLog
gcc.dg/tree-ssa

@ -1,5 +1,9 @@
2020-05-08 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/94783
* match.pd ((X + (X >> (prec - 1))) ^ (X >> (prec - 1)) to abs (X)):
New simplification.
PR tree-optimization/94956
* match.pd (FFS): Optimize __builtin_ffs* of non-zero argument into
__builtin_ctz* + 1 if direct IFN_CTZ is supported.

@ -120,6 +120,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(with { tree utype = unsigned_type_for (TREE_TYPE (@0)); }
(convert (absu:utype @0)))))
#if GIMPLE
/* Optimize (X + (X >> (prec - 1))) ^ (X >> (prec - 1)) into abs (X). */
(simplify
(bit_xor:c (plus:c @0 (rshift@2 @0 INTEGER_CST@1)) @2)
(if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
&& !TYPE_UNSIGNED (TREE_TYPE (@0))
&& wi::to_widest (@1) == element_precision (TREE_TYPE (@0)) - 1)
(abs @0)))
#endif
/* Simplifications of operations with one constant operand and
simplifications to constants or single values. */

@ -1,5 +1,8 @@
2020-05-08 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/94783
* gcc.dg/tree-ssa/pr94783.c: New test.
PR tree-optimization/94956
* gcc.target/i386/pr94956.c: New test.

@ -0,0 +1,12 @@
/* PR tree-optimization/94783 */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
/* { dg-final { scan-tree-dump "ABS_EXPR" "optimized" } } */
/* { dg-final { scan-tree-dump-not " >> 31" "optimized" } } */
int
foo (int v)
{
int mask = v >> (__SIZEOF_INT__ * __CHAR_BIT__ - 1);
return (v + mask) ^ mask;
}