This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
RFA: better gimplification of compound literals
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?
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" } } */