On Mon, Sep 6, 2021 at 12:40 PM Richard Earnshaw <rearn...@arm.com> wrote: > > > 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
OK. Thanks, Richard. > 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 | 16 +++++++++++----- > 1 file changed, 11 insertions(+), 5 deletions(-) >