re PR c++/34949 (Dead code in empty destructors.)
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
This commit is contained in:
parent
e594716a6a
commit
5d751b0c97
@ -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>
|
2013-04-02 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
* config/i386/i386.md (*testqi_ext_3): Merge with *testqi_ext_3_rex64
|
* config/i386/i386.md (*testqi_ext_3): Merge with *testqi_ext_3_rex64
|
||||||
|
@ -412,7 +412,8 @@ get_mem_ref_of_assignment (const gimple assignment,
|
|||||||
{
|
{
|
||||||
gcc_assert (gimple_assign_single_p (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->start = gimple_assign_lhs (assignment);
|
||||||
*ref_is_store = true;
|
*ref_is_store = true;
|
||||||
|
@ -4840,7 +4840,12 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
|
|||||||
so handle it here. */
|
so handle it here. */
|
||||||
if (TREE_CLOBBER_P (*from_p))
|
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));
|
gimplify_seq_add_stmt (pre_p, gimple_build_assign (*to_p, *from_p));
|
||||||
*expr_p = NULL;
|
*expr_p = NULL;
|
||||||
return GS_ALL_DONE;
|
return GS_ALL_DONE;
|
||||||
|
@ -3815,9 +3815,9 @@ verify_gimple_assign_single (gimple stmt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (gimple_clobber_p (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);
|
debug_generic_expr (lhs);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2965,8 +2965,8 @@ sra_modify_constructor_assign (gimple *stmt, gimple_stmt_iterator *gsi)
|
|||||||
static tree
|
static tree
|
||||||
get_repl_default_def_ssa_name (struct access *racc)
|
get_repl_default_def_ssa_name (struct access *racc)
|
||||||
{
|
{
|
||||||
gcc_checking_assert (!racc->grp_to_be_replaced &&
|
gcc_checking_assert (!racc->grp_to_be_replaced
|
||||||
!racc->grp_to_be_debug_replaced);
|
&& !racc->grp_to_be_debug_replaced);
|
||||||
if (!racc->replacement_decl)
|
if (!racc->replacement_decl)
|
||||||
racc->replacement_decl = create_access_replacement (racc);
|
racc->replacement_decl = create_access_replacement (racc);
|
||||||
return get_or_create_ssa_default_def (cfun, racc->replacement_decl);
|
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];
|
adj = &adjustments[i];
|
||||||
|
|
||||||
if (adj->base == base &&
|
if (adj->base == base
|
||||||
(adj->offset == offset || adj->remove_param))
|
&& (adj->offset == offset || adj->remove_param))
|
||||||
{
|
{
|
||||||
cand = adj;
|
cand = adj;
|
||||||
break;
|
break;
|
||||||
@ -4676,6 +4676,14 @@ sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments)
|
|||||||
if (name)
|
if (name)
|
||||||
FOR_EACH_IMM_USE_STMT (stmt, ui, 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
|
/* All other users must have been removed by
|
||||||
ipa_sra_modify_function_body. */
|
ipa_sra_modify_function_body. */
|
||||||
gcc_assert (is_gimple_debug (stmt));
|
gcc_assert (is_gimple_debug (stmt));
|
||||||
|
@ -218,7 +218,10 @@ dse_optimize_stmt (gimple_stmt_iterator *gsi)
|
|||||||
if (is_gimple_call (stmt) && gimple_call_fndecl (stmt))
|
if (is_gimple_call (stmt) && gimple_call_fndecl (stmt))
|
||||||
return;
|
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;
|
return;
|
||||||
|
|
||||||
if (is_gimple_assign (stmt))
|
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))
|
if (!dse_possible_dead_store_p (stmt, &use_stmt))
|
||||||
return;
|
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
|
/* 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
|
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
|
virtual uses from stmt and the stmt which stores to that same
|
||||||
|
@ -623,8 +623,8 @@ clear_unused_block_pointer_1 (tree *tp, int *, void *)
|
|||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set all block pointer in debug stmt to NULL if the block is unused,
|
/* Set all block pointer in debug or clobber stmt to NULL if the block
|
||||||
so that they will not be streamed out. */
|
is unused, so that they will not be streamed out. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clear_unused_block_pointer (void)
|
clear_unused_block_pointer (void)
|
||||||
@ -639,7 +639,7 @@ clear_unused_block_pointer (void)
|
|||||||
tree b;
|
tree b;
|
||||||
gimple stmt = gsi_stmt (gsi);
|
gimple stmt = gsi_stmt (gsi);
|
||||||
|
|
||||||
if (!is_gimple_debug (stmt))
|
if (!is_gimple_debug (stmt) && !gimple_clobber_p (stmt))
|
||||||
continue;
|
continue;
|
||||||
b = gimple_block (stmt);
|
b = gimple_block (stmt);
|
||||||
if (b && !TREE_USED (b))
|
if (b && !TREE_USED (b))
|
||||||
@ -827,7 +827,15 @@ remove_unused_locals (void)
|
|||||||
if (gimple_clobber_p (stmt))
|
if (gimple_clobber_p (stmt))
|
||||||
{
|
{
|
||||||
tree lhs = gimple_assign_lhs (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);
|
unlink_stmt_vdef (stmt);
|
||||||
gsi_remove (&gsi, true);
|
gsi_remove (&gsi, true);
|
||||||
|
Loading…
Reference in New Issue
Block a user