summaryrefslogtreecommitdiffstats
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-10-11 18:37:23 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-10-11 18:37:23 +0000
commita1ea41e0bdf144e293a80c210a8dad11bef2f2ad (patch)
tree7c2e3943160ede3ddc0efb39dbe6cdd9d1da45e7 /gcc/fold-const.c
parent0bc6c5f4f1eacc84371da5268f572a5cc3765c03 (diff)
downloadppe42-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/fold-const.c')
-rw-r--r--gcc/fold-const.c34
1 files changed, 34 insertions, 0 deletions
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) */
OpenPOWER on IntegriCloud