tree-ssa-dse.c (dse_classify_store): Fix iterator increment for pruning loop and...
authorRichard Biener <rguenther@suse.de>
Thu, 17 May 2018 13:42:21 +0000 (13:42 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 17 May 2018 13:42:21 +0000 (13:42 +0000)
2018-05-17  Richard Biener  <rguenther@suse.de>

* tree-ssa-dse.c (dse_classify_store): Fix iterator increment
for pruning loop and prune defs feeding only already visited PHIs.

From-SVN: r260322

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

index 8a800a775ce0fbc1179939b7d0b507246a2f940f..3c59e0909723d1fb4e1619a21125039b42af934a 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-17  Richard Biener  <rguenther@suse.de>
+
+       * tree-ssa-dse.c (dse_classify_store): Fix iterator increment
+       for pruning loop and prune defs feeding only already visited PHIs.
+
 2018-05-17  Richard Biener  <rguenther@suse.de>
 
        * tree-ssa-sccvn.c (vn_reference_lookup_3): Improve memset handling.
index 589cfef5df55d472e618da22f50d5ca5be1f4c08..1af50a0267422990a4b752200fa67753bb20e249 100644 (file)
@@ -662,7 +662,7 @@ dse_classify_store (ao_ref *ref, gimple *stmt,
        }
 
       /* Process defs and remove those we need not process further.  */
-      for (unsigned i = 0; i < defs.length (); ++i)
+      for (unsigned i = 0; i < defs.length ();)
        {
          gimple *def = defs[i];
          gimple *use_stmt;
@@ -680,11 +680,18 @@ dse_classify_store (ao_ref *ref, gimple *stmt,
          /* In addition to kills we can remove defs whose only use
             is another def in defs.  That can only ever be PHIs of which
             we track a single for simplicity reasons (we fail for multiple
-            PHIs anyways).  */
+            PHIs anyways).  We can also ignore defs that feed only into
+            already visited PHIs.  */
          else if (gimple_code (def) != GIMPLE_PHI
                   && single_imm_use (gimple_vdef (def), &use_p, &use_stmt)
-                  && use_stmt == phi_def)
+                  && (use_stmt == phi_def
+                      || (gimple_code (use_stmt) == GIMPLE_PHI
+                          && bitmap_bit_p (visited,
+                                           SSA_NAME_VERSION
+                                             (PHI_RESULT (use_stmt))))))
            defs.unordered_remove (i);
+         else
+           ++i;
        }
 
       /* If all defs kill the ref we are done.  */