https://gcc.gnu.org/g:13950737746e6d6503ad7f1df5a8c47010857ff8

commit r14-11431-g13950737746e6d6503ad7f1df5a8c47010857ff8
Author: Filip Kastl <fka...@suse.cz>
Date:   Thu Mar 20 11:54:59 2025 +0100

    gimple: sccopy: Don't increment i after vec::unordered_remove()
    
    I increment the index variable in a loop even when I do
    vec::unordered_remove() which causes the vector traversal to miss some
    elements.  Mikael notified me of this mistake I made in my last patch.
    
    gcc/ChangeLog:
    
            * gimple-ssa-sccopy.cc (scc_copy_prop::propagate): Don't
            increment after vec::unordered_remove().
    
    Reported-by: Mikael Morin <mik...@gcc.gnu.org>
    Signed-off-by: Filip Kastl <fka...@suse.cz>
    (cherry picked from commit a1363f8dd8037d40e9fbf04c2ba8d6d3e7e5c269)

Diff:
---
 gcc/gimple-ssa-sccopy.cc | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/gcc/gimple-ssa-sccopy.cc b/gcc/gimple-ssa-sccopy.cc
index d4d06f3b13e7..f7e121992e5f 100644
--- a/gcc/gimple-ssa-sccopy.cc
+++ b/gcc/gimple-ssa-sccopy.cc
@@ -554,9 +554,11 @@ sccopy_propagate ()
         get removed.  That means parts of CFG get removed.  Those may
         contain copy statements.  For that reason we prune SCCs here.  */
       unsigned i;
-      for (i = 0; i < scc.length (); i++)
+      for (i = 0; i < scc.length ();)
        if (gimple_bb (scc[i]) == NULL)
          scc.unordered_remove (i);
+       else
+         i++;
       if (scc.is_empty ())
        {
          scc.release ();

Reply via email to