https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66663
Bug ID: 66663 Summary: gcc misses optimization emits useless test of (a & 31) with 32 Product: gcc Version: 5.0 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: fuz at fuz dot su Target Milestone: --- The following code: unsigned long long foo(unsigned long long x, int a) { return x << (a & 31); } compiled with a recent build of gcc for i386 Linux (with -O3) yields the following assembly: foo: movl 12(%esp), %ecx movl 4(%esp), %eax movl 8(%esp), %edx andl $31, %ecx shldl %eax, %edx sall %cl, %eax testb $32, %cl je .L2 movl %eax, %edx xorl %eax, %eax .L2: rep ret .ident "GCC: (GNU) 5.0.0 20150314 (experimental)" The testb instruction seems redundant as %cl has been masked with $31 a few instructions before: The jump will never be taken.