Hello, Consider this code that implements hton and ntoh for float values :
//main.cpp #include <stdio.h> #include <netinet/in.h> inline float hton(float x) { const size_t nb32 = sizeof(float)/sizeof(uint32_t); const size_t nb16 = (sizeof(float)/sizeof(uint16_t))%2; uint32_t* p32 = (uint32_t*)(&x); uint16_t* p16 = 0; size_t i = 0; for(i = 0 ; i<nb32 ; ++i, ++p32) *p32 = htonl(*p32); p16 = (uint16_t*)(p32); for(i = 0 ; i<nb16 ; ++i, ++p16) *p16 = htonl(*p16); return x; } inline float ntoh(float x) { const size_t nb32 = sizeof(float)/sizeof(uint32_t); const size_t nb16 = (sizeof(float)/sizeof(uint16_t))%2; uint32_t* p32 = (uint32_t*)(&x); uint16_t* p16 = 0; size_t i = 0; for(i = 0 ; i<nb32 ; ++i, ++p32) *p32 = ntohl(*p32); p16 = (uint16_t*)(p32); for(i = 0 ; i<nb16 ; ++i, ++p16) *p16 = ntohl(*p16); return x; } int main(int argc, char** argv) { float f = 1.3; float g = hton(f); float h = ntoh(g); printf("f=%f\ng=%f\nh=%f\n", f, g, h); return 0; } /////////////////////////////////////////// When compiled with -O1, it works with gcc 3.3.6, 3.4.5 and 4.0.1 When compiled with -O2, it does not work any more with 3.4.5 and 4.0.1 But if you remove the "inline", it works again at -O2 with 3.4.5 and 4.0.1 In -O3, automatic inlining make it fail again in 3.4.5 and 4.0.1 Regards, Pierre Chatelier -- Summary: [3.4 4.0 regression] wrong code with inlining at -O2 Product: gcc Version: 3.4.5 Status: UNCONFIRMED Severity: critical Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: pierre dot chatelier at club-internet dot fr http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25267