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