]> git.ipfire.org Git - thirdparty/gcc.git/commit
gimple: allow more folding of memcpy [PR102125]
authorRichard Earnshaw <rearnsha@arm.com>
Fri, 3 Sep 2021 16:06:15 +0000 (17:06 +0100)
committerRichard Earnshaw <rearnsha@arm.com>
Mon, 13 Sep 2021 10:26:48 +0000 (11:26 +0100)
commit5f6a6c91d7c592cb49f7c519f289777eac09bb74
tree63b2e89f201b605fd70aa9f92c00c1e693a30599
parentf0cfd070b68772eaaa19a3b711fbd9e85b244240
gimple: allow more folding of memcpy [PR102125]

The current restriction on folding memcpy to a single element of size
MOVE_MAX is excessively cautious on most machines and limits some
significant further optimizations.  So relax the restriction provided
the copy size does not exceed MOVE_MAX * MOVE_RATIO and that a SET
insn exists for moving the value into machine registers.

Note that there were already checks in place for having misaligned
move operations when one or more of the operands were unaligned.

On Arm this now permits optimizing

uint64_t bar64(const uint8_t *rData1)
{
    uint64_t buffer;
    memcpy(&buffer, rData1, sizeof(buffer));
    return buffer;
}

from
        ldr     r2, [r0]        @ unaligned
        sub     sp, sp, #8
        ldr     r3, [r0, #4]    @ unaligned
        strd    r2, [sp]
        ldrd    r0, [sp]
        add     sp, sp, #8

to
        mov     r3, r0
        ldr     r0, [r0]        @ unaligned
        ldr     r1, [r3, #4]    @ unaligned

PR target/102125 - (ARM Cortex-M3 and newer) missed optimization. memcpy not needed operations

gcc/ChangeLog:

PR target/102125
* gimple-fold.c (gimple_fold_builtin_memory_op): Allow folding
memcpy if the size is not more than MOVE_MAX * MOVE_RATIO.
gcc/gimple-fold.c