re PR c++/34949 (Dead code in empty destructors.)
authorJakub Jelinek <jakub@redhat.com>
Tue, 2 Apr 2013 18:25:36 +0000 (20:25 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 2 Apr 2013 18:25:36 +0000 (20:25 +0200)
PR c++/34949
* tree-cfg.c (verify_gimple_assign_single): Allow lhs
of gimple_clobber_p to be MEM_REF.
* gimplify.c (gimplify_modify_expr): Gimplify *to_p of
an assignment from TREE_CLOBBER_P.  Allow it to be MEM_REF
after gimplification.
* asan.c (get_mem_ref_of_assignment): Don't instrument
gimple_clobber_p stmts.
* tree-ssa-dse.c (dse_optimize_stmt): Allow DSE of
gimple_clobber_p stmt if they have MEM_REF lhs and
are dead because of another gimple_clobber_p stmt.
* tree-ssa-live.c (clear_unused_block_pointer): Treat
gimple_clobber_p stmts like debug stmts.
(remove_unused_locals): Remove clobbers with MEM_REF lhs
that refer to unused VAR_DECLs or uninitialized values.
* tree-sra.c (sra_ipa_reset_debug_stmts): Also remove
gimple_clobber_p stmts if they refer to removed parameters.
(get_repl_default_def_ssa_name, sra_ipa_modify_expr): Fix up
formatting.

From-SVN: r197369

gcc/ChangeLog
gcc/asan.c
gcc/gimplify.c
gcc/tree-cfg.c
gcc/tree-sra.c
gcc/tree-ssa-dse.c
gcc/tree-ssa-live.c

index de855d7a9547505f32d8d21d2d83be55db5b82de..e6cfd74557233d5370af2ba270fe50166e993b27 100644 (file)
@@ -1,3 +1,25 @@
+2013-04-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/34949
+       * tree-cfg.c (verify_gimple_assign_single): Allow lhs
+       of gimple_clobber_p to be MEM_REF.
+       * gimplify.c (gimplify_modify_expr): Gimplify *to_p of
+       an assignment from TREE_CLOBBER_P.  Allow it to be MEM_REF
+       after gimplification.
+       * asan.c (get_mem_ref_of_assignment): Don't instrument
+       gimple_clobber_p stmts.
+       * tree-ssa-dse.c (dse_optimize_stmt): Allow DSE of
+       gimple_clobber_p stmt if they have MEM_REF lhs and
+       are dead because of another gimple_clobber_p stmt.
+       * tree-ssa-live.c (clear_unused_block_pointer): Treat
+       gimple_clobber_p stmts like debug stmts.
+       (remove_unused_locals): Remove clobbers with MEM_REF lhs
+       that refer to unused VAR_DECLs or uninitialized values.
+       * tree-sra.c (sra_ipa_reset_debug_stmts): Also remove
+       gimple_clobber_p stmts if they refer to removed parameters.
+       (get_repl_default_def_ssa_name, sra_ipa_modify_expr): Fix up
+       formatting.
+
 2013-04-02  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (*testqi_ext_3): Merge with *testqi_ext_3_rex64
index 52a2dbc5dfdd95630a777206ddfb696184d231ba..36eccf93cbb3dff95931b3091360340af2f296e1 100644 (file)
@@ -412,7 +412,8 @@ get_mem_ref_of_assignment (const gimple assignment,
 {
   gcc_assert (gimple_assign_single_p (assignment));
 
-  if (gimple_store_p (assignment))
+  if (gimple_store_p (assignment)
+      && !gimple_clobber_p (assignment))
     {
       ref->start = gimple_assign_lhs (assignment);
       *ref_is_store = true;
index a6a6565ce04fc1a59ec02a0a2b77217b2653d539..a93ce7c2ad272002e8fb691c286eeb8f8b6bbce6 100644 (file)
@@ -4840,7 +4840,12 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
      so handle it here.  */
   if (TREE_CLOBBER_P (*from_p))
     {
-      gcc_assert (!want_value && TREE_CODE (*to_p) == VAR_DECL);
+      ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
+      if (ret == GS_ERROR)
+       return ret;
+      gcc_assert (!want_value
+                 && (TREE_CODE (*to_p) == VAR_DECL
+                     || TREE_CODE (*to_p) == MEM_REF));
       gimplify_seq_add_stmt (pre_p, gimple_build_assign (*to_p, *from_p));
       *expr_p = NULL;
       return GS_ALL_DONE;
index 6be417b0f25f5345a8f5235d84a7e380c9364179..8a36976cc3b8b2d2eeadca62f10ac52549ac38ce 100644 (file)
@@ -3815,9 +3815,9 @@ verify_gimple_assign_single (gimple stmt)
     }
 
   if (gimple_clobber_p (stmt)
-      && !DECL_P (lhs))
+      && !(DECL_P (lhs) || TREE_CODE (lhs) == MEM_REF))
     {
-      error ("non-decl LHS in clobber statement");
+      error ("non-decl/MEM_REF LHS in clobber statement");
       debug_generic_expr (lhs);
       return true;
     }
index 93446c2151ae7d89989d8639336bb41ea9a25e4c..78efa255b1d88bf4dfe7d10e922c6c1824478898 100644 (file)
@@ -2965,8 +2965,8 @@ sra_modify_constructor_assign (gimple *stmt, gimple_stmt_iterator *gsi)
 static tree
 get_repl_default_def_ssa_name (struct access *racc)
 {
-  gcc_checking_assert (!racc->grp_to_be_replaced &&
-                      !racc->grp_to_be_debug_replaced);
+  gcc_checking_assert (!racc->grp_to_be_replaced
+                      && !racc->grp_to_be_debug_replaced);
   if (!racc->replacement_decl)
     racc->replacement_decl = create_access_replacement (racc);
   return get_or_create_ssa_default_def (cfun, racc->replacement_decl);
@@ -4462,8 +4462,8 @@ sra_ipa_modify_expr (tree *expr, bool convert,
     {
       adj = &adjustments[i];
 
-      if (adj->base == base &&
-         (adj->offset == offset || adj->remove_param))
+      if (adj->base == base
+         && (adj->offset == offset || adj->remove_param))
        {
          cand = adj;
          break;
@@ -4676,6 +4676,14 @@ sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments)
       if (name)
        FOR_EACH_IMM_USE_STMT (stmt, ui, name)
          {
+           if (gimple_clobber_p (stmt))
+             {
+               gimple_stmt_iterator cgsi = gsi_for_stmt (stmt);
+               unlink_stmt_vdef (stmt);
+               gsi_remove (&cgsi, true);
+               release_defs (stmt);
+               continue;
+             }
            /* All other users must have been removed by
               ipa_sra_modify_function_body.  */
            gcc_assert (is_gimple_debug (stmt));
index 223682b057a953a049afd6428a2fe69511d7dfbd..e0c3b745b1e9f636885ad324c3d241ec28c1f9e9 100644 (file)
@@ -218,7 +218,10 @@ dse_optimize_stmt (gimple_stmt_iterator *gsi)
   if (is_gimple_call (stmt) && gimple_call_fndecl (stmt))
     return;
 
-  if (gimple_has_volatile_ops (stmt))
+  /* Don't return early on *this_2(D) ={v} {CLOBBER}.  */
+  if (gimple_has_volatile_ops (stmt)
+      && (!gimple_clobber_p (stmt)
+         || TREE_CODE (gimple_assign_lhs (stmt)) != MEM_REF))
     return;
 
   if (is_gimple_assign (stmt))
@@ -228,6 +231,12 @@ dse_optimize_stmt (gimple_stmt_iterator *gsi)
       if (!dse_possible_dead_store_p (stmt, &use_stmt))
        return;
 
+      /* But only remove *this_2(D) ={v} {CLOBBER} if killed by
+        another clobber stmt.  */
+      if (gimple_clobber_p (stmt)
+         && !gimple_clobber_p (use_stmt))
+       return;
+
       /* If we have precisely one immediate use at this point and the
         stores are to the same memory location or there is a chain of
         virtual uses from stmt and the stmt which stores to that same
index 756fa37384788c08859b6e559a4bc2185c2990f9..c8b9ce8b016ad5e4237908a8770e08c93ef2a997 100644 (file)
@@ -623,8 +623,8 @@ clear_unused_block_pointer_1 (tree *tp, int *, void *)
   return NULL_TREE;
 }
 
-/* Set all block pointer in debug stmt to NULL if the block is unused,
-   so that they will not be streamed out.  */
+/* Set all block pointer in debug or clobber stmt to NULL if the block
+   is unused, so that they will not be streamed out.  */
 
 static void
 clear_unused_block_pointer (void)
@@ -639,7 +639,7 @@ clear_unused_block_pointer (void)
        tree b;
        gimple stmt = gsi_stmt (gsi);
 
-       if (!is_gimple_debug (stmt))
+       if (!is_gimple_debug (stmt) && !gimple_clobber_p (stmt))
          continue;
        b = gimple_block (stmt);
        if (b && !TREE_USED (b))
@@ -827,7 +827,15 @@ remove_unused_locals (void)
            if (gimple_clobber_p (stmt))
              {
                tree lhs = gimple_assign_lhs (stmt);
-               if (TREE_CODE (lhs) == VAR_DECL && !is_used_p (lhs))
+               tree base = get_base_address (lhs);
+               /* Remove clobbers referencing unused vars, or clobbers
+                  with MEM_REF lhs referencing uninitialized pointers.  */
+               if ((TREE_CODE (base) == VAR_DECL && !is_used_p (base))
+                   || (TREE_CODE (lhs) == MEM_REF
+                       && TREE_CODE (TREE_OPERAND (lhs, 0)) == SSA_NAME
+                       && SSA_NAME_IS_DEFAULT_DEF (TREE_OPERAND (lhs, 0))
+                       && (TREE_CODE (SSA_NAME_VAR (TREE_OPERAND (lhs, 0)))
+                           != PARM_DECL)))
                  {
                    unlink_stmt_vdef (stmt);
                    gsi_remove (&gsi, true);