[gcc r15-9781] tree-optimization/116352 - amend previous fix

Richard Biener rguenth@gcc.gnu.org
Fri Jun 6 09:07:04 GMT 2025


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

commit r15-9781-g7da2b6ddf3a8371b585595231cddcb1ad0942ea4
Author: Richard Biener <rguenther@suse.de>
Date:   Thu May 8 10:56:16 2025 +0200

    tree-optimization/116352 - amend previous fix
    
    The previous fix restricted external vector builds to defs from
    the same basic-block.  That turns out too restrictive so we have
    to mitigate the original issue in a different way which is
    restricting it to the original case where all defs are in the
    same basic-block.
    
            PR tree-optimization/116352
            * tree-vect-slp.cc (vect_build_slp_tree_2): When compressing
            operands from a two-operator node make sure the resulting
            operation does not mix defs from different basic-blocks.
    
    (cherry picked from commit 1e8bd720b1a618a39e2a41eec05e935c32d295f3)

Diff:
---
 gcc/tree-vect-slp.cc | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index ed432a95d33f..b5addd6d76bb 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -2616,13 +2616,14 @@ out:
       if (oprnds_info[0]->def_stmts[0]
 	  && is_a<gassign *> (oprnds_info[0]->def_stmts[0]->stmt))
 	code = gimple_assign_rhs_code (oprnds_info[0]->def_stmts[0]->stmt);
+      basic_block bb = nullptr;
 
       for (unsigned j = 0; j < group_size; ++j)
 	{
 	  FOR_EACH_VEC_ELT (oprnds_info, i, oprnd_info)
 	    {
 	      stmt_vec_info stmt_info = oprnd_info->def_stmts[j];
-	      if (!stmt_info || !stmt_info->stmt
+	      if (!stmt_info
 		  || !is_a<gassign *> (stmt_info->stmt)
 		  || gimple_assign_rhs_code (stmt_info->stmt) != code
 		  || skip_args[i])
@@ -2630,6 +2631,14 @@ out:
 		  success = false;
 		  break;
 		}
+	      /* Avoid mixing lanes with defs in different basic-blocks.  */
+	      if (!bb)
+		bb = gimple_bb (vect_orig_stmt (stmt_info)->stmt);
+	      else if (gimple_bb (vect_orig_stmt (stmt_info)->stmt) != bb)
+		{
+		  success = false;
+		  break;
+		}
 
 	      bool exists;
 	      unsigned &stmt_idx


More information about the Gcc-cvs mailing list