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

Reply via email to