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.
This commit is contained in:
Richard Biener 2024-10-10 14:15:13 +02:00 committed by Richard Biener
parent a2e06b7f08
commit 7ce2229d54
2 changed files with 24 additions and 2 deletions

View file

@ -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

View file

@ -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,