https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102162

Arnd Bergmann <arnd at linaro dot org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |arnd at linaro dot org

--- Comment #2 from Arnd Bergmann <arnd at linaro dot org> ---
I tried reproducing the issue with my original kernel code, using this input:

typedef unsigned u32;
#define __packed __attribute__((packed))

#define __get_unaligned_t(type, ptr) ({                                        
\
        const struct { type x; } __packed *__pptr = (typeof(__pptr))(ptr);     
\
        __pptr->x;                                                             
\
}) 

#define get_unaligned(ptr)      __get_unaligned_t(typeof(*(ptr)), (ptr))

int f_unaligned(u32 *p)
{ 
     return get_unaligned(p); 
}

int g(u32 *p) 
{ 
     return *(p); 
}

and it looks like I get correct output:

hppa64-linux-gcc -S kernel/test_unaligned.c -o - -O2
        .LEVEL 2.0w
        .text
        .align 8
.globl f_unaligned
        .type   f_unaligned, @function
f_unaligned:
        .PROC
        .CALLINFO FRAME=0,NO_CALLS
        .ENTRY
        ldb 0(%r26),%r20
        ldb 1(%r26),%r19
        depd,z %r20,39,40,%r20
        depd,z %r19,47,48,%r19
        ldb 2(%r26),%r31
        ldb 3(%r26),%r28
        or %r19,%r20,%r19
        depd,z %r31,55,56,%r31
        or %r31,%r19,%r31
        or %r28,%r31,%r28
        bve (%r2)
        extrd,s %r28,63,32,%r28
        .EXIT
        .PROCEND
        .size   f_unaligned, .-f_unaligned
        .align 8
.globl g
        .type   g, @function
g:
        .PROC
        .CALLINFO FRAME=0,NO_CALLS
        .ENTRY
        ldw 0(%r26),%r28
        bve (%r2)
        extrd,s %r28,63,32,%r28
        .EXIT
        .PROCEND
        .size   g, .-g
        .ident  "GCC: (GNU) 11.1.0"

Any idea what the difference is between the working version and your broken
one?

Reply via email to