https://gcc.gnu.org/g:7c4f8ae20cc09e8732739ac839c845ba8c2991c0

commit r16-5041-g7c4f8ae20cc09e8732739ac839c845ba8c2991c0
Author: Richard Biener <[email protected]>
Date:   Mon Nov 3 14:43:39 2025 +0100

    Use gather_imm_use_stmts instead of FOR_EACH_IMM_USE_STMT in forwprop
    
    The following fixes forwprop using FOR_EACH_IMM_USE_STMT to iterate
    over stmts and then eventually removing the active stmt, releasing
    its defs.  This can cause debug stmt insertion with a RHS referencing
    the SSA name we iterate over, adding to its immediate use list
    but also adjusting all other debug stmts refering to the released
    SSA name, updating those.  And those can refer to the original
    iterated over variable.
    
    In the end the destructive behavior of update_stmt is a problem
    here, which unlinks all uses of a stmt and then links in the
    newly computed ones instead of leaving those in place that are.
    
    The solution is to not rely on FOR_EACH_IMM_USE_STMT to iterate
    over stmt uses without duplicates.
    
            * tree-ssa-forwprop.cc (forward_propagate_addr_expr):
            Use gather_imm_use_stmts instead of FOR_EACH_IMM_USE_STMT.

Diff:
---
 gcc/tree-ssa-forwprop.cc | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
index 9a993ab04de3..67deecaf0044 100644
--- a/gcc/tree-ssa-forwprop.cc
+++ b/gcc/tree-ssa-forwprop.cc
@@ -925,12 +925,10 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
 static bool
 forward_propagate_addr_expr (tree name, tree rhs, bool parent_single_use_p)
 {
-  imm_use_iterator iter;
-  gimple *use_stmt;
   bool all = true;
   bool single_use_p = parent_single_use_p && has_single_use (name);
 
-  FOR_EACH_IMM_USE_STMT (use_stmt, iter, name)
+  for (gimple *use_stmt : gather_imm_use_stmts (name))
     {
       bool result;
       tree use_rhs;

Reply via email to