re PR tree-optimization/79090 (DSE wrongly removes store at variable offset)
authorJeff Law <law@redhat.com>
Sun, 15 Jan 2017 09:34:01 +0000 (02:34 -0700)
committerJeff Law <law@gcc.gnu.org>
Sun, 15 Jan 2017 09:34:01 +0000 (02:34 -0700)
PR tree-optimization/79090
* tree-ssa-dse.c (valid_ao_ref_for_dse): Reject zero length and
variable length stores.
(compute_trims): Delete dead assignment to *trim_tail.
(dse_dom_walker::dse_optimize_stmt): Optimize mem* calls with
zero length.

From-SVN: r244472

gcc/ChangeLog
gcc/tree-ssa-dse.c

index 746f6af65cec204b2fbbe2d7f4188089588c5486..36982c69df1cd9535fe5a1b3119cd42b3d319b4e 100644 (file)
@@ -1,3 +1,12 @@
+2017-01-14  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/79090
+       * tree-ssa-dse.c (valid_ao_ref_for_dse): Reject zero length and
+       variable length stores.
+       (compute_trims): Delete dead assignment to *trim_tail.
+       (dse_dom_walker::dse_optimize_stmt): Optimize mem* calls with
+       zero length.
+
 2017-01-14  Bernd Schmidt  <bschmidt@redhat.com>
 
        PR rtl-optimization/78626
index 2e6f8ff2d16b84be819810ff3388f79b3678584b..65dcb12d8b0c1a415c1b8ad7deb074700cda2e6f 100644 (file)
@@ -129,6 +129,8 @@ valid_ao_ref_for_dse (ao_ref *ref)
 {
   return (ao_ref_base (ref)
          && ref->max_size != -1
+         && ref->size != 0
+         && ref->max_size == ref->size
          && (ref->offset % BITS_PER_UNIT) == 0
          && (ref->size % BITS_PER_UNIT) == 0
          && (ref->size != -1));
@@ -221,7 +223,6 @@ compute_trims (ao_ref *ref, sbitmap live, int *trim_head, int *trim_tail)
      the REF to compute the trims.  */
 
   /* Now identify how much, if any of the tail we can chop off.  */
-  *trim_tail = 0;
   int last_orig = (ref->size / BITS_PER_UNIT) - 1;
   int last_live = bitmap_last_set_bit (live);
   *trim_tail = (last_orig - last_live) & ~0x1;
@@ -700,6 +701,16 @@ dse_dom_walker::dse_optimize_stmt (gimple_stmt_iterator *gsi)
          case BUILT_IN_MEMMOVE:
          case BUILT_IN_MEMSET:
            {
+             /* Occasionally calls with an explicit length of zero
+                show up in the IL.  It's pointless to do analysis
+                on them, they're trivially dead.  */
+             tree size = gimple_call_arg (stmt, 2);
+             if (integer_zerop (size))
+               {
+                 delete_dead_call (gsi);
+                 return;
+               }
+
              gimple *use_stmt;
              enum dse_store_status store_status;
              m_byte_tracking_enabled