When I compile this function: double f(long double i) {return (i);} with gcc flags -S -O3, I get the assembly below.
There are two redundant FPU instructions there. double value is already in FPU after fldt. No need to store it and load it back since difference between double and long double is only in memory representation, and in FPU registers they are the same. ---- asm output (relevant part) ---- f: pushl %ebp movl %esp, %ebp subl $8, %esp <---- redundant related stack adjustment fldt 8(%ebp) fstpl -8(%ebp) <---- redundant STORE fldl -8(%ebp) <---- redundant LOAD leave ret -- Summary: redundant instructions with long double returned value Product: gcc Version: 4.4.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: yuri at tsoft dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41462