gimplify.c (gimplify_compound_literal_expr): Take gimple_test_f argument...
authorMichael Matz <matz@suse.de>
Fri, 15 Jun 2012 14:46:36 +0000 (14:46 +0000)
committerMichael Matz <matz@gcc.gnu.org>
Fri, 15 Jun 2012 14:46:36 +0000 (14:46 +0000)
* 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.

From-SVN: r188665

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/vector-4.c [new file with mode: 0644]

index 7f21827f86a72f5e22e2e4cd2f4b325b8cc6abb2..ebb64a7e7f3e9d7ce00bc3992f30786b9db08e5b 100644 (file)
@@ -1,3 +1,9 @@
+2012-06-15  Michael Matz  <matz@suse.de>
+
+       * gimplify.c (gimplify_compound_literal_expr): Take gimple_test_f
+       argument, don't emit assign statement if value is directly usable.
+       (gimplify_expr): Adjust.
+
 2012-06-15  Michael Matz  <matz@suse.de>
 
        * gimplify.c (gimplify_modify_expr): Fold generated statements.
index c59e754bb6f3f8c53f7a1b40747b19cb10392129..9bf4ead84ed202d2a84b0fa870b38822ed3c0ba9 100644 (file)
@@ -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
@@ -7121,7 +7135,8 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
          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 44215ff1e32bc2816c44b520dfcb260ae549bf74..8678626f8b1ebb64bb51071d7e4c1549b04af839 100644 (file)
@@ -1,3 +1,7 @@
+2012-06-15  Michael Matz  <matz@suse.de>
+
+       * gcc.dg/tree-ssa/vector-4.c: New test.
+
 2012-06-15  Michael Matz  <matz@suse.de>
 
        * gcc.dg/debug/dwarf2/inline3.c: Adjust.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vector-4.c b/gcc/testsuite/gcc.dg/tree-ssa/vector-4.c
new file mode 100644 (file)
index 0000000..bfef25f
--- /dev/null
@@ -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" } } */