Commit 6da8be89 by Michael Matz Committed by Michael Matz

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.

testsuite/
	* gcc.dg/debug/dwarf2/inline3.c: Adjust.
	* gcc.dg/tree-ssa/foldstring-1.c: Adjust.

From-SVN: r188664
parent ef5ad3b7
2012-06-15 Michael Matz <matz@suse.de>
* gimplify.c (gimplify_modify_expr): Fold generated statements.
* gimple-fold.c (can_refer_decl_in_current_unit_p): Check flag_ltrans.
2012-06-15 Richard Guenther <rguenther@suse.de> 2012-06-15 Richard Guenther <rguenther@suse.de>
* tree-vrp.c (set_and_canonicalize_value_range): Use canonical * tree-vrp.c (set_and_canonicalize_value_range): Use canonical
......
...@@ -61,19 +61,21 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl) ...@@ -61,19 +61,21 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl)
struct cgraph_node *node; struct cgraph_node *node;
symtab_node snode; symtab_node snode;
/* We will later output the initializer, so we can reffer to it. /* We will later output the initializer, so we can refer to it.
So we are concerned only when DECL comes from initializer of So we are concerned only when DECL comes from initializer of
external var. */ external var. */
if (!from_decl if (!from_decl
|| TREE_CODE (from_decl) != VAR_DECL || TREE_CODE (from_decl) != VAR_DECL
|| !DECL_EXTERNAL (from_decl) || !DECL_EXTERNAL (from_decl)
|| (symtab_get_node (from_decl)->symbol.in_other_partition)) || (flag_ltrans
&& symtab_get_node (from_decl)->symbol.in_other_partition))
return true; return true;
/* We are concerned ony about static/external vars and functions. */ /* We are concerned only about static/external vars and functions. */
if ((!TREE_STATIC (decl) && !DECL_EXTERNAL (decl)) if ((!TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
|| (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)) || (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL))
return true; return true;
/* Weakrefs have somewhat confusing DECL_EXTERNAL flag set; they are always safe. */ /* Weakrefs have somewhat confusing DECL_EXTERNAL flag set; they
are always safe. */
if (DECL_EXTERNAL (decl) if (DECL_EXTERNAL (decl)
&& lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) && lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
return true; return true;
......
...@@ -4772,6 +4772,7 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, ...@@ -4772,6 +4772,7 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
enum gimplify_status ret = GS_UNHANDLED; enum gimplify_status ret = GS_UNHANDLED;
gimple assign; gimple assign;
location_t loc = EXPR_LOCATION (*expr_p); location_t loc = EXPR_LOCATION (*expr_p);
gimple_stmt_iterator gsi;
gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
|| TREE_CODE (*expr_p) == INIT_EXPR); || TREE_CODE (*expr_p) == INIT_EXPR);
...@@ -4912,8 +4913,6 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, ...@@ -4912,8 +4913,6 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
gimple_set_location (assign, EXPR_LOCATION (*expr_p)); gimple_set_location (assign, EXPR_LOCATION (*expr_p));
} }
gimplify_seq_add_stmt (pre_p, assign);
if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p)) if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
{ {
/* If we've somehow already got an SSA_NAME on the LHS, then /* If we've somehow already got an SSA_NAME on the LHS, then
...@@ -4923,6 +4922,10 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, ...@@ -4923,6 +4922,10 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
gimple_set_lhs (assign, *to_p); gimple_set_lhs (assign, *to_p);
} }
gimplify_seq_add_stmt (pre_p, assign);
gsi = gsi_last (*pre_p);
fold_stmt (&gsi);
if (want_value) if (want_value)
{ {
*expr_p = TREE_THIS_VOLATILE (*to_p) ? *from_p : unshare_expr (*to_p); *expr_p = TREE_THIS_VOLATILE (*to_p) ? *from_p : unshare_expr (*to_p);
......
2012-06-15 Michael Matz <matz@suse.de>
* gcc.dg/debug/dwarf2/inline3.c: Adjust.
* gcc.dg/tree-ssa/foldstring-1.c: Adjust.
2012-06-15 Ulrich Weigand <ulrich.weigand@linaro.org> 2012-06-15 Ulrich Weigand <ulrich.weigand@linaro.org>
PR tree-optimization/53636 PR tree-optimization/53636
......
/* Verify that only one DW_AT_const_value is emitted for baz, /* Verify that only one DW_AT_const_value is emitted for baz,
not for baz abstract DIE and again inside of not for baz abstract DIE and again inside of
DW_TAG_inlined_subroutine. */ DW_TAG_inlined_subroutine. */
/* { dg-options "-O2 -g -dA" } */ /* { dg-options "-O2 -g -dA -fmerge-all-constants" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-final { scan-assembler-times " DW_AT_const_value" 1 } } */ /* { dg-final { scan-assembler-times " DW_AT_const_value" 1 } } */
...@@ -11,6 +11,9 @@ static inline long ...@@ -11,6 +11,9 @@ static inline long
foo (void) foo (void)
{ {
const struct A baz = { .i = 2, .j = 21 }; const struct A baz = { .i = 2, .j = 21 };
/* We must make sure that baz isn't optimized away before inlining,
otherwise its initializer is also lost. */
const struct A *p = &baz;
asm volatile ("" : : : "memory"); asm volatile ("" : : : "memory");
return baz.i * baz.j; return baz.i * baz.j;
} }
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O1 -fdump-tree-fre1" } */ /* { dg-options "-O1 -fdump-tree-gimple" } */
void void
arf () arf ()
...@@ -7,5 +7,5 @@ arf () ...@@ -7,5 +7,5 @@ arf ()
if (""[0] == 0) if (""[0] == 0)
blah (); blah ();
} }
/* { dg-final { scan-tree-dump-times "= 0;" 1 "fre1"} } */ /* { dg-final { scan-tree-dump-times "= 0;" 1 "gimple"} } */
/* { dg-final { cleanup-tree-dump "fre1" } } */ /* { 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