Commit b84b294a by Jakub Jelinek Committed by Jakub Jelinek

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
parent 37b9a3bd
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> 2012-03-29 Richard Guenther <rguenther@suse.de>
* cgraph.h (cgraph_materialize_all_clones): Remove. * cgraph.h (cgraph_materialize_all_clones): Remove.
......
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> 2012-03-29 Jason Merrill <jason@redhat.com>
PR c++/52743 PR c++/52743
......
/* 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;
}
...@@ -2337,8 +2337,23 @@ vect_get_constant_vectors (tree op, slp_tree slp_node, ...@@ -2337,8 +2337,23 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
op = gimple_call_arg (stmt, op_num); op = gimple_call_arg (stmt, op_num);
break; 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: default:
op = gimple_op (stmt, op_num + 1); op = gimple_op (stmt, op_num + 1);
break;
} }
} }
......
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