On Wed, Oct 10, 2012 at 7:49 PM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > This patch folds REDUC_*_EXPR (e.g. on pr54877.c -Ofast -mavx > testcase we end up with unfolded REDUC_PLUS_EXPR till *.optimized). > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Eh, I didn't realize the result type is a vector ... can you adjust the docs in tree.def to reflect that the _result_ is a vector with the first element having the result and operand 0 is the vector being reduced? Ok. Thanks, Richard. > 2012-10-10 Jakub Jelinek <ja...@redhat.com> > > * fold-const.c (fold_unary_loc): Handle REDUC_MIN_EXPR, > REDUC_MAX_EXPR and REDUC_PLUS_EXPR. > > --- gcc/fold-const.c.jj 2012-10-09 13:42:30.000000000 +0200 > +++ gcc/fold-const.c 2012-10-10 12:28:11.768999520 +0200 > @@ -8294,6 +8294,40 @@ fold_unary_loc (location_t loc, enum tre > 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) */ > > Jakub