We are failing to match call vs. non-call when dealing with matching loads or stores.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. 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. --- gcc/testsuite/gfortran.dg/pr117060.f90 | 21 +++++++++++++++++++++ gcc/tree-vect-slp.cc | 5 +++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr117060.f90 diff --git a/gcc/testsuite/gfortran.dg/pr117060.f90 b/gcc/testsuite/gfortran.dg/pr117060.f90 new file mode 100644 index 00000000000..50004e1aaf3 --- /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 a0dfa18486b..3b6df34b6ee 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, -- 2.43.0