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:
parent
00f7060a2d
commit
529f304811
5 changed files with 49 additions and 15 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
13
gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-1.c
Normal file
13
gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-1.c
Normal 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"} } */
|
18
gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-2.c
Normal file
18
gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-2.c
Normal 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"} } */
|
|
@ -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. */
|
||||
|
|
Loading…
Add table
Reference in a new issue