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
This commit is contained in:
parent
6da8be895c
commit
4c53d18336
|
@ -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.
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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" } } */
|
Loading…
Reference in New Issue