Hello,

This should have the changes you wanted!

Thank you,
Matthew Beliveau

On Fri, Aug 16, 2019 at 12:30 PM Jeff Law <l...@redhat.com> wrote:
>
> On 8/13/19 9:09 AM, Matthew Beliveau wrote:
> > Hello,
> >
> > This should have the changes you all asked for! Let me know if I
> > missed anything!
> >
> > Thank you,
> > Matthew Beliveau
> >
> > On Tue, Aug 13, 2019 at 5:15 AM Richard Biener
> > <richard.guent...@gmail.com> wrote:
> >> On Tue, Aug 13, 2019 at 10:18 AM Richard Sandiford
> >> <richard.sandif...@arm.com> wrote:
> >>> Thanks for doing this.
> >>>
> >>> Matthew Beliveau <mbeli...@redhat.com> writes:
> >>>> diff --git gcc/tree-ssa-dse.c gcc/tree-ssa-dse.c
> >>>> index 5b7c4fc6d1a..dcaeb8edbfe 100644
> >>>> --- gcc/tree-ssa-dse.c
> >>>> +++ gcc/tree-ssa-dse.c
> >>>> @@ -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)))))
> >>>> +        && initializer_zerop (gimple_op (use_stmt, 1), NULL)
> >>>> +        && !gimple_clobber_p (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,15 +1024,13 @@ 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.
> >>>> +      /* Check if this store initalizes zero, or some aggregate of 
> >>>> zeros,
> >>>> +      and check if there are subsequent stores which are subsumed by 
> >>>> this
> >>>> +      statement.  If so, remove the subsequent 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
> >>>> +      if (initializer_zerop (gimple_op (stmt, 1), NULL)
> >>>>         && !gimple_clobber_p (stmt))
> >>>>       dse_optimize_redundant_stores (stmt);
> >>>>
> >>> In addition to Jeff's comment, the original choice of gimple_assign_rhs1
> >>> is the preferred way to write this (applies to both hunks).
> >> And the !gimple_clobber_p test is now redundant.
> >>
> >>> Richard
> >
> > DSE-2.patch
> >
> > Bootstrapped/regtested on x86_64-linux, ok for trunk?
> >
> > 2019-08-13  Matthew Beliveau  <mbeli...@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.
> >
> >       * gcc.dg/tree-ssa/redundant-assign-zero-1.c: New test.
> >       * gcc.dg/tree-ssa/redundant-assign-zero-2.c: New test.
> >
> > diff --git gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-1.c 
> > gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-1.c
> > new file mode 100644
> > index 00000000000..b8d01d1644b
> > --- /dev/null
> > +++ gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-1.c
> > @@ -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"} } 
> > */
> > diff --git gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-2.c 
> > gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-2.c
> > new file mode 100644
> > index 00000000000..8cefa6f0cb7
> > --- /dev/null
> > +++ gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-2.c
> > @@ -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"} } 
> > */
> > diff --git gcc/tree-ssa-dse.c gcc/tree-ssa-dse.c
> > index 5b7c4fc6d1a..14b66228e1e 100644
> > --- gcc/tree-ssa-dse.c
> > +++ gcc/tree-ssa-dse.c
> > @@ -628,11 +628,7 @@ 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)))))
> > +        && initializer_zerop (gimple_assign_rhs1 (use_stmt)))
> So I think we over-simplified here.  All we know is that USE_STMT is a
> gimple assignment with virtual operands.  We don't know what the form of
> the right hand side of the assignment is.  You extract the first operand
> of the right hand side and check if that is zero.  But you're losing the
> operator.
>
> This may work in practice because of the limitations imposed by having a
> virtual definition, but it seems fragile in the long run.  I should have
> caught this the first time I looked at the patch, sorry.
>
> I think you can guard the call to initializer_zerop with something like
>
> (gimple_assign_single_p (use_stmt)
>  && initializer_zero_p (gimple_assign_rhs1 (use_stmt)))
>
> That will restrict the form of the right hand side a bit, but will still
> allow us to capture anything handled by initializer_zero_p.
>
> >         || (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 +1023,10 @@ 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 (initializer_zerop (gimple_assign_rhs1 (stmt)))
> >       dse_optimize_redundant_stores (stmt);
> Same here.
>
> Jeff
Bootstrapped/regtested on x86_64-linux, ok for trunk?

2019-08-19  Matthew Beliveau  <mbeli...@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.

	* gcc.dg/tree-ssa/redundant-assign-zero-1.c: New test.
	* gcc.dg/tree-ssa/redundant-assign-zero-2.c: New test.

diff --git gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-1.c gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-1.c
new file mode 100644
index 00000000000..b8d01d1644b
--- /dev/null
+++ gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-1.c
@@ -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"} } */
diff --git gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-2.c gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-2.c
new file mode 100644
index 00000000000..8cefa6f0cb7
--- /dev/null
+++ gcc/testsuite/gcc.dg/tree-ssa/redundant-assign-zero-2.c
@@ -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"} } */
diff --git gcc/tree-ssa-dse.c gcc/tree-ssa-dse.c
index 5b7c4fc6d1a..ba67884a825 100644
--- gcc/tree-ssa-dse.c
+++ gcc/tree-ssa-dse.c
@@ -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.  */

Reply via email to