http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56080
Bug #: 56080 Summary: Incorrect code generated when changing lvalue of pointer and using inline code and optimizations. Classification: Unclassified Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: annou...@solidra.com Created attachment 29253 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29253 C++ source to reproduce bug The source below fails to operate correctly when __iowrite is inlined and optimizations are set to -O2. static inline void __iowrite(uint32_t src, uint32_t* dst) { *dst=src; } #define iowrite32(val,iomem) __iowrite((uint32_t)(val), (uint32_t*)(iomem)) static void __miowrite32(void* d, void* s, unsigned count) { while (count--) { iowrite32(*((uint32_t*)s), d); ++(*((uint32_t**)&s)); ++(*((uint32_t**)&d)); } } If I disable optimizations or change __iowrite to non-inlined the function works correctly. The attachment reproduces the error. Exit code is zero on success, 1 on error. A message is printed on error. Compile with g++ -c gcc_error -O2 gcc_error.cpp