On Sat, Sep 1, 2012 at 4:38 PM, Marc Glisse <marc.gli...@inria.fr> wrote:
> Hello,
>
> I noticed while writing the patch posted at:
> http://gcc.gnu.org/ml/gcc-patches/2012-08/msg01755.html
>
> that fold_ternary_loc sometimes doesn't go all the way for VEC_PERM_EXPR,
> calling it a second time would fold even more. Fixed by a simple reordering.
>
> (bootstrap and testsuite are ok)

Ok.

Thanks,
Richard.

> 2012-09-01  Marc Glisse  <marc.gli...@inria.fr>
>
> gcc/
>         * fold-const.c (fold_ternary_loc): Constant-propagate after
>         removing dead operands.
>
> gcc/testsuite/
>         * gcc.dg/fold-perm.c: Improve test.
>
> --
> Marc Glisse
> Index: fold-const.c
> ===================================================================
> --- fold-const.c        (revision 190845)
> +++ fold-const.c        (working copy)
> @@ -14189,40 +14189,40 @@ fold_ternary_loc (location_t loc, enum t
>             }
>
>           if (maybe_identity)
>             {
>               if (all_in_vec0)
>                 return op0;
>               if (all_in_vec1)
>                 return op1;
>             }
>
> -         if ((TREE_CODE (arg0) == VECTOR_CST
> -              || TREE_CODE (arg0) == CONSTRUCTOR)
> -             && (TREE_CODE (arg1) == VECTOR_CST
> -                 || TREE_CODE (arg1) == CONSTRUCTOR))
> -           {
> -             t = fold_vec_perm (type, arg0, arg1, sel);
> -             if (t != NULL_TREE)
> -               return t;
> -           }
> -
>           if (all_in_vec0)
>             op1 = op0;
>           else if (all_in_vec1)
>             {
>               op0 = op1;
>               for (i = 0; i < nelts; i++)
>                 sel[i] -= nelts;
>               need_mask_canon = true;
>             }
>
> +         if ((TREE_CODE (op0) == VECTOR_CST
> +              || TREE_CODE (op0) == CONSTRUCTOR)
> +             && (TREE_CODE (op1) == VECTOR_CST
> +                 || TREE_CODE (op1) == CONSTRUCTOR))
> +           {
> +             t = fold_vec_perm (type, op0, op1, sel);
> +             if (t != NULL_TREE)
> +               return t;
> +           }
> +
>           if (op0 == op1 && !single_arg)
>             changed = true;
>
>           if (need_mask_canon && arg2 == op2)
>             {
>               tree *tsel = XALLOCAVEC (tree, nelts);
>               tree eltype = TREE_TYPE (TREE_TYPE (arg2));
>               for (i = 0; i < nelts; i++)
>                 tsel[i] = build_int_cst (eltype, sel[i]);
>               op2 = build_vector (TREE_TYPE (arg2), tsel);
> Index: testsuite/gcc.dg/fold-perm.c
> ===================================================================
> --- testsuite/gcc.dg/fold-perm.c        (revision 190845)
> +++ testsuite/gcc.dg/fold-perm.c        (working copy)
> @@ -1,19 +1,20 @@
>  /* { dg-do compile } */
>  /* { dg-options "-O -fdump-tree-ccp1" } */
>
>  typedef int veci __attribute__ ((vector_size (4 * sizeof (int))));
>
> -void fun (veci *f, veci *g, veci *h)
> +void fun (veci *f, veci *g, veci *h, veci *i)
>  {
>    veci m = { 7, 7, 4, 6 };
>    veci n = { 0, 1, 2, 3 };
>    veci p = { 1, 1, 7, 6 };
> +  *i = __builtin_shuffle (*i,  p, m);
>    *h = __builtin_shuffle (*h, *h, p);
>    *g = __builtin_shuffle (*f, *g, m);
>    *f = __builtin_shuffle (*f, *g, n);
>  }
>
>  /* { dg-final { scan-tree-dump "VEC_PERM_EXPR.*{ 3, 3, 0, 2 }" "ccp1" } }
> */
>  /* { dg-final { scan-tree-dump "VEC_PERM_EXPR.*{ 1, 1, 3, 2 }" "ccp1" } }
> */
>  /* { dg-final { scan-tree-dump-times "VEC_PERM_EXPR" 2 "ccp1" } } */
>  /* { dg-final { cleanup-tree-dump "ccp1" } } */
>

Reply via email to