Commit 649794ff by Richard Biener Committed by Richard Biener

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
parent 420183d9
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> 2019-01-18 Richard Earnshaw <rearnsha@arm.com>
PR target/88799 PR target/88799
......
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> 2019-01-18 H.J. Lu <hongjiu.lu@intel.com>
PR c/51628 PR c/51628
......
#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;
}
#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;
}
...@@ -5540,6 +5540,16 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi, ...@@ -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)) if (!operand_equal_p (gimple_assign_rhs2 (slpstmt), op1, 0))
scalar_shift_arg = false; 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 /* If the shift amount is computed by a pattern stmt we cannot
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment