RFA: better gimplification of compound literals

Richard Guenther richard.guenther@gmail.com
Wed Jun 13 12:37:00 GMT 2012


On Wed, Jun 13, 2012 at 1:46 PM, Michael Matz <matz@suse.de> wrote:
> Hi,
>
> On Tue, 12 Jun 2012, Richard Guenther wrote:
>
>> > Ok, I see the C frontend hands us this as
>> >
>> >  return  VEC_PERM_EXPR < a , b , <<< Unknown tree: compound_literal_expr
>> >    v4si D.1712 = { 0, 4, 1, 5 }; >>> > ;
>> >
>> > and gimplification in some way fails to gimplify it to { 0, 4, 1, 5 }.
>
> Was a non-implemented optimization.  If the compound literal value isn't
> used as lvalue and doesn't have its address taken (and generally fits the
> current predicate) we can as well subst it in place instead of going over
> an intermediate statement.
>
> Regstrapping on x86_64-linux in progress.  Okay if that passes?

Ok.

Thanks,
Richard.

>
> Ciao,
> Michael.
> ---------------------
>        * gimplify.c (gimplify_compound_literal_expr): Take gimple_test_f
>        argument, don't emit assign statement if value is directly usable.
>        (gimplify_expr): Adjust.
>
> testsuite/
>        * gcc.dg/tree-ssa/vector-4.c: New test.
>
> Index: gimplify.c
> ===================================================================
> --- gimplify.c  (revision 188500)
> +++ gimplify.c  (working copy)
> @@ -3796,15 +3796,29 @@ rhs_predicate_for (tree lhs)
>
>  static enum gimplify_status
>  gimplify_compound_literal_expr (tree *expr_p, gimple_seq *pre_p,
> +                               bool (*gimple_test_f) (tree),
>                                fallback_t fallback)
>  {
>   tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (*expr_p);
>   tree decl = DECL_EXPR_DECL (decl_s);
> +  tree init = DECL_INITIAL (decl);
>   /* Mark the decl as addressable if the compound literal
>      expression is addressable now, otherwise it is marked too late
>      after we gimplify the initialization expression.  */
>   if (TREE_ADDRESSABLE (*expr_p))
>     TREE_ADDRESSABLE (decl) = 1;
> +  /* Otherwise, if we don't need an lvalue and have a literal directly
> +     substitute it.  Check if it matches the gimple predicate, as
> +     otherwise we'd generate a new temporary, and we can as well just
> +     use the decl we already have.  */
> +  else if (!TREE_ADDRESSABLE (decl)
> +          && init
> +          && (fallback & fb_lvalue) == 0
> +          && gimple_test_f (init))
> +    {
> +      *expr_p = init;
> +      return GS_OK;
> +    }
>
>   /* Preliminarily mark non-addressed complex variables as eligible
>      for promotion to gimple registers.  We'll transform their uses
> @@ -7118,7 +7132,8 @@ gimplify_expr (tree *expr_p, gimple_seq
>          break;
>
>        case COMPOUND_LITERAL_EXPR:
> -         ret = gimplify_compound_literal_expr (expr_p, pre_p, fallback);
> +         ret = gimplify_compound_literal_expr (expr_p, pre_p,
> +                                               gimple_test_f, fallback);
>          break;
>
>        case MODIFY_EXPR:
> Index: testsuite/gcc.dg/tree-ssa/vector-4.c
> ===================================================================
> --- testsuite/gcc.dg/tree-ssa/vector-4.c        (revision 0)
> +++ testsuite/gcc.dg/tree-ssa/vector-4.c        (revision 0)
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-w -O1 -fdump-tree-gimple" } */
> +
> +typedef int v4si __attribute__ ((vector_size (16)));
> +
> +v4si vs (v4si a, v4si b)
> +{
> +  return __builtin_shuffle (a, b, (v4si) {0, 4, 1, 5});
> +}
> +
> +/* The compound literal should be placed directly in the vec_perm.  */
> +/* { dg-final { scan-tree-dump-times "VEC_PERM_EXPR <a, b, { 0, 4, 1, 5 }>;" 1 "gimple"} } */
> +
> +/* { dg-final { cleanup-tree-dump "gimple" } } */



More information about the Gcc-patches mailing list