diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-10-11 18:37:23 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-10-11 18:37:23 +0000 |
commit | a1ea41e0bdf144e293a80c210a8dad11bef2f2ad (patch) | |
tree | 7c2e3943160ede3ddc0efb39dbe6cdd9d1da45e7 /gcc | |
parent | 0bc6c5f4f1eacc84371da5268f572a5cc3765c03 (diff) | |
download | ppe42-gcc-a1ea41e0bdf144e293a80c210a8dad11bef2f2ad.tar.gz ppe42-gcc-a1ea41e0bdf144e293a80c210a8dad11bef2f2ad.zip |
* fold-const.c (fold_unary_loc): Handle REDUC_MIN_EXPR,
REDUC_MAX_EXPR and REDUC_PLUS_EXPR.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192376 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fold-const.c | 34 |
2 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ddad1bd4a3..a4bc0e417f5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-10-11 Jakub Jelinek <jakub@redhat.com> + + * fold-const.c (fold_unary_loc): Handle REDUC_MIN_EXPR, + REDUC_MAX_EXPR and REDUC_PLUS_EXPR. + 2012-10-11 James Lemke <jwlemke@codesourcery.com> * config/rs6000/predicates.md (zero_fp_constant): Fix comment. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 99655a1df9c..b1d811d3548 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8294,6 +8294,40 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0) return build_vector (type, elts); } + case REDUC_MIN_EXPR: + case REDUC_MAX_EXPR: + case REDUC_PLUS_EXPR: + { + unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i; + tree *elts; + enum tree_code subcode; + + if (TREE_CODE (op0) != VECTOR_CST) + return NULL_TREE; + + elts = XALLOCAVEC (tree, nelts); + if (!vec_cst_ctor_to_array (op0, elts)) + return NULL_TREE; + + switch (code) + { + case REDUC_MIN_EXPR: subcode = MIN_EXPR; break; + case REDUC_MAX_EXPR: subcode = MAX_EXPR; break; + case REDUC_PLUS_EXPR: subcode = PLUS_EXPR; break; + default: gcc_unreachable (); + } + + for (i = 1; i < nelts; i++) + { + elts[0] = const_binop (subcode, elts[0], elts[i]); + if (elts[0] == NULL_TREE || !CONSTANT_CLASS_P (elts[0])) + return NULL_TREE; + elts[i] = build_zero_cst (TREE_TYPE (type)); + } + + return build_vector (type, elts); + } + default: return NULL_TREE; } /* switch (code) */ |