https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70467
Bug ID: 70467 Summary: Useless "and [esp],-1" emitted on AND with uint64_t variable Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: b7.10110111 at gmail dot com Target Milestone: --- Consider the following C code: #include <string.h> long double __attribute__((noinline)) test() { return 0; } long double doStuff() { long double value=test(); unsigned long long v; memcpy(&v,&value,sizeof v); v&=~(1ull<<63); memcpy(&value,&v,sizeof v); return value; } int main(){} I get the following output for duStuff() function when I compile this code with `gcc -O3 -fomit-frame-pointer -m32`: doStuff: sub esp, 28 call test ; OK, I asked to avoid inlining it fstp TBYTE PTR [esp] and DWORD PTR [esp], -1 ; DO NOTHING!!! and DWORD PTR [esp+4], 2147483647 ; Clear highest bit fld TBYTE PTR [esp] add esp, 28 ret The instruction marked with `DO NOTHING!!!` is a no-op here (flags are not tested) and should have been eliminated. This useless instruction is generated across generations of GCC starting at least with 4.4.7 and ending at 6.0.0 20160221 (the snapshot testable at gcc.godbolt.org).