re PR tree-optimization/52760 (Revision 185599 causes miscompare on sphinx3)

PR tree-optimization/52760
	* tree-vect-slp.c (vect_get_constant_vectors): Convert constant_p
	shift count for {L,R}{SHIFT,ROTATE}_EXPR to TREE_TYPE (vector_type).

	* gcc.c-torture/execute/pr52760.c: New test.

From-SVN: r185965
This commit is contained in:
Jakub Jelinek 2012-03-29 16:55:53 +02:00 committed by Jakub Jelinek
parent 37b9a3bd0b
commit b84b294aaf
4 changed files with 53 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2012-03-29 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/52760
* tree-vect-slp.c (vect_get_constant_vectors): Convert constant_p
shift count for {L,R}{SHIFT,ROTATE}_EXPR to TREE_TYPE (vector_type).
2012-03-29 Richard Guenther <rguenther@suse.de>
* cgraph.h (cgraph_materialize_all_clones): Remove.

View File

@ -1,3 +1,8 @@
2012-03-29 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/52760
* gcc.c-torture/execute/pr52760.c: New test.
2012-03-29 Jason Merrill <jason@redhat.com>
PR c++/52743

View File

@ -0,0 +1,27 @@
/* PR tree-optimization/52760 */
struct T { unsigned short a, b, c, d; };
__attribute__((noinline, noclone)) void
foo (int x, struct T *y)
{
int i;
for (i = 0; i < x; i++)
{
y[i].a = ((0x00ff & y[i].a >> 8) | (0xff00 & y[i].a << 8));
y[i].b = ((0x00ff & y[i].b >> 8) | (0xff00 & y[i].b << 8));
y[i].c = ((0x00ff & y[i].c >> 8) | (0xff00 & y[i].c << 8));
y[i].d = ((0x00ff & y[i].d >> 8) | (0xff00 & y[i].d << 8));
}
}
int
main ()
{
struct T t = { 0x0001, 0x0203, 0x0405, 0x0607 };
foo (1, &t);
if (t.a != 0x0100 || t.b != 0x0302 || t.c != 0x0504 || t.d != 0x0706)
__builtin_abort ();
return 0;
}

View File

@ -2337,8 +2337,23 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
op = gimple_call_arg (stmt, op_num);
break;
case LSHIFT_EXPR:
case RSHIFT_EXPR:
case LROTATE_EXPR:
case RROTATE_EXPR:
op = gimple_op (stmt, op_num + 1);
/* Unlike the other binary operators, shifts/rotates have
the shift count being int, instead of the same type as
the lhs, so make sure the scalar is the right type if
we are dealing with vectors of
long long/long/short/char. */
if (op_num == 1 && constant_p)
op = fold_convert (TREE_TYPE (vector_type), op);
break;
default:
op = gimple_op (stmt, op_num + 1);
break;
}
}