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

Reply via email to