/* Check that for dynamic logical right shifts with a constant the negated constant is loaded directly, instead of loading the postitive constant and negating it separately. This was a case that happened at optimization level -O2 and looked like: cmp/eq r6,r5 mov #30,r1 neg r1,r1 shld r1,r4 mov r4,r0 rts rotcr r0 */ /* { dg-do compile { target { has_dyn_shift } } } */ /* { dg-options "-O2" } */ /* { dg-final { scan-assembler-not "neg" } } */ unsigned int test (unsigned int a, int b, int c) { unsigned char r = b == c; return ((a >> 31) | (r << 31)); }