This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFA: better gimplification of compound literals


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" } } */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]