re PR tree-optimization/88903 (wrong-code with SLP vectorized shift)

2019-01-18  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/88903
	* tree-vect-stmts.c (vectorizable_shift): Verify we see all
	scalar stmts a SLP shift amount is composed of when detecting
	shifts by scalars.

	* gcc.dg/vect/pr88903-1.c: New testcase.
	* gcc.dg/vect/pr88903-2.c: Likewise.

From-SVN: r268076
This commit is contained in:
Richard Biener 2019-01-18 13:13:21 +00:00 committed by Richard Biener
parent 420183d996
commit 649794ff57
5 changed files with 77 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2019-01-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/88903
* tree-vect-stmts.c (vectorizable_shift): Verify we see all
scalar stmts a SLP shift amount is composed of when detecting
shifts by scalars.
2019-01-18 Richard Earnshaw <rearnsha@arm.com>
PR target/88799

View File

@ -1,3 +1,9 @@
2019-01-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/88903
* gcc.dg/vect/pr88903-1.c: New testcase.
* gcc.dg/vect/pr88903-2.c: Likewise.
2019-01-18 H.J. Lu <hongjiu.lu@intel.com>
PR c/51628

View File

@ -0,0 +1,26 @@
#include "tree-vect.h"
int x[1024];
void __attribute__((noinline))
foo()
{
for (int i = 0; i < 512; ++i)
{
x[2*i] = x[2*i] << (i+1);
x[2*i+1] = x[2*i+1] << (i+1);
}
}
int
main()
{
check_vect ();
for (int i = 0; i < 1024; ++i)
x[i] = i;
foo ();
for (int i = 0; i < 1024; ++i)
if (x[i] != i << (i/2+1))
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,28 @@
#include "tree-vect.h"
int x[1024];
int y[1024];
int z[1024];
void __attribute__((noinline)) foo()
{
for (int i = 0; i < 512; ++i)
{
x[2*i] = x[2*i] << y[2*i];
x[2*i+1] = x[2*i+1] << y[2*i];
z[2*i] = y[2*i];
z[2*i+1] = y[2*i+1];
}
}
int main()
{
check_vect ();
for (int i = 0; i < 1024; ++i)
x[i] = i, y[i] = i % 8;
foo ();
for (int i = 0; i < 1024; ++i)
if (x[i] != i << ((i & ~1) % 8))
__builtin_abort ();
return 0;
}

View File

@ -5540,6 +5540,16 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
if (!operand_equal_p (gimple_assign_rhs2 (slpstmt), op1, 0))
scalar_shift_arg = false;
}
/* For internal SLP defs we have to make sure we see scalar stmts
for all vector elements.
??? For different vectors we could resort to a different
scalar shift operand but code-generation below simply always
takes the first. */
if (dt[1] == vect_internal_def
&& maybe_ne (nunits_out * SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node),
stmts.length ()))
scalar_shift_arg = false;
}
/* If the shift amount is computed by a pattern stmt we cannot