Commit 4c53d183 by Michael Matz Committed by Michael Matz

gimplify.c (gimplify_compound_literal_expr): Take gimple_test_f argument...

	* 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
parent 6da8be89
2012-06-15 Michael Matz <matz@suse.de> 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. * gimplify.c (gimplify_modify_expr): Fold generated statements.
* gimple-fold.c (can_refer_decl_in_current_unit_p): Check flag_ltrans. * gimple-fold.c (can_refer_decl_in_current_unit_p): Check flag_ltrans.
......
...@@ -3796,15 +3796,29 @@ rhs_predicate_for (tree lhs) ...@@ -3796,15 +3796,29 @@ rhs_predicate_for (tree lhs)
static enum gimplify_status static enum gimplify_status
gimplify_compound_literal_expr (tree *expr_p, gimple_seq *pre_p, gimplify_compound_literal_expr (tree *expr_p, gimple_seq *pre_p,
bool (*gimple_test_f) (tree),
fallback_t fallback) fallback_t fallback)
{ {
tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (*expr_p); tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (*expr_p);
tree decl = DECL_EXPR_DECL (decl_s); tree decl = DECL_EXPR_DECL (decl_s);
tree init = DECL_INITIAL (decl);
/* Mark the decl as addressable if the compound literal /* Mark the decl as addressable if the compound literal
expression is addressable now, otherwise it is marked too late expression is addressable now, otherwise it is marked too late
after we gimplify the initialization expression. */ after we gimplify the initialization expression. */
if (TREE_ADDRESSABLE (*expr_p)) if (TREE_ADDRESSABLE (*expr_p))
TREE_ADDRESSABLE (decl) = 1; 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 /* Preliminarily mark non-addressed complex variables as eligible
for promotion to gimple registers. We'll transform their uses 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, ...@@ -7121,7 +7135,8 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
break; break;
case COMPOUND_LITERAL_EXPR: 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; break;
case MODIFY_EXPR: case MODIFY_EXPR:
......
2012-06-15 Michael Matz <matz@suse.de> 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. * gcc.dg/debug/dwarf2/inline3.c: Adjust.
* gcc.dg/tree-ssa/foldstring-1.c: Adjust. * gcc.dg/tree-ssa/foldstring-1.c: Adjust.
......
/* { 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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment