• Peter Hurley's avatar
    ARM: 8341/1: io: Unpessimize relaxed io accessors · 5bb5d66d
    Peter Hurley authored
    commit 195bbcac ("ARM: 7500/1: io: avoid writeback addressing
    modes for __raw_ accessors") disables writeback addressing modes for
    raw i/o. However, the "+Q" output constraint forces the compiler to
    disable load hoist optimizations (because the output constraint informs the
    compiler of memory stores which the compiler assumes may alias other memory).
    
    Since the relaxed accessors only guarantee ordering wrt i/o accesses to the
    same device and not to main memory, there's never a possibility of an accessor
    invalidating a hoisted load (because only non-i/o loads would have been hoisted).
    
    The effect is especially noticable with complex address inputs in loops.
    For example, the following code:
    
        #include <linux/kernel.h>
        #include <linux/io.h>
    
        static const int *remap;
    
        void wr_loop(void __iomem *base, int c, int val)
        {
                int i;
    
                for (i = 0; i < c; i++)
                        writew_relaxed(val, base + remap[c >> 2]);
        }
    
    generates
    
               current master             |             this patch
     0: e3510000    cmp     r1, #0        |  0: e3510000    cmp     r1, #0
     4: d12fff1e    bxle    lr            |  4: d12fff1e    bxle    lr
     8: e3003000    movw    r3, #0        |  8: e3c1c003    bic     ip, r1, #3
     c: e3403000    movt    r3, #0        |  c: e6ff2072    uxth    r2, r2
    10: e92d4010    push    {r4, lr}      | 10: e3a03000    mov     r3, #0
    14: e6ff2072    uxth    r2, r2        | 14: e59cc000    ldr     ip, [ip]
    18: e3c14003    bic     r4, r1, #3    | 18: e080000c    add     r0, r0, ip
    1c: e593e000    ldr     lr, [r3]      |
    20: e3a03000    mov     r3, #0        | 1c: e1c020b0    strh    r2, [r0]
                                          | 20: e2833001    add     r3, r3, #1
    24: e79ec004    ldr     ip, [lr, r4]  | 24: e1530001    cmp     r3, r1
    28: e080c00c    add     ip, r0, ip    | 28: 1afffffb    bne     1c
    2c: e1cc20b0    strh    r2, [ip]      | 2c: e12fff1e    bx      lr
    30: e2833001    add     r3, r3, #1    |
    34: e1530001    cmp     r3, r1        |
    38: 1afffff9    bne     24            |
                                          |
    3c: e8bd8010    pop     {r4, pc}      |
    Acked-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    5bb5d66d
io.h 12.9 KB