On Thu, Apr 13, 2017 at 01:49:01PM +0200, Richard Biener wrote: > It is IMHO a valid GIMPLE optimization / canonicalization.
As I said, we can do it as GIMPLE canonicalization, but we should have code to undo it if beneficial at RTL level. And the patch has not included that. > > movabsq $-9223372036854775808, %rax > > so this should then have been generated as 1<<63? Maybe. But it seems to be still more expensive than the original code, though better than movabsq: __attribute__((noinline, noclone)) unsigned long long int foo (int x) { asm volatile ("" : : : "memory"); return 1ULL << (63 - x); } __attribute__((noinline, noclone)) unsigned long long int bar (int x) { asm volatile ("" : : : "memory"); return (1ULL << 63) >> x; } __attribute__((noinline, noclone)) unsigned long long int baz (int x) { unsigned long long int y = 1; asm volatile ("" : "+r" (y) : : "memory"); return (y << 63) >> x; } int main (int argc, const char **argv) { int i; if (argc == 1) for (i = 0; i < 1000000000; i++) asm volatile ("" : : "r" (foo (13))); else if (argc == 2) for (i = 0; i < 1000000000; i++) asm volatile ("" : : "r" (bar (13))); else if (argc == 3) for (i = 0; i < 1000000000; i++) asm volatile ("" : : "r" (baz (13))); return 0; } Jakub