https://gcc.gnu.org/g:7ce2229d54d575d788b016f941aafd0464ea77f7
commit r15-4237-g7ce2229d54d575d788b016f941aafd0464ea77f7 Author: Richard Biener <rguent...@suse.de> Date: Thu Oct 10 14:15:13 2024 +0200 tree-optimization/117060 - fix oversight in vect_build_slp_tree_1 We are failing to match call vs. non-call when dealing with matching loads or stores. PR tree-optimization/117060 * tree-vect-slp.cc (vect_build_slp_tree_1): When comparing calls also fail if the first isn't a call. * gfortran.dg/pr117060.f90: New testcase. Diff: --- gcc/testsuite/gfortran.dg/pr117060.f90 | 21 +++++++++++++++++++++ gcc/tree-vect-slp.cc | 5 +++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/gcc/testsuite/gfortran.dg/pr117060.f90 b/gcc/testsuite/gfortran.dg/pr117060.f90 new file mode 100644 index 000000000000..50004e1aaf3d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr117060.f90 @@ -0,0 +1,21 @@ +! { dg-do compile } +! { dg-options "-O2" } + +subroutine foo (out) + +implicit none + +real :: out(*) +integer :: i,k +real :: a(100) +real :: b(100) + +k = 0 +do i = 1, 10 + k = k + 1 + out(k) = a(i) + k = k + 1 + out(k) = sqrt((a(3*i)-b(4))**2 + (a(3*i+1)-b(4+1))**2) +end do + +end subroutine diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index 8b53b0fdb16d..9bf6ae4ec8e0 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -1367,8 +1367,9 @@ vect_build_slp_tree_1 (vec_info *vinfo, unsigned char *swap, && first_stmt_code != CFN_MASK_LOAD && first_stmt_code != CFN_MASK_STORE) { - if (!compatible_calls_p (as_a <gcall *> (stmts[0]->stmt), - call_stmt)) + if (!is_a <gcall *> (stmts[0]->stmt) + || !compatible_calls_p (as_a <gcall *> (stmts[0]->stmt), + call_stmt)) { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,