gimplify.c (gimplify_modify_expr): Fold generated statements.
authorMichael Matz <matz@suse.de>
Fri, 15 Jun 2012 14:40:38 +0000 (14:40 +0000)
committerMichael Matz <matz@gcc.gnu.org>
Fri, 15 Jun 2012 14:40:38 +0000 (14:40 +0000)
* 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

gcc/ChangeLog
gcc/gimple-fold.c
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/debug/dwarf2/inline3.c
gcc/testsuite/gcc.dg/tree-ssa/foldstring-1.c

index e9f1890dea46bc323d255ccbedd2a1bb171ebb57..7f21827f86a72f5e22e2e4cd2f4b325b8cc6abb2 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        * tree-vrp.c (set_and_canonicalize_value_range): Use canonical
index b2bd33788028349ad5087231f0ae209d3de24046..08e960363b6c0f614f9f87417cccb60292c283de 100644 (file)
@@ -61,19 +61,21 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl)
   struct cgraph_node *node;
   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
      external var.  */
   if (!from_decl
       || TREE_CODE (from_decl) != VAR_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;
-  /* 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))
       || (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL))
     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)
       && lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
     return true;
index 633e326dae02506512826baf2e946a571a1a8f55..c59e754bb6f3f8c53f7a1b40747b19cb10392129 100644 (file)
@@ -4772,6 +4772,7 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
   enum gimplify_status ret = GS_UNHANDLED;
   gimple assign;
   location_t loc = EXPR_LOCATION (*expr_p);
+  gimple_stmt_iterator gsi;
 
   gcc_assert (TREE_CODE (*expr_p) == MODIFY_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,
       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 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,
       gimple_set_lhs (assign, *to_p);
     }
 
+  gimplify_seq_add_stmt (pre_p, assign);
+  gsi = gsi_last (*pre_p);
+  fold_stmt (&gsi);
+
   if (want_value)
     {
       *expr_p = TREE_THIS_VOLATILE (*to_p) ? *from_p : unshare_expr (*to_p);
index ca264c33a3c92f8b8cbd37b7e964dd19f756d49a..44215ff1e32bc2816c44b520dfcb260ae549bf74 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        PR tree-optimization/53636
index feafb33e829d6f9f63f5d87cc08702398308c8ed..d2d3e0fd8a84fd8fbd3105e797ae5716b7cea234 100644 (file)
@@ -1,7 +1,7 @@
 /* Verify that only one DW_AT_const_value is emitted for baz,
    not for baz abstract DIE and again inside of
    DW_TAG_inlined_subroutine.  */
-/* { dg-options "-O2 -g -dA" } */
+/* { dg-options "-O2 -g -dA -fmerge-all-constants" } */
 /* { dg-do compile } */
 /* { dg-final { scan-assembler-times " DW_AT_const_value" 1 } } */
 
@@ -11,6 +11,9 @@ static inline long
 foo (void)
 {
   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");
   return baz.i * baz.j;
 }
index 3cfe44d1bd252cb2d786b71be6549e100026d558..e738a44ab007bb5b85bd2a5f8eac9772e9890f84 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O1 -fdump-tree-fre1" } */
+/* { dg-options "-O1 -fdump-tree-gimple" } */
 
 void
 arf ()
@@ -7,5 +7,5 @@ arf ()
   if (""[0] == 0)
     blah ();
 }
-/* { dg-final { scan-tree-dump-times "= 0;" 1 "fre1"} } */
-/* { dg-final { cleanup-tree-dump "fre1" } } */
+/* { dg-final { scan-tree-dump-times "= 0;" 1 "gimple"} } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */