From: Richard Biener Date: Tue, 22 Jun 2021 07:24:24 +0000 (+0200) Subject: tree-optimization/101158 - adjust SLP call matching sequence X-Git-Tag: releases/gcc-10.4.0~411 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=578bc9d1cdd91694e4da393d32f0fddd213a6042;p=thirdparty%2Fgcc.git tree-optimization/101158 - adjust SLP call matching sequence This moves the check for same operands after verifying we're facing compatible calls. 2021-06-22 Richard Biener PR tree-optimization/101158 * tree-vect-slp.c (vect_build_slp_tree_1): Move same operand checking after checking for matching operation. * gfortran.dg/pr101158.f90: New testcase. (cherry picked from commit 7a22d8a764418265680a6bb9a9aec31e984eb015) --- diff --git a/gcc/testsuite/gfortran.dg/pr101158.f90 b/gcc/testsuite/gfortran.dg/pr101158.f90 new file mode 100644 index 000000000000..9a4d9a2d7aec --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr101158.f90 @@ -0,0 +1,25 @@ +! { dg-do compile } +! { dg-options "-O1 -ftree-slp-vectorize -fwrapv" } +! { dg-additional-options "-march=armv8-a+sve" { target aarch64-*-* } } + +subroutine sprpl5 (left) + implicit none + + integer :: left + integer :: avail1, avail2, delx1, delx2, i2, ic + + ic = left + delx1 = ic / 2 + delx2 = delx1 + 1 + i2 = ic + delx2 + avail1 = i2 + avail2 = 1 + + do delx1 = 1, 2 + ic = left + nint (real (left) / 2) + if (ic .ge. avail1) avail1 = ic + 1 + + i2 = ic + delx2 + if (i2 .le. avail2) avail2 = i2 + 1 + end do +end subroutine sprpl5 diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index aa3087fe3a4d..551e03c12195 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -969,31 +969,31 @@ vect_build_slp_tree_1 (unsigned char *swap, continue; } - if (need_same_oprnds) + if (!load_p && rhs_code == CALL_EXPR) { - tree other_op1 = (call_stmt - ? gimple_call_arg (call_stmt, 1) - : gimple_assign_rhs2 (stmt)); - if (!operand_equal_p (first_op1, other_op1, 0)) + if (!compatible_calls_p (as_a (stmts[0]->stmt), + as_a (stmt))) { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "Build SLP failed: different shift " - "arguments in %G", stmt); + "Build SLP failed: different calls in %G", + stmt); /* Mismatch. */ continue; } } - if (!load_p && rhs_code == CALL_EXPR) + if (need_same_oprnds) { - if (!compatible_calls_p (as_a (stmts[0]->stmt), - as_a (stmt))) + tree other_op1 = (call_stmt + ? gimple_call_arg (call_stmt, 1) + : gimple_assign_rhs2 (stmt)); + if (!operand_equal_p (first_op1, other_op1, 0)) { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "Build SLP failed: different calls in %G", - stmt); + "Build SLP failed: different shift " + "arguments in %G", stmt); /* Mismatch. */ continue; }