| /* Test that we can remove the conditional move due to CLZ |
| being defined at zero. */ |
| |
| /* { dg-do compile } */ |
| /* { dg-require-effective-target arm_arch_v6t2_ok } */ |
| /* { dg-options "-O2" } */ |
| /* { dg-add-options arm_arch_v6t2 } */ |
| |
| int |
| fooctz (int i) |
| { |
| return (i == 0) ? 32 : __builtin_ctz (i); |
| } |
| |
| int |
| fooctz2 (int i) |
| { |
| return (i != 0) ? __builtin_ctz (i) : 32; |
| } |
| |
| unsigned int |
| fooctz3 (unsigned int i) |
| { |
| return (i > 0) ? __builtin_ctz (i) : 32; |
| } |
| |
| /* { dg-final { scan-assembler-times "rbit\t*" 3 } } */ |
| |
| int |
| fooclz (int i) |
| { |
| return (i == 0) ? 32 : __builtin_clz (i); |
| } |
| |
| int |
| fooclz2 (int i) |
| { |
| return (i != 0) ? __builtin_clz (i) : 32; |
| } |
| |
| unsigned int |
| fooclz3 (unsigned int i) |
| { |
| return (i > 0) ? __builtin_clz (i) : 32; |
| } |
| |
| /* { dg-final { scan-assembler-times "clz\t" 6 } } */ |
| /* { dg-final { scan-assembler-not "cmp\t.*0" } } */ |