/* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-optimized" } */ #if __SIZEOF_INT__ == 4 unsigned int foo(unsigned int a, unsigned int b) { return (a >> 31) * b; } int bar(int a, int b) { return -(a >> 31) * b; } int baz(int a, int b) { int c = a >> 31; int d = -c; return d * b; } unsigned int pin(int a, unsigned int b) { unsigned int t = a & 1; return t * b; } #endif #if __SIZEOF_LONG_LONG__ == 8 unsigned long long fool(unsigned long long a, unsigned long long b) { return (a >> 63) * b; } long long barl (long long a, long long b) { return -(a >> 63) * b; } long long bazl (long long a, long long b) { long long c = a >> 63; long long d = -c; return d * b; } unsigned long long pinl(long long a, unsigned long long b) { unsigned long long t = a & 1; return t * b; } #endif /* { dg-final { scan-assembler-not "imul" } } */