Commit ae6fa899 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/45216 (Rotate expressions not recognized at tree level)

	PR tree-optimization/45216
	PR tree-optimization/57157
	* tree-ssa-forwprop.c (simplify_rotate): Only recognize
	the (-Y) & (B - 1) variant if OP is |.
	* expmed.c (expand_shift_1): For rotations by const0_rtx just
	return shifted.  Use (-op1) & (prec - 1) as other_amount
	instead of prec - op1.

	* c-c++-common/rotate-1.c: Add 32 tests with +.
	* c-c++-common/rotate-1a.c: Adjust.
	* c-c++-common/rotate-2.c: Add 32 tests with +, expect
	only 48 rotates.
	* c-c++-common/rotate-2b.c: New test.
	* c-c++-common/rotate-3.c: Add 32 tests with +.
	* c-c++-common/rotate-4.c: Add 32 tests with +, expect
	only 48 rotates.
	* c-c++-common/rotate-4b.c: New test.
	* c-c++-common/rotate-5.c: New test.

From-SVN: r198823
parent 4502fe8d
2013-05-13 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/45216
PR tree-optimization/57157
* tree-ssa-forwprop.c (simplify_rotate): Only recognize
the (-Y) & (B - 1) variant if OP is |.
* expmed.c (expand_shift_1): For rotations by const0_rtx just
return shifted. Use (-op1) & (prec - 1) as other_amount
instead of prec - op1.
2013-05-13 Martin Jambor <mjambor@suse.cz>
PR middle-end/42371
......
......@@ -2166,7 +2166,8 @@ expand_shift_1 (enum tree_code code, enum machine_mode mode, rtx shifted,
{
/* If we have been unable to open-code this by a rotation,
do it as the IOR of two shifts. I.e., to rotate A
by N bits, compute (A << N) | ((unsigned) A >> (C - N))
by N bits, compute
(A << N) | ((unsigned) A >> ((-N) & (C - 1)))
where C is the bitsize of A.
It is theoretically possible that the target machine might
......@@ -2181,14 +2182,22 @@ expand_shift_1 (enum tree_code code, enum machine_mode mode, rtx shifted,
rtx temp1;
new_amount = op1;
if (CONST_INT_P (op1))
if (op1 == const0_rtx)
return shifted;
else if (CONST_INT_P (op1))
other_amount = GEN_INT (GET_MODE_BITSIZE (mode)
- INTVAL (op1));
else
{
other_amount
= simplify_gen_binary (MINUS, GET_MODE (op1),
GEN_INT (GET_MODE_PRECISION (mode)),
op1);
= simplify_gen_unary (NEG, GET_MODE (op1),
op1, GET_MODE (op1));
other_amount
= simplify_gen_binary (AND, GET_MODE (op1),
other_amount,
GEN_INT (GET_MODE_PRECISION (mode)
- 1));
}
shifted = force_reg (mode, shifted);
......
2013-05-13 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/45216
PR tree-optimization/57157
* c-c++-common/rotate-1.c: Add 32 tests with +.
* c-c++-common/rotate-1a.c: Adjust.
* c-c++-common/rotate-2.c: Add 32 tests with +, expect
only 48 rotates.
* c-c++-common/rotate-2b.c: New test.
* c-c++-common/rotate-3.c: Add 32 tests with +.
* c-c++-common/rotate-4.c: Add 32 tests with +, expect
only 48 rotates.
* c-c++-common/rotate-4b.c: New test.
* c-c++-common/rotate-5.c: New test.
2013-05-13 Martin Jambor <mjambor@suse.cz>
PR middle-end/42371
......
/* Check rotate pattern detection. */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
/* { dg-final { scan-tree-dump-times "r\[<>]\[<>]" 64 "optimized" } } */
/* { dg-final { scan-tree-dump-times "r\[<>]\[<>]" 96 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
unsigned int
......@@ -387,3 +387,195 @@ f64 (unsigned char x, unsigned long int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned char) - y)) ^ (x >> y);
}
unsigned int
f65 (unsigned int x, unsigned int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
}
unsigned int
f66 (unsigned int x, unsigned long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
}
unsigned int
f67 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - 1));
}
unsigned int
f68 (unsigned int x, int y __attribute__((unused)))
{
return (x << (__CHAR_BIT__ * __SIZEOF_INT__ - 1)) + (x >> 1);
}
unsigned short int
f69 (unsigned short int x, unsigned int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * __SIZEOF_SHORT__ - y));
}
unsigned short int
f70 (unsigned short int x, unsigned long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * __SIZEOF_SHORT__ - y));
}
unsigned char
f71 (unsigned char x, unsigned int y)
{
return (x << y) + (x >> (__CHAR_BIT__ - y));
}
unsigned char
f72 (unsigned char x, unsigned long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ - y));
}
unsigned int
f73 (unsigned int x, unsigned int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned int) - y));
}
unsigned int
f74 (unsigned int x, unsigned long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned int) - y));
}
unsigned int
f75 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> (__CHAR_BIT__ * sizeof (unsigned int) - 1));
}
unsigned int
f76 (unsigned int x, int y __attribute__((unused)))
{
return (x << (__CHAR_BIT__ * sizeof (unsigned int) - 1)) + (x >> 1);
}
unsigned short int
f77 (unsigned short int x, unsigned int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned short) - y));
}
unsigned short int
f78 (unsigned short int x, unsigned long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned short) - y));
}
unsigned char
f79 (unsigned char x, unsigned int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned char) - y));
}
unsigned char
f80 (unsigned char x, unsigned long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned char) - y));
}
unsigned int
f81 (unsigned int x, unsigned int y)
{
return (x << (__CHAR_BIT__ * __SIZEOF_INT__ - y)) + (x >> y);
}
unsigned int
f82 (unsigned int x, unsigned long int y)
{
return (x << (__CHAR_BIT__ * __SIZEOF_INT__ - y)) + (x >> y);
}
unsigned int
f83 (unsigned int x, int y __attribute__((unused)))
{
return (x << (__CHAR_BIT__ * __SIZEOF_INT__ - 1)) + (x >> 1);
}
unsigned int
f84 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - 1));
}
unsigned short int
f85 (unsigned short int x, unsigned int y)
{
return (x << (__CHAR_BIT__ * __SIZEOF_SHORT__ - y)) + (x >> y);
}
unsigned short int
f86 (unsigned short int x, unsigned long int y)
{
return (x << (__CHAR_BIT__ * __SIZEOF_SHORT__ - y)) + (x >> y);
}
unsigned char
f87 (unsigned char x, unsigned int y)
{
return (x << (__CHAR_BIT__ - y)) + (x >> y);
}
unsigned char
f88 (unsigned char x, unsigned long int y)
{
return (x << (__CHAR_BIT__ - y)) + (x >> y);
}
unsigned int
f89 (unsigned int x, unsigned int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned int) - y)) + (x >> y);
}
unsigned int
f90 (unsigned int x, unsigned long int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned int) - y)) + (x >> y);
}
unsigned int
f91 (unsigned int x, int y __attribute__((unused)))
{
return (x << (__CHAR_BIT__ * sizeof (unsigned int) - 1)) + (x >> 1);
}
unsigned int
f92 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> (__CHAR_BIT__ * sizeof (unsigned int) - 1));
}
unsigned short int
f93 (unsigned short int x, unsigned int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned short) - y)) + (x >> y);
}
unsigned short int
f94 (unsigned short int x, unsigned long int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned short) - y)) + (x >> y);
}
unsigned char
f95 (unsigned char x, unsigned int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned char) - y)) + (x >> y);
}
unsigned char
f96 (unsigned char x, unsigned long int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned char) - y)) + (x >> y);
}
......@@ -21,13 +21,18 @@ unsigned int expected[] = {
0x2468acf, 0x2468acf, 0x91a2b3c, 0x2468acf0, 0xacf, 0xacf, 0xf, 0xf,
0x2468acf, 0x2468acf, 0x91a2b3c, 0x2468acf0, 0xacf, 0xacf, 0xf, 0xf,
0x2468acf, 0x2468acf, 0x91a2b3c, 0x2468acf0, 0xacf, 0xacf, 0xf, 0xf,
0x2468acf, 0x2468acf, 0x91a2b3c, 0x2468acf0, 0xacf, 0xacf, 0xf, 0xf,
0x91a2b3c0, 0x91a2b3c0, 0x2468acf0, 0x91a2b3c, 0xb3c2, 0xb3c2, 0xc3, 0xc3,
0x91a2b3c0, 0x91a2b3c0, 0x2468acf0, 0x91a2b3c, 0xb3c2, 0xb3c2, 0xc3, 0xc3,
0x2468acf, 0x2468acf, 0x91a2b3c, 0x2468acf0, 0xacf, 0xacf, 0xf, 0xf,
0x2468acf, 0x2468acf, 0x91a2b3c, 0x2468acf0, 0xacf, 0xacf, 0xf, 0xf };
#define F(n) __typeof (f##n) f##n __attribute__((noinline, noclone));
#define D(n) F(n##0) F(n##1) F(n##2) F(n##3) F(n##4) F(n##5) F(n##6) F(n##7) F(n##8) F(n##9)
#define ALL \
F(1) F(2) F(3) F(4) F(5) F(6) F(7) F(8) F(9) \
D(1) D(2) D(3) D(4) D(5) F(60) F(61) F(62) F(63) F(64)
D(1) D(2) D(3) D(4) D(5) D(6) D(7) D(8) \
F(90) F(91) F(92) F(93) F(94) F(95) F(96)
ALL
int
......
/* Check rotate pattern detection. */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
/* { dg-final { scan-tree-dump-times "r\[<>]\[<>]" 64 "optimized" } } */
/* Rotates should be recognized only in functions with | instead of + or ^,
or in functions that have constant shift counts (unused attribute on y). */
/* { dg-final { scan-tree-dump-times "r\[<>]\[<>]" 48 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
unsigned int
......@@ -387,3 +389,195 @@ f64 (unsigned char x, unsigned long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) ^ (x >> y);
}
unsigned int
f65 (unsigned int x, unsigned int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
}
unsigned int
f66 (unsigned int x, unsigned long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
}
unsigned int
f67 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
}
unsigned int
f68 (unsigned int x, int y __attribute__((unused)))
{
return (x << ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> 1);
}
unsigned short int
f69 (unsigned short int x, unsigned int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1)));
}
unsigned short int
f70 (unsigned short int x, unsigned long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1)));
}
unsigned char
f71 (unsigned char x, unsigned int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ - 1)));
}
unsigned char
f72 (unsigned char x, unsigned long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ - 1)));
}
unsigned int
f73 (unsigned int x, unsigned int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
}
unsigned int
f74 (unsigned int x, unsigned long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
}
unsigned int
f75 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
}
unsigned int
f76 (unsigned int x, int y __attribute__((unused)))
{
return (x << ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> 1);
}
unsigned short int
f77 (unsigned short int x, unsigned int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1)));
}
unsigned short int
f78 (unsigned short int x, unsigned long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1)));
}
unsigned char
f79 (unsigned char x, unsigned int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1)));
}
unsigned char
f80 (unsigned char x, unsigned long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1)));
}
unsigned int
f81 (unsigned int x, unsigned int y)
{
return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> y);
}
unsigned int
f82 (unsigned int x, unsigned long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> y);
}
unsigned int
f83 (unsigned int x, int y __attribute__((unused)))
{
return (x << ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> 1);
}
unsigned int
f84 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
}
unsigned short int
f85 (unsigned short int x, unsigned int y)
{
return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1))) + (x >> y);
}
unsigned short int
f86 (unsigned short int x, unsigned long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1))) + (x >> y);
}
unsigned char
f87 (unsigned char x, unsigned int y)
{
return (x << ((-y) & (__CHAR_BIT__ - 1))) + (x >> y);
}
unsigned char
f88 (unsigned char x, unsigned long int y)
{
return (x << ((-y) & (__CHAR_BIT__ - 1))) + (x >> y);
}
unsigned int
f89 (unsigned int x, unsigned int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> y);
}
unsigned int
f90 (unsigned int x, unsigned long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> y);
}
unsigned int
f91 (unsigned int x, int y __attribute__((unused)))
{
return (x << ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> 1);
}
unsigned int
f92 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
}
unsigned short int
f93 (unsigned short int x, unsigned int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1))) + (x >> y);
}
unsigned short int
f94 (unsigned short int x, unsigned long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1))) + (x >> y);
}
unsigned char
f95 (unsigned char x, unsigned int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) + (x >> y);
}
unsigned char
f96 (unsigned char x, unsigned long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) + (x >> y);
}
/* Check rotate pattern detection. */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
/* { dg-final { scan-tree-dump-times "r\[<>]\[<>]" 64 "optimized" } } */
/* { dg-final { scan-tree-dump-times "r\[<>]\[<>]" 96 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
unsigned int
......@@ -387,3 +387,195 @@ f64 (unsigned char x, long int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned char) - y)) ^ (x >> y);
}
unsigned int
f65 (unsigned int x, int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
}
unsigned int
f66 (unsigned int x, long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
}
unsigned int
f67 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - 1));
}
unsigned int
f68 (unsigned int x, int y __attribute__((unused)))
{
return (x << (__CHAR_BIT__ * __SIZEOF_INT__ - 1)) + (x >> 1);
}
unsigned short int
f69 (unsigned short int x, int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * __SIZEOF_SHORT__ - y));
}
unsigned short int
f70 (unsigned short int x, long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * __SIZEOF_SHORT__ - y));
}
unsigned char
f71 (unsigned char x, int y)
{
return (x << y) + (x >> (__CHAR_BIT__ - y));
}
unsigned char
f72 (unsigned char x, long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ - y));
}
unsigned int
f73 (unsigned int x, int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned int) - y));
}
unsigned int
f74 (unsigned int x, long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned int) - y));
}
unsigned int
f75 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> (__CHAR_BIT__ * sizeof (unsigned int) - 1));
}
unsigned int
f76 (unsigned int x, int y __attribute__((unused)))
{
return (x << (__CHAR_BIT__ * sizeof (unsigned int) - 1)) + (x >> 1);
}
unsigned short int
f77 (unsigned short int x, int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned short) - y));
}
unsigned short int
f78 (unsigned short int x, long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned short) - y));
}
unsigned char
f79 (unsigned char x, int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned char) - y));
}
unsigned char
f80 (unsigned char x, long int y)
{
return (x << y) + (x >> (__CHAR_BIT__ * sizeof (unsigned char) - y));
}
unsigned int
f81 (unsigned int x, int y)
{
return (x << (__CHAR_BIT__ * __SIZEOF_INT__ - y)) + (x >> y);
}
unsigned int
f82 (unsigned int x, long int y)
{
return (x << (__CHAR_BIT__ * __SIZEOF_INT__ - y)) + (x >> y);
}
unsigned int
f83 (unsigned int x, int y __attribute__((unused)))
{
return (x << (__CHAR_BIT__ * __SIZEOF_INT__ - 1)) + (x >> 1);
}
unsigned int
f84 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - 1));
}
unsigned short int
f85 (unsigned short int x, int y)
{
return (x << (__CHAR_BIT__ * __SIZEOF_SHORT__ - y)) + (x >> y);
}
unsigned short int
f86 (unsigned short int x, long int y)
{
return (x << (__CHAR_BIT__ * __SIZEOF_SHORT__ - y)) + (x >> y);
}
unsigned char
f87 (unsigned char x, int y)
{
return (x << (__CHAR_BIT__ - y)) + (x >> y);
}
unsigned char
f88 (unsigned char x, long int y)
{
return (x << (__CHAR_BIT__ - y)) + (x >> y);
}
unsigned int
f89 (unsigned int x, int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned int) - y)) + (x >> y);
}
unsigned int
f90 (unsigned int x, long int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned int) - y)) + (x >> y);
}
unsigned int
f91 (unsigned int x, int y __attribute__((unused)))
{
return (x << (__CHAR_BIT__ * sizeof (unsigned int) - 1)) + (x >> 1);
}
unsigned int
f92 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> (__CHAR_BIT__ * sizeof (unsigned int) - 1));
}
unsigned short int
f93 (unsigned short int x, int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned short) - y)) + (x >> y);
}
unsigned short int
f94 (unsigned short int x, long int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned short) - y)) + (x >> y);
}
unsigned char
f95 (unsigned char x, int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned char) - y)) + (x >> y);
}
unsigned char
f96 (unsigned char x, long int y)
{
return (x << (__CHAR_BIT__ * sizeof (unsigned char) - y)) + (x >> y);
}
/* Check rotate pattern detection. */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
/* { dg-final { scan-tree-dump-times "r\[<>]\[<>]" 64 "optimized" } } */
/* Rotates should be recognized only in functions with | instead of + or ^,
or in functions that have constant shift counts (unused attribute on y). */
/* { dg-final { scan-tree-dump-times "r\[<>]\[<>]" 48 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
unsigned int
......@@ -387,3 +389,195 @@ f64 (unsigned char x, long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) ^ (x >> y);
}
unsigned int
f65 (unsigned int x, int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
}
unsigned int
f66 (unsigned int x, long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
}
unsigned int
f67 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
}
unsigned int
f68 (unsigned int x, int y __attribute__((unused)))
{
return (x << ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> 1);
}
unsigned short int
f69 (unsigned short int x, int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1)));
}
unsigned short int
f70 (unsigned short int x, long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1)));
}
unsigned char
f71 (unsigned char x, int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ - 1)));
}
unsigned char
f72 (unsigned char x, long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ - 1)));
}
unsigned int
f73 (unsigned int x, int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
}
unsigned int
f74 (unsigned int x, long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
}
unsigned int
f75 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
}
unsigned int
f76 (unsigned int x, int y __attribute__((unused)))
{
return (x << ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> 1);
}
unsigned short int
f77 (unsigned short int x, int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1)));
}
unsigned short int
f78 (unsigned short int x, long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1)));
}
unsigned char
f79 (unsigned char x, int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1)));
}
unsigned char
f80 (unsigned char x, long int y)
{
return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1)));
}
unsigned int
f81 (unsigned int x, int y)
{
return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> y);
}
unsigned int
f82 (unsigned int x, long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> y);
}
unsigned int
f83 (unsigned int x, int y __attribute__((unused)))
{
return (x << ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> 1);
}
unsigned int
f84 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
}
unsigned short int
f85 (unsigned short int x, int y)
{
return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1))) + (x >> y);
}
unsigned short int
f86 (unsigned short int x, long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1))) + (x >> y);
}
unsigned char
f87 (unsigned char x, int y)
{
return (x << ((-y) & (__CHAR_BIT__ - 1))) + (x >> y);
}
unsigned char
f88 (unsigned char x, long int y)
{
return (x << ((-y) & (__CHAR_BIT__ - 1))) + (x >> y);
}
unsigned int
f89 (unsigned int x, int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> y);
}
unsigned int
f90 (unsigned int x, long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> y);
}
unsigned int
f91 (unsigned int x, int y __attribute__((unused)))
{
return (x << ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> 1);
}
unsigned int
f92 (unsigned int x, int y __attribute__((unused)))
{
return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
}
unsigned short int
f93 (unsigned short int x, int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1))) + (x >> y);
}
unsigned short int
f94 (unsigned short int x, long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1))) + (x >> y);
}
unsigned char
f95 (unsigned char x, int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) + (x >> y);
}
unsigned char
f96 (unsigned char x, long int y)
{
return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) + (x >> y);
}
/* { dg-do run } */
/* { dg-options "-O2" } */
extern
#ifdef __cplusplus
"C"
#endif
void abort (void);
#if __CHAR_BIT__ * __SIZEOF_LONG_LONG__ == 64
__attribute__((noinline, noclone))
unsigned long long
f1 (unsigned long long x, unsigned int y)
{
return (x << y) | (x >> ((-y) & 63));
}
#if __CHAR_BIT__ * __SIZEOF_INT128__ == 128
__attribute__((noinline, noclone))
unsigned __int128
f2 (unsigned __int128 x, unsigned int y)
{
return (x << y) | (x >> ((-y) & 128));
}
#endif
#endif
int
main ()
{
#if __CHAR_BIT__ * __SIZEOF_LONG_LONG__ == 64
if (f1 (0x123456789abcdef0ULL, 0) != 0x123456789abcdef0ULL)
abort ();
#if __CHAR_BIT__ * __SIZEOF_INT128__ == 128
if (f2 ((((unsigned __int128) 0x123456789abcdef0ULL) << 64)
| 0x0fedcba987654321ULL, 0)
!= ((((unsigned __int128) 0x123456789abcdef0ULL) << 64)
| 0x0fedcba987654321ULL))
abort ();
#endif
#endif
return 0;
}
......@@ -2135,10 +2135,10 @@ simplify_bitwise_binary (gimple_stmt_iterator *gsi)
(X << (int) Y) OP (X >> (int) (B - Y))
((T) ((T2) X << Y)) OP ((T) ((T2) X >> (B - Y)))
((T) ((T2) X << (int) Y)) OP ((T) ((T2) X >> (int) (B - Y)))
(X << Y) OP (X >> ((-Y) & (B - 1)))
(X << (int) Y) OP (X >> (int) ((-Y) & (B - 1)))
((T) ((T2) X << Y)) OP ((T) ((T2) X >> ((-Y) & (B - 1))))
((T) ((T2) X << (int) Y)) OP ((T) ((T2) X >> (int) ((-Y) & (B - 1))))
(X << Y) | (X >> ((-Y) & (B - 1)))
(X << (int) Y) | (X >> (int) ((-Y) & (B - 1)))
((T) ((T2) X << Y)) | ((T) ((T2) X >> ((-Y) & (B - 1))))
((T) ((T2) X << (int) Y)) | ((T) ((T2) X >> (int) ((-Y) & (B - 1))))
and transform these into:
X r<< CNT1
......@@ -2293,7 +2293,8 @@ simplify_rotate (gimple_stmt_iterator *gsi)
&& host_integerp (cdef_arg2[i], 0)
&& tree_low_cst (cdef_arg2[i], 0)
== TYPE_PRECISION (rtype) - 1
&& TREE_CODE (cdef_arg1[i]) == SSA_NAME)
&& TREE_CODE (cdef_arg1[i]) == SSA_NAME
&& gimple_assign_rhs_code (stmt) == BIT_IOR_EXPR)
{
tree tem;
enum tree_code code;
......
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