tree-optimization/115669 - fix SLP reduction association
The following avoids associating a reduction path as that might get STMT_VINFO_REDUC_IDX out-of-sync with the SLP operand order. This is a latent issue with SLP reductions but now easily exposed as we're doing single-lane SLP reductions. When we achieved SLP only we can move and update this meta-data. PR tree-optimization/115669 * tree-vect-slp.cc (vect_build_slp_tree_2): Do not reassociate chains that participate in a reduction. * gcc.dg/vect/pr115669.c: New testcase. (cherry picked from commit 7886830bb45c4f5dca0496d4deae9a45204d78f5)
This commit is contained in:
parent
078cdccc84
commit
03844a2a15
2 changed files with 25 additions and 0 deletions
22
gcc/testsuite/gcc.dg/vect/pr115669.c
Normal file
22
gcc/testsuite/gcc.dg/vect/pr115669.c
Normal file
|
@ -0,0 +1,22 @@
|
|||
/* { dg-additional-options "-fwrapv" } */
|
||||
|
||||
#include "tree-vect.h"
|
||||
|
||||
int a = 10;
|
||||
unsigned b;
|
||||
long long c[100];
|
||||
int foo()
|
||||
{
|
||||
long long *d = c;
|
||||
for (short e = 0; e < a; e++)
|
||||
b += ~(d ? d[e] : 0);
|
||||
return b;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
check_vect ();
|
||||
if (foo () != -10)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
|
@ -2050,6 +2050,9 @@ vect_build_slp_tree_2 (vec_info *vinfo, slp_tree node,
|
|||
else if (is_a <loop_vec_info> (vinfo)
|
||||
/* ??? We don't handle !vect_internal_def defs below. */
|
||||
&& STMT_VINFO_DEF_TYPE (stmt_info) == vect_internal_def
|
||||
/* ??? Do not associate a reduction, this will wreck REDUC_IDX
|
||||
mapping as long as that exists on the stmt_info level. */
|
||||
&& STMT_VINFO_REDUC_IDX (stmt_info) == -1
|
||||
&& is_gimple_assign (stmt_info->stmt)
|
||||
&& (associative_tree_code (gimple_assign_rhs_code (stmt_info->stmt))
|
||||
|| gimple_assign_rhs_code (stmt_info->stmt) == MINUS_EXPR)
|
||||
|
|
Loading…
Add table
Reference in a new issue