https://gcc.gnu.org/g:a3a7c2da0508ceec0bd73994f62f9a4cb1ab3649

commit r16-9245-ga3a7c2da0508ceec0bd73994f62f9a4cb1ab3649
Author: Tamar Christina <[email protected]>
Date:   Fri Jun 12 11:56:54 2026 +0100

    vect: use .VARYING for early break IV [PR125597]
    
    Similar to the mask control variable, this replaces and adds the temporary 
SSA
    var for early break scalar IVs with an IFN_VARYING until the replacement is 
done
    when we start vectorization.
    
    This prevents similar issues as the mask control variable when the IV
    expressions are folded.
    
    gcc/ChangeLog:
    
            PR tree-optimization/125597
            * tree-vect-loop-manip.cc (vect_do_peeling): Create IFN_VARYING for
            early break scalar IV.
            * tree-vect-loop.cc 
(vect_update_ivs_after_vectorizer_for_early_breaks):
            Replace the IFN_VARYING with actual value.
    
    (cherry picked from commit 46f07a7b7d4d5b391723a756e5fb7673800bac57)

Diff:
---
 gcc/tree-vect-loop-manip.cc | 4 ++++
 gcc/tree-vect-loop.cc       | 7 ++++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index f7a0e8500435..c217fd1390f0 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -3778,6 +3778,10 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, 
tree nitersm1,
        {
          tree tmp_niters_vf
            = make_ssa_name (LOOP_VINFO_EARLY_BRK_IV_TYPE (loop_vinfo));
+         gcall *tmp_call = gimple_build_call_internal (IFN_VARYING, 0);
+         gimple_call_set_lhs (tmp_call, tmp_niters_vf);
+         auto header_gsi = gsi_after_labels (loop->header);
+         gsi_insert_after (&header_gsi, tmp_call, GSI_SAME_STMT);
 
          if (!(LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo)
                && get_loop_exit_edges (loop).length () == 1))
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index c3757de38e18..521975e6a2cc 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -11083,6 +11083,11 @@ vect_update_ivs_after_vectorizer_for_early_breaks 
(loop_vec_info loop_vinfo)
   auto loop = LOOP_VINFO_LOOP (loop_vinfo);
   tree induc_var = niters_skip ? copy_ssa_name (phi_var) : phi_var;
 
+  /* Remove the existing dummy GIMPLE statement and just keep the def.  */
+  gimple *def = SSA_NAME_DEF_STMT (phi_var);
+  auto def_gsi = gsi_for_stmt (def);
+  gsi_remove (&def_gsi, true);
+
   auto induction_phi = create_phi_node (induc_var, loop->header);
   tree induc_def = PHI_RESULT (induction_phi);
 
@@ -11153,7 +11158,7 @@ vect_update_ivs_after_vectorizer_for_early_breaks 
(loop_vec_info loop_vinfo)
       gcc_assert (exit_bb);
       auto exit_gsi = gsi_after_labels (exit_bb);
       gsi_insert_seq_before (&exit_gsi, iv_stmts, GSI_SAME_STMT);
-  }
+    }
   /* Write the init_stmts in the loop-preheader block.  */
   auto psi = gsi_last_nondebug_bb (pe->src);
   gsi_insert_seq_after (&psi, init_stmts, GSI_LAST_NEW_STMT);

Reply via email to