diff options
author | Richard Guenther <rguenther@suse.de> | 2012-03-05 11:30:40 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-03-05 11:30:40 +0000 |
commit | 45c0175b882cef14c12fa0778a6d3226c87a8bb5 (patch) | |
tree | 9bf6a96d174a065bab2498da5d8deaaabca275dd /gcc/tree.c | |
parent | d84f3a058b23726afe83d314b87b06b8e1cfd1be (diff) | |
download | gcc-45c0175b882cef14c12fa0778a6d3226c87a8bb5.zip gcc-45c0175b882cef14c12fa0778a6d3226c87a8bb5.tar.gz gcc-45c0175b882cef14c12fa0778a6d3226c87a8bb5.tar.bz2 |
tree.c (integer_zerop): Handle VECTOR_CSTs.
2012-03-05 Richard Guenther <rguenther@suse.de>
* tree.c (integer_zerop): Handle VECTOR_CSTs.
(integer_onep): Likewise.
(integer_all_onesp): Likewise.
From-SVN: r184923
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 59 |
1 files changed, 47 insertions, 12 deletions
@@ -1714,12 +1714,25 @@ integer_zerop (const_tree expr) { STRIP_NOPS (expr); - return ((TREE_CODE (expr) == INTEGER_CST - && TREE_INT_CST_LOW (expr) == 0 - && TREE_INT_CST_HIGH (expr) == 0) - || (TREE_CODE (expr) == COMPLEX_CST - && integer_zerop (TREE_REALPART (expr)) - && integer_zerop (TREE_IMAGPART (expr)))); + switch (TREE_CODE (expr)) + { + case INTEGER_CST: + return (TREE_INT_CST_LOW (expr) == 0 + && TREE_INT_CST_HIGH (expr) == 0); + case COMPLEX_CST: + return (integer_zerop (TREE_REALPART (expr)) + && integer_zerop (TREE_IMAGPART (expr))); + case VECTOR_CST: + { + tree elt; + for (elt = TREE_VECTOR_CST_ELTS (expr); elt; elt = TREE_CHAIN (elt)) + if (!integer_zerop (TREE_VALUE (elt))) + return false; + return true; + } + default: + return false; + } } /* Return 1 if EXPR is the integer constant one or the corresponding @@ -1730,12 +1743,25 @@ integer_onep (const_tree expr) { STRIP_NOPS (expr); - return ((TREE_CODE (expr) == INTEGER_CST - && TREE_INT_CST_LOW (expr) == 1 - && TREE_INT_CST_HIGH (expr) == 0) - || (TREE_CODE (expr) == COMPLEX_CST - && integer_onep (TREE_REALPART (expr)) - && integer_zerop (TREE_IMAGPART (expr)))); + switch (TREE_CODE (expr)) + { + case INTEGER_CST: + return (TREE_INT_CST_LOW (expr) == 1 + && TREE_INT_CST_HIGH (expr) == 0); + case COMPLEX_CST: + return (integer_onep (TREE_REALPART (expr)) + && integer_zerop (TREE_IMAGPART (expr))); + case VECTOR_CST: + { + tree elt; + for (elt = TREE_VECTOR_CST_ELTS (expr); elt; elt = TREE_CHAIN (elt)) + if (!integer_onep (TREE_VALUE (elt))) + return false; + return true; + } + default: + return false; + } } /* Return 1 if EXPR is an integer containing all 1's in as much precision as @@ -1754,6 +1780,15 @@ integer_all_onesp (const_tree expr) && integer_zerop (TREE_IMAGPART (expr))) return 1; + else if (TREE_CODE (expr) == VECTOR_CST) + { + tree elt; + for (elt = TREE_VECTOR_CST_ELTS (expr); elt; elt = TREE_CHAIN (elt)) + if (!integer_all_onesp (TREE_VALUE (elt))) + return 0; + return 1; + } + else if (TREE_CODE (expr) != INTEGER_CST) return 0; |