Alex Coplan <alex.cop...@arm.com> writes: > This patch adjusts the mem{cpy,set} expansion in the aarch64 backend to use > individual loads/stores instead of ldp/stp at expand time. The idea is to > rely > on the ldp fusion pass to fuse the accesses together later in the RTL > pipeline. > > The earlier parts of the RTL pipeline should be able to do a better job with > the > individual (non-paired) accesses, especially given that an earlier patch in > this > series moves the pair representation to use unspecs. > > Bootstrapped/regtested as a series on aarch64-linux-gnu, OK for trunk? > > Thanks, > Alex > > gcc/ChangeLog: > > * config/aarch64/aarch64.cc > (aarch64_copy_one_block_and_progress_pointers): Emit individual > accesses instead of load/store pairs. > (aarch64_set_one_block_and_progress_pointer): Likewise.
OK, thanks. Richard > --- > gcc/config/aarch64/aarch64.cc | 12 ++++++++---- > 1 file changed, 8 insertions(+), 4 deletions(-) > > diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc > index 1f6094bf1bc..315ba7119c0 100644 > --- a/gcc/config/aarch64/aarch64.cc > +++ b/gcc/config/aarch64/aarch64.cc > @@ -25457,9 +25457,12 @@ aarch64_copy_one_block_and_progress_pointers (rtx > *src, rtx *dst, > /* "Cast" the pointers to the correct mode. */ > *src = adjust_address (*src, mode, 0); > *dst = adjust_address (*dst, mode, 0); > - /* Emit the memcpy. */ > - emit_insn (aarch64_gen_load_pair (reg1, reg2, *src)); > - emit_insn (aarch64_gen_store_pair (*dst, reg1, reg2)); > + /* Emit the memcpy. The load/store pair pass should form > + a load/store pair from these moves. */ > + emit_move_insn (reg1, *src); > + emit_move_insn (reg2, aarch64_progress_pointer (*src)); > + emit_move_insn (*dst, reg1); > + emit_move_insn (aarch64_progress_pointer (*dst), reg2); > /* Move the pointers forward. */ > *src = aarch64_move_pointer (*src, 32); > *dst = aarch64_move_pointer (*dst, 32); > @@ -25638,7 +25641,8 @@ aarch64_set_one_block_and_progress_pointer (rtx src, > rtx *dst, > /* "Cast" the *dst to the correct mode. */ > *dst = adjust_address (*dst, mode, 0); > /* Emit the memset. */ > - emit_insn (aarch64_gen_store_pair (*dst, src, src)); > + emit_move_insn (*dst, src); > + emit_move_insn (aarch64_progress_pointer (*dst), src); > > /* Move the pointers forward. */ > *dst = aarch64_move_pointer (*dst, 32);