blob: 63f30889a7c5e460ef18fe4e0bbecc02134fa841 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O1 -fdump-tree-optimized-raw -Wno-psabi" } */
typedef int v4si __attribute__((vector_size(4 * sizeof(int))));
/* Generic */
#define BIT_OPERATIONS(result_type, operand_type, suffix) \
result_type foo_generic_1##suffix(operand_type a) { \
return (a - 1) & -a; \
} \
result_type foo_generic_2##suffix(operand_type a) { \
return (a - 1) | -a; \
} \
result_type foo_generic_3##suffix(operand_type a) { \
return (a - 1) ^ -a; \
}
BIT_OPERATIONS(signed char, signed char, 11)
BIT_OPERATIONS(unsigned char, unsigned char, 12)
BIT_OPERATIONS(signed short, signed short, 21)
BIT_OPERATIONS(unsigned short, unsigned short, 22)
BIT_OPERATIONS(signed int, signed int, 31)
BIT_OPERATIONS(unsigned int, unsigned int, 32)
BIT_OPERATIONS(signed long, signed long, 41)
BIT_OPERATIONS(unsigned long, unsigned long, 42)
/* Gimple */
int
foo_gimple_1(int a)
{
int t1 = a - 1;
int t2 = -a;
int t3 = t1 & t2;
return t3;
}
short
foo_gimple_2(short a)
{
short t1 = a - 1;
short t2 = -a;
short t3 = t1 | t2;
return t3;
}
unsigned long
foo_gimple_3(unsigned long a)
{
unsigned long t1 = a - 1;
unsigned long t2 = -a;
unsigned long t3 = t1 ^ t2;
return t3;
}
int
foo_gimple_4(int a, unsigned char b)
{
/* The return expression should simplify to b + 7. */
int t1 = b;
t1 |= (a - 1) | -a;
t1 |= b & (a >> 3);
int t2 = b + 7;
t2 &= ~((b - 1) & -b);
t2 &= (a - 1) ^ -a;
int t3 = t1 & t2;
return t3;
}
/* Vectors */
v4si
foo_vector_1(v4si a)
{
return (a - (v4si) {1, 1, 1, 1}) & -a;
}
v4si
foo_vector_2(v4si a)
{
v4si t0 = (v4si) {1, 1, 1, 1};
v4si t1 = a - t0;
v4si t2 = -a;
v4si t3 = t1 | t2;
return t3;
}
v4si
foo_vector_3(v4si a)
{
v4si t0 = (v4si) {1, 1, 1, 1};
v4si t1 = a - t0;
v4si t2 = -a;
v4si t3 = t1 ^ t2;
return t3;
}
v4si
foo_vector_4(v4si a)
{
v4si t0 = (v4si) {1, 1, 1, 1};
v4si t1 = (a - t0) & -a;
v4si t2 = (a - t0) | -a;
v4si t3 = (a - t0) ^ -a;
v4si t4 = t1 - t2 + t3;
return t4;
}
/* { dg-final { scan-tree-dump-not "bit_and_expr, " "optimized" } } */
/* { dg-final { scan-tree-dump-not "bit_ior_expr, " "optimized" } } */
/* { dg-final { scan-tree-dump-not "bit_xor_expr, " "optimized" } } */
/* { dg-final { scan-tree-dump-not "negate_expr, " "optimized" } } */
/* { dg-final { scan-tree-dump-times "plus_expr, " 1 "optimized" } } */