diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-01-04 10:07:33 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-01-04 10:07:33 +0100 |
commit | 165ba2e9c7a6a86dbb12182486359edefba1dd9d (patch) | |
tree | d78796e6ef7e1c02730ddfb11baba76c91a0303e /gcc/match.pd | |
parent | 8f56cb5163063ec7871db11c52c700065886d448 (diff) | |
download | gcc-165ba2e9c7a6a86dbb12182486359edefba1dd9d.zip gcc-165ba2e9c7a6a86dbb12182486359edefba1dd9d.tar.gz gcc-165ba2e9c7a6a86dbb12182486359edefba1dd9d.tar.bz2 |
re PR tree-optimization/71563 (Regression in GCC-7.0.0's optimizer.)
PR tree-optimization/71563
* match.pd: Simplify X << Y into X if Y is known to be 0 or
out of range value - has low bits known to be zero.
* gcc.dg/tree-ssa/pr71563.c: New test.
From-SVN: r244050
Diffstat (limited to 'gcc/match.pd')
-rw-r--r-- | gcc/match.pd | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index 8791e57..7b96800 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1515,6 +1515,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (if (tem) (shiftrotate @0 { tem; })))))) +/* Simplify X << Y where Y's low width bits are 0 to X, as only valid + Y is 0. Similarly for X >> Y. */ +#if GIMPLE +(for shift (lshift rshift) + (simplify + (shift @0 SSA_NAME@1) + (if (INTEGRAL_TYPE_P (TREE_TYPE (@1))) + (with { + int width = ceil_log2 (element_precision (TREE_TYPE (@0))); + int prec = TYPE_PRECISION (TREE_TYPE (@1)); + } + (if ((get_nonzero_bits (@1) & wi::mask (width, false, prec)) == 0) + @0))))) +#endif + /* Rewrite an LROTATE_EXPR by a constant into an RROTATE_EXPR by a new constant. */ (simplify |