From d9a72d17e64f6a1b50ef859dadcf86551de1b265 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Fri, 12 Sep 2014 12:42:47 +0200 Subject: tree.c (integer_each_onep): New function. 2014-09-12 Marc Glisse 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 --- gcc/tree.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'gcc/tree.c') 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. */ -- cgit v1.1