/* { 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" } } */