http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56897



             Bug #: 56897

           Summary: unaligned memory access on alpha

    Classification: Unclassified

           Product: gcc

           Version: unknown

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: target

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: marty...@venck.us





Hi,



After looking at the RTL dumps here and there, I've noticed that

GCC generates unaligned loads in the following manner:



foo = ([reg:X & -8] << (64 - (((reg:FP+reg:Y) & 0x7) << 3))) >> 56



Obviously, we're losing every eighth byte here (consider FP-0,FP-8).

Since FP is aligned, GCC optimizes this to foo = 0.  The right way

to do this is:



foo = ([reg:X & -8] << (56 - (((reg:FP+reg:Y-1) & 0x7) << 3))) >> 56



To reproduce, try this out:



unsigned long foo = 0x010203040a0b0c0d;

printf("%02x",   *((char *)&foo + 7));



With -O (and onwards) it will turn out to be zero;  at every &X+15,

&X+23, etc.  Depending on the offset from the frame pointer.



Attached the diff against trunk.



Martynas.

Reply via email to