/* PR middle-end/91680 */ /* { dg-do compile { target { ilp32 || lp64 } } } */ /* { dg-options "-O2 -fdump-tree-forwprop1" } */ /* { dg-final { scan-tree-dump-times " / " 1 "forwprop1" } } */ /* { dg-final { scan-tree-dump-times " >> " 3 "forwprop1" } } */ __attribute__((noipa)) unsigned long long foo (unsigned char x) { unsigned long long q = 1 << x; return 256 / q; } __attribute__((noipa)) unsigned long long bar (unsigned char x) { unsigned long long q = 1U << x; return 256 / q; } __attribute__((noipa)) unsigned long long baz (unsigned char x, unsigned long long y) { /* This can't be optimized, at least not in C++ and maybe not in C89, because for x 31 q is -2147483648ULL, not 2147483648ULL, and e.g. 2147483648ULL >> 31 is 1, while 2147483648ULL / -2147483648ULL is 0. */ unsigned long long q = 1 << x; return y / q; } __attribute__((noipa)) unsigned long long qux (unsigned char x, unsigned long long y) { unsigned long long q = 1U << x; return y / q; }