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
This commit is contained in:
Matthew Beliveau 2019-08-20 13:23:01 +00:00 committed by Matthew Beliveau
parent 00f7060a2d
commit 529f304811
5 changed files with 49 additions and 15 deletions

View file

@ -1,3 +1,9 @@
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>
PR lto/91307

View file

@ -1,3 +1,8 @@
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>
PR tree-optimization/37242

View file

@ -0,0 +1,13 @@
/* { 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"} } */

View file

@ -0,0 +1,18 @@
/* { 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"} } */

View file

@ -628,11 +628,8 @@ dse_optimize_redundant_stores (gimple *stmt)
tree fndecl;
if ((is_gimple_assign (use_stmt)
&& gimple_vdef (use_stmt)
&& ((gimple_assign_rhs_code (use_stmt) == CONSTRUCTOR
&& CONSTRUCTOR_NELTS (gimple_assign_rhs1 (use_stmt)) == 0
&& !gimple_clobber_p (stmt))
|| (gimple_assign_rhs_code (use_stmt) == INTEGER_CST
&& integer_zerop (gimple_assign_rhs1 (use_stmt)))))
&& (gimple_assign_single_p (use_stmt)
&& initializer_zerop (gimple_assign_rhs1 (use_stmt))))
|| (gimple_call_builtin_p (use_stmt, BUILT_IN_NORMAL)
&& (fndecl = gimple_call_fndecl (use_stmt)) != NULL
&& (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET
@ -1027,16 +1024,11 @@ dse_dom_walker::dse_optimize_stmt (gimple_stmt_iterator *gsi)
{
bool by_clobber_p = false;
/* First see if this store is a CONSTRUCTOR and if there
are subsequent CONSTRUCTOR stores which are totally
subsumed by this statement. If so remove the subsequent
CONSTRUCTOR store.
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))
/* Check if this statement stores zero to a memory location,
and if there is a subsequent store of zero to the same
memory location. If so, remove the subsequent store. */
if (gimple_assign_single_p (stmt)
&& initializer_zerop (gimple_assign_rhs1 (stmt)))
dse_optimize_redundant_stores (stmt);
/* Self-assignments are zombies. */