I tested an svn build from 20100813 with the following code:

struct bar {
        unsigned int a:1, b:1, c:1, d:1, e:28;
};

void foo(struct bar * __restrict__ src, struct bar * __restrict__ dst)
{
        dst->a = src->a;
        dst->b = src->b;
        dst->c = src->c;
        dst->d = src->d;
        dst->e = src->e;
}

Built as 32bit, we see loads and stores as if the compiler is following pointer
aliasing rules:

# gcc -m32 -O2 -S foo.c 

foo:
        lwz 9,0(3)
        lwz 0,0(4)
        rlwimi 0,9,0,0,0
        stw 0,0(4)
        lwz 9,0(3)
        rlwimi 0,9,0,1,1
        stw 0,0(4)
        lwz 9,0(3)
        rlwimi 0,9,0,2,2
        stw 0,0(4)
        lwz 9,0(3)
        rlwimi 0,9,0,3,3
        stw 0,0(4)
        lwz 9,0(3)
        rlwimi 0,9,0,4,31
        stw 0,0(4)
        blr

Apologies if I am misusing or misinterpreting the use of __restrict__ here.

Also, when built as 64bit things are considerably more complex. Is there a
reason why we can't use the same code as 32bit?

# gcc -m64 -O2 -S foo.c
...
.L.foo:
        lwz 9,0(4)
        lwz 0,0(3)
        rlwinm 9,9,0,1,31
        rlwinm 0,0,0,0,0
        or 0,9,0
        stw 0,0(4)
        rlwinm 0,0,1,1,31
        rlwinm 0,0,31,0xffffffff
        lwz 9,0(3)
        rldicl 9,9,34,63
        slwi 9,9,30
        or 0,0,9
        stw 0,0(4)
        rlwinm 9,0,2,1,31
        rlwinm 9,9,30,0xffffffff
        lwz 0,0(3)
        rldicl 0,0,35,63
        slwi 0,0,29
        or 0,9,0
        stw 0,0(4)
        rlwinm 0,0,3,1,31
        rlwinm 0,0,29,0xffffffff
        lwz 9,0(3)
        rldicl 9,9,36,63
        slwi 9,9,28
        or 0,0,9
        stw 0,0(4)
        rlwinm 0,0,0,0,3
        lwz 9,0(3)
        rlwinm 9,9,0,4,31
        or 0,0,9
        stw 0,0(4)
        blr


-- 
           Summary: __restrict__ type qualifier does not work on pointers to
                    bitfields
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: anton at samba dot org
GCC target triplet: powerpc64-unknown-linux-gnu


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

Reply via email to