match.pd: Canonicalize (X + (X >> (prec - 1))) ^ (X >> (prec - 1)) to abs (X) [PR94783]
authorJakub Jelinek <jakub@redhat.com>
Fri, 8 May 2020 07:35:41 +0000 (09:35 +0200)
committerJakub Jelinek <jakub@redhat.com>
Fri, 8 May 2020 07:35:41 +0000 (09:35 +0200)
commita0d732eea2e152fc51f7c5249abaa9ef56fc5121
tree7d2fb107ac7cbf4d72a6934db371dc075494caf5
parentdf569f7da567af4996821dc0a1871eec79957d04
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.
gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr94783.c [new file with mode: 0644]