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

--- Comment #7 from Jiangning Liu <jiangning.liu at amperecomputing dot com> ---
To avoid "readonly" issue, try this case,

unsigned test(unsigned k, unsigned b) {
        unsigned a[2];
        if (b < a[k]) {
                a[k] = b;
        }
        return a[0]+a[2];
}

Variable a is local, and it is NOT readonly, so now the following code is
generated,

        sub     sp, sp, #16
        uxtw    x0, w0
        add     x2, sp, 8
        ldr     w3, [x2, x0, lsl 2]
        cmp     w3, w1
        bls     .L2
        str     w1, [x2, x0, lsl 2]
.L2:
        ldr     w1, [sp, 8]
        ldr     w0, [sp, 16]
        add     sp, sp, 16
        add     w0, w1, w0
        ret

But gcc should generate code below instead,

        uxtw    x2, w0
        add     x3, sp, 8
        ldr     w5, [sp, 16]
        ldr     w4, [x3, x2, lsl 2]
        cmp     w4, w1
        csel    w1, w1, w4, hi
        str     w1, [x3, x2, lsl 2]
        ldr     w0, [sp, 8]
        add     sp, sp, 16
        add     w0, w0, w5
        ret

Any other glass jaw?

Reply via email to