aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2014-09-12 12:42:47 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2014-09-12 10:42:47 +0000
commitd9a72d17e64f6a1b50ef859dadcf86551de1b265 (patch)
tree27bbde3457695f894291e97fcc17689a975b4a96 /gcc/tree.c
parente4a9c55ade081438460f6b0db8afbaad34b05d35 (diff)
downloadgcc-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.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index e40ee23..6ad0575 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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. */