On Thu, 5 Mar 2026, Alfie Richards wrote:
> On 05/03/2026 12:22, Richard Biener wrote:
> > The following fixes a regression introduced by r11-5542 which
> > restricts replacing uses of live original defs of now vectorized
> > stmts to when that does not require new loop-closed PHIs to be
> > inserted. That restriction keeps the original scalar definition
> > live which is sub-optimal and also not reflected in costing.
> >
> > The particular case the following fixes can be seen in
> > gcc.dg/vect/bb-slp-57.c is the case where we are replacing an
> > existing loop closed PHI argument.
> >
> > Bootstrap and regtest running on x86_64-unknown-linux-gnu, will push
> > after that succeeded. I'm also considering backporting to at least
> > GCC 15 after a while (code gen for gcc.dg/vect/bb-slp-57.c is really
> > awful w/o this fix).
> >
> > PR tree-optimization/98064
> > * tree-vect-loop.cc (vectorizable_live_operation): Do
> > not restrict replacing uses in a LC PHI.
> >
> > * gcc.dg/vect/bb-slp-57.c: Verify we do not keep original
> > stmts live.
> > ---
> > gcc/testsuite/gcc.dg/vect/bb-slp-57.c | 1 +
> > gcc/tree-vect-loop.cc | 45 ++++++++++++++++-----------
> > 2 files changed, 28 insertions(+), 18 deletions(-)
> >
> > diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-57.c
> > b/gcc/testsuite/gcc.dg/vect/bb-slp-57.c
> > index 6f13507fd67..6633a3092ad 100644
> > --- a/gcc/testsuite/gcc.dg/vect/bb-slp-57.c
> > +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-57.c
> > @@ -36,3 +36,4 @@ void l()
> >
> > /* { dg-final { scan-tree-dump-times "transform load" 1 "slp1" { target {
> > { x86_64-*-* i?86-*-* } && lp64 } } } } */
> > /* { dg-final { scan-tree-dump "optimized: basic block" "slp1" { target {
> > { x86_64-*-* i?86-*-* } && lp64 } } } } */
> > +/* { dg-final { scan-tree-dump-not "missed: Using original scalar
> > computation" "slp1" } } */
> > diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
> > index 670a03ea06b..4818a8e88a1 100644
> > --- a/gcc/tree-vect-loop.cc
> > +++ b/gcc/tree-vect-loop.cc
> > @@ -10441,26 +10441,35 @@ vectorizable_live_operation (vec_info *vinfo,
> > stmt_vec_info stmt_info,
> > "def\n");
> > continue;
> > }
> > - /* ??? It can also happen that we end up pulling a def into
> > - a loop where replacing out-of-loop uses would require
> > - a new LC SSA PHI node. Retain the original scalar in
> > - those cases as well. PR98064. */
> > - if (TREE_CODE (new_tree) == SSA_NAME
> > - && !SSA_NAME_IS_DEFAULT_DEF (new_tree)
> > - && (gimple_bb (use_stmt)->loop_father
> > - != gimple_bb (vec_stmt)->loop_father)
> > - && !flow_loop_nested_p (gimple_bb (vec_stmt)->loop_father,
> > - gimple_bb (use_stmt)->loop_father))
> > + FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
> > {
> > - if (dump_enabled_p ())
> > - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> > - "Using original scalar computation for "
> > - "live lane because there is an out-of-loop
> > "
> > - "definition for it\n");
> > - continue;
> > + /* ??? It can also happen that we end up pulling a def into
> > + a loop where replacing out-of-loop uses would require
> > + a new LC SSA PHI node. Retain the original scalar in
> > + those cases as well. PR98064. */
> > + edge e;
> > + if (TREE_CODE (new_tree) == SSA_NAME
> > + && !SSA_NAME_IS_DEFAULT_DEF (new_tree)
> > + && (gimple_bb (use_stmt)->loop_father
> > + != gimple_bb (vec_stmt)->loop_father)
> > + /* But a replacemend in a LC PHI is OK. This happens
> > + in gcc.dg/vect/bb-slp-57.c for example. */
> nit: minor typo, I think it should read "But a replacement in a LC PHI..."
Oops, fixed.
>From 992bec078920e48d2a762dc384cd6c7a7d92e828 Mon Sep 17 00:00:00 2001
From: Richard Biener <[email protected]>
Date: Thu, 5 Mar 2026 14:49:44 +0100
Subject: [PATCH] Fix typo
To: [email protected]
s/replacemend/replacement/
* tree-vect-loop.cc (vectorizable_live_operation): Fix typo.
---
gcc/tree-vect-loop.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 4818a8e88a1..7bcecc42f69 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -10452,7 +10452,7 @@ vectorizable_live_operation (vec_info *vinfo,
stmt_vec_info stmt_info,
&& !SSA_NAME_IS_DEFAULT_DEF (new_tree)
&& (gimple_bb (use_stmt)->loop_father
!= gimple_bb (vec_stmt)->loop_father)
- /* But a replacemend in a LC PHI is OK. This happens
+ /* But a replacement in a LC PHI is OK. This happens
in gcc.dg/vect/bb-slp-57.c for example. */
&& (gimple_code (use_stmt) != GIMPLE_PHI
|| (((e = phi_arg_edge_from_use (use_p)), true)
--
2.51.0