minor cleanup in forwprop: use get_prop_source_stmt more

Richard Guenther richard.guenther@gmail.com
Fri Sep 14 09:50:00 GMT 2012


On Thu, Sep 13, 2012 at 8:05 PM, Marc Glisse <marc.glisse@inria.fr> wrote:
> Hello,
>
> this patch is a minor cleanup of my previous forwprop patches for vectors. I
> have known about get_prop_source_stmt from the beginning, but for some
> reason I always used SSA_NAME_DEF_STMT. This makes the source code slightly
> shorter, and together with PR 54565 it should help get some optimizations to
> apply as early as forwprop1 instead of forwprop2.
>
> There is one line I had badly indented. I am not sure what the policy is for
> that. Silently bundling it with this patch as I am doing is probably not so
> good. I should probably just fix it in svn without asking the list, but I
> was wondering if I should add a ChangeLog entry and post the committed patch
> to the list afterwards? (that's what I would do by default, at worst it is a
> bit of spam)

That's ok, no changelog needed for that.

Ok.

Thanks,
Richard.

> passes bootstrap+testsuite
>
> 2012-09-14  Marc Glisse  <marc.glisse@inria.fr>
>
>         * tree-ssa-forwprop.c (simplify_bitfield_ref): Call
>         get_prop_source_stmt.
>         (simplify_permutation): Likewise.
>         (simplify_vector_constructor): Likewise.
>
> --
> Marc Glisse
> Index: tree-ssa-forwprop.c
> ===================================================================
> --- tree-ssa-forwprop.c (revision 191247)
> +++ tree-ssa-forwprop.c (working copy)
> @@ -2599,23 +2599,22 @@ simplify_bitfield_ref (gimple_stmt_itera
>    elem_type = TREE_TYPE (TREE_TYPE (op0));
>    if (TREE_TYPE (op) != elem_type)
>      return false;
>
>    size = TREE_INT_CST_LOW (TYPE_SIZE (elem_type));
>    op1 = TREE_OPERAND (op, 1);
>    n = TREE_INT_CST_LOW (op1) / size;
>    if (n != 1)
>      return false;
>
> -  def_stmt = SSA_NAME_DEF_STMT (op0);
> -  if (!def_stmt || !is_gimple_assign (def_stmt)
> -      || !can_propagate_from (def_stmt))
> +  def_stmt = get_prop_source_stmt (op0, false, NULL);
> +  if (!def_stmt || !can_propagate_from (def_stmt))
>      return false;
>
>    op2 = TREE_OPERAND (op, 2);
>    idx = TREE_INT_CST_LOW (op2) / size;
>
>    code = gimple_assign_rhs_code (def_stmt);
>
>    if (code == VEC_PERM_EXPR)
>      {
>        tree p, m, index, tem;
> @@ -2630,21 +2629,21 @@ simplify_bitfield_ref (gimple_stmt_itera
>         {
>           p = gimple_assign_rhs1 (def_stmt);
>         }
>        else
>         {
>           p = gimple_assign_rhs2 (def_stmt);
>           idx -= nelts;
>         }
>        index = build_int_cst (TREE_TYPE (TREE_TYPE (m)), idx * size);
>        tem = build3 (BIT_FIELD_REF, TREE_TYPE (op),
> -                        unshare_expr (p), op1, index);
> +                   unshare_expr (p), op1, index);
>        gimple_assign_set_rhs1 (stmt, tem);
>        fold_stmt (gsi);
>        update_stmt (gsi_stmt (*gsi));
>        return true;
>      }
>
>    return false;
>  }
>
>  /* Determine whether applying the 2 permutations (mask1 then mask2)
> @@ -2682,40 +2681,40 @@ is_combined_permutation_identity (tree m
>  /* Combine a shuffle with its arguments.  Returns 1 if there were any
>     changes made, 2 if cfg-cleanup needs to run.  Else it returns 0.  */
>
>  static int
>  simplify_permutation (gimple_stmt_iterator *gsi)
>  {
>    gimple stmt = gsi_stmt (*gsi);
>    gimple def_stmt;
>    tree op0, op1, op2, op3, arg0, arg1;
>    enum tree_code code;
> +  bool single_use_op0 = false;
>
>    gcc_checking_assert (gimple_assign_rhs_code (stmt) == VEC_PERM_EXPR);
>
>    op0 = gimple_assign_rhs1 (stmt);
>    op1 = gimple_assign_rhs2 (stmt);
>    op2 = gimple_assign_rhs3 (stmt);
>
>    if (TREE_CODE (op2) != VECTOR_CST)
>      return 0;
>
>    if (TREE_CODE (op0) == VECTOR_CST)
>      {
>        code = VECTOR_CST;
>        arg0 = op0;
>      }
>    else if (TREE_CODE (op0) == SSA_NAME)
>      {
> -      def_stmt = SSA_NAME_DEF_STMT (op0);
> -      if (!def_stmt || !is_gimple_assign (def_stmt)
> -         || !can_propagate_from (def_stmt))
> +      def_stmt = get_prop_source_stmt (op0, false, &single_use_op0);
> +      if (!def_stmt || !can_propagate_from (def_stmt))
>         return 0;
>
>        code = gimple_assign_rhs_code (def_stmt);
>        arg0 = gimple_assign_rhs1 (def_stmt);
>      }
>    else
>      return 0;
>
>    /* Two consecutive shuffles.  */
>    if (code == VEC_PERM_EXPR)
> @@ -2740,35 +2739,31 @@ simplify_permutation (gimple_stmt_iterat
>        return remove_prop_source_from_use (op0) ? 2 : 1;
>      }
>
>    /* Shuffle of a constructor.  */
>    else if (code == CONSTRUCTOR || code == VECTOR_CST)
>      {
>        tree opt;
>        bool ret = false;
>        if (op0 != op1)
>         {
> -         if (TREE_CODE (op0) == SSA_NAME && !has_single_use (op0))
> +         if (TREE_CODE (op0) == SSA_NAME && !single_use_op0)
>             return 0;
>
>           if (TREE_CODE (op1) == VECTOR_CST)
>             arg1 = op1;
>           else if (TREE_CODE (op1) == SSA_NAME)
>             {
>               enum tree_code code2;
>
> -             if (!has_single_use (op1))
> -               return 0;
> -
> -             gimple def_stmt2 = SSA_NAME_DEF_STMT (op1);
> -             if (!def_stmt2 || !is_gimple_assign (def_stmt2)
> -                 || !can_propagate_from (def_stmt2))
> +             gimple def_stmt2 = get_prop_source_stmt (op1, true, NULL);
> +             if (!def_stmt2 || !can_propagate_from (def_stmt2))
>                 return 0;
>
>               code2 = gimple_assign_rhs_code (def_stmt2);
>               if (code2 != CONSTRUCTOR && code2 != VECTOR_CST)
>                 return 0;
>               arg1 = gimple_assign_rhs1 (def_stmt2);
>             }
>           else
>             return 0;
>         }
> @@ -2824,22 +2819,22 @@ simplify_vector_constructor (gimple_stmt
>    maybe_ident = true;
>    FOR_EACH_VEC_ELT (constructor_elt, CONSTRUCTOR_ELTS (op), i, elt)
>      {
>        tree ref, op1;
>
>        if (i >= nelts)
>         return false;
>
>        if (TREE_CODE (elt->value) != SSA_NAME)
>         return false;
> -      def_stmt = SSA_NAME_DEF_STMT (elt->value);
> -      if (!def_stmt || !is_gimple_assign (def_stmt))
> +      def_stmt = get_prop_source_stmt (elt->value, false, NULL);
> +      if (!def_stmt)
>         return false;
>        code = gimple_assign_rhs_code (def_stmt);
>        if (code != BIT_FIELD_REF)
>         return false;
>        op1 = gimple_assign_rhs1 (def_stmt);
>        ref = TREE_OPERAND (op1, 0);
>        if (orig)
>         {
>           if (ref != orig)
>             return false;
>



More information about the Gcc-patches mailing list