diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2014-09-12 12:42:47 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2014-09-12 10:42:47 +0000 |
commit | d9a72d17e64f6a1b50ef859dadcf86551de1b265 (patch) | |
tree | 27bbde3457695f894291e97fcc17689a975b4a96 /gcc/tree.c | |
parent | e4a9c55ade081438460f6b0db8afbaad34b05d35 (diff) | |
download | gcc-d9a72d17e64f6a1b50ef859dadcf86551de1b265.zip gcc-d9a72d17e64f6a1b50ef859dadcf86551de1b265.tar.gz gcc-d9a72d17e64f6a1b50ef859dadcf86551de1b265.tar.bz2 |
tree.c (integer_each_onep): New function.
2014-09-12 Marc Glisse <marc.glisse@inria.fr>
gcc/
* tree.c (integer_each_onep): New function.
* tree.h (integer_each_onep): Declare it.
* fold-const.c (fold_binary_loc): Use it for ~A + 1 to -A and
-A - 1 to ~A. Disable (X & 1) ^ 1, (X ^ 1) & 1 and ~X & 1 to
(X & 1) == 0 for vector and complex.
gcc/testsuite/
* gcc.dg/vec-andxor1.c: New file.
From-SVN: r215209
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -2169,6 +2169,21 @@ integer_onep (const_tree expr) } } +/* Return 1 if EXPR is the integer constant one. For complex and vector, + return 1 if every piece is the integer constant one. */ + +int +integer_each_onep (const_tree expr) +{ + STRIP_NOPS (expr); + + if (TREE_CODE (expr) == COMPLEX_CST) + return (integer_onep (TREE_REALPART (expr)) + && integer_onep (TREE_IMAGPART (expr))); + else + return integer_onep (expr); +} + /* Return 1 if EXPR is an integer containing all 1's in as much precision as it contains, or a complex or vector whose subparts are such integers. */ |