Commit 529f3048 by Matthew Beliveau Committed by Matthew Beliveau

tree-ssa-dse.c (dse_optimize_redundant_stores): Improved check to catch more…

tree-ssa-dse.c (dse_optimize_redundant_stores): Improved check to catch more redundant zero initialization cases.

2019-08-19  Matthew Beliveau  <mbelivea@redhat.com>

	* tree-ssa-dse.c (dse_optimize_redundant_stores): Improved check to
	catch more redundant zero initialization cases.
	(dse_dom_walker::dse_optimize_stmt): Likewise.

From-SVN: r274749
parent 00f7060a
2019-08-20 Matthew Beliveau <mbelivea@redhat.com>
* tree-ssa-dse.c (dse_optimize_redundant_stores): Improved check to
catch more redundant zero initialization cases.
(dse_dom_walker::dse_optimize_stmt): Likewise.
2019-08-20 Richard Biener <rguenther@suse.de> 2019-08-20 Richard Biener <rguenther@suse.de>
PR lto/91307 PR lto/91307
......
2019-08-20 Matthew Beliveau <mbelivea@redhat.com>
* gcc.dg/tree-ssa/redundant-assign-zero-1.c: New test.
* gcc.dg/tree-ssa/redundant-assign-zero-2.c: New test.
2019-08-20 Richard Biener <rguenther@suse.de> 2019-08-20 Richard Biener <rguenther@suse.de>
PR tree-optimization/37242 PR tree-optimization/37242
......
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-dse-details" } */
void blah (char *);
void bar ()
{
char a[256] = "";
a[3] = 0;
blah (a);
}
/* { dg-final { scan-tree-dump-times "Deleted redundant store" 1 "dse1"} } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-dse-details" } */
#include <string.h>
void blahd (double *);
void fubar ()
{
double d;
double *x = &d;
memset (&d, 0 , sizeof d);
*x = 0.0;
blahd (x);
}
/* { dg-final { scan-tree-dump-times "Deleted redundant store" 1 "dse1"} } */
...@@ -628,11 +628,8 @@ dse_optimize_redundant_stores (gimple *stmt) ...@@ -628,11 +628,8 @@ dse_optimize_redundant_stores (gimple *stmt)
tree fndecl; tree fndecl;
if ((is_gimple_assign (use_stmt) if ((is_gimple_assign (use_stmt)
&& gimple_vdef (use_stmt) && gimple_vdef (use_stmt)
&& ((gimple_assign_rhs_code (use_stmt) == CONSTRUCTOR && (gimple_assign_single_p (use_stmt)
&& CONSTRUCTOR_NELTS (gimple_assign_rhs1 (use_stmt)) == 0 && initializer_zerop (gimple_assign_rhs1 (use_stmt))))
&& !gimple_clobber_p (stmt))
|| (gimple_assign_rhs_code (use_stmt) == INTEGER_CST
&& integer_zerop (gimple_assign_rhs1 (use_stmt)))))
|| (gimple_call_builtin_p (use_stmt, BUILT_IN_NORMAL) || (gimple_call_builtin_p (use_stmt, BUILT_IN_NORMAL)
&& (fndecl = gimple_call_fndecl (use_stmt)) != NULL && (fndecl = gimple_call_fndecl (use_stmt)) != NULL
&& (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET && (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET
...@@ -1027,16 +1024,11 @@ dse_dom_walker::dse_optimize_stmt (gimple_stmt_iterator *gsi) ...@@ -1027,16 +1024,11 @@ dse_dom_walker::dse_optimize_stmt (gimple_stmt_iterator *gsi)
{ {
bool by_clobber_p = false; bool by_clobber_p = false;
/* First see if this store is a CONSTRUCTOR and if there /* Check if this statement stores zero to a memory location,
are subsequent CONSTRUCTOR stores which are totally and if there is a subsequent store of zero to the same
subsumed by this statement. If so remove the subsequent memory location. If so, remove the subsequent store. */
CONSTRUCTOR store. if (gimple_assign_single_p (stmt)
&& initializer_zerop (gimple_assign_rhs1 (stmt)))
This will tend to make fewer calls into memset with longer
arguments. */
if (gimple_assign_rhs_code (stmt) == CONSTRUCTOR
&& CONSTRUCTOR_NELTS (gimple_assign_rhs1 (stmt)) == 0
&& !gimple_clobber_p (stmt))
dse_optimize_redundant_stores (stmt); dse_optimize_redundant_stores (stmt);
/* Self-assignments are zombies. */ /* Self-assignments are zombies. */
......
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