target/102125 - alternative memcpy folding improvement
Commit Message
The following extends the heuristical memcpy folding path with the
ability to use misaligned accesses on strict-alignment targets just
like the size-based path does. That avoids regressing the following
testcase on arm
uint64_t bar64(const uint8_t *rData1)
{
uint64_t buffer;
memcpy(&buffer, rData1, sizeof(buffer));
return buffer;
}
when r12-3482-g5f6a6c91d7c592 is reverted.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed to trunk.
OK to revert r12-3482-g5f6a6c91d7c592?
Thanks,
Richard.
2022-03-23 Richard Biener <rguenther@suse.de>
PR target/102125
* gimple-fold.cc (gimple_fold_builtin_memory_op): Allow the
use of movmisalign when either the source or destination
decl is properly aligned.
---
gcc/gimple-fold.cc | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
Comments
On 23/03/2022 14:57, Richard Biener via Gcc-patches wrote:
> The following extends the heuristical memcpy folding path with the
> ability to use misaligned accesses on strict-alignment targets just
> like the size-based path does. That avoids regressing the following
> testcase on arm
>
> uint64_t bar64(const uint8_t *rData1)
> {
> uint64_t buffer;
> memcpy(&buffer, rData1, sizeof(buffer));
> return buffer;
> }
>
> when r12-3482-g5f6a6c91d7c592 is reverted.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed to trunk.
>
> OK to revert r12-3482-g5f6a6c91d7c592?
Yes, go ahead.
R.
>
> Thanks,
> Richard.
>
> 2022-03-23 Richard Biener <rguenther@suse.de>
>
> PR target/102125
> * gimple-fold.cc (gimple_fold_builtin_memory_op): Allow the
> use of movmisalign when either the source or destination
> decl is properly aligned.
> ---
> gcc/gimple-fold.cc | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> index c9179abb27e..5eff7d68ac1 100644
> --- a/gcc/gimple-fold.cc
> +++ b/gcc/gimple-fold.cc
> @@ -1254,7 +1254,11 @@ gimple_fold_builtin_memory_op (gimple_stmt_iterator *gsi,
> srcvar = fold_build2 (MEM_REF, desttype, src, off0);
> else
> {
> - if (STRICT_ALIGNMENT)
> + enum machine_mode mode = TYPE_MODE (desttype);
> + if ((mode == BLKmode && STRICT_ALIGNMENT)
> + || (targetm.slow_unaligned_access (mode, src_align)
> + && (optab_handler (movmisalign_optab, mode)
> + == CODE_FOR_nothing)))
> return false;
> srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
> src_align);
> @@ -1267,7 +1271,11 @@ gimple_fold_builtin_memory_op (gimple_stmt_iterator *gsi,
> destvar = fold_build2 (MEM_REF, srctype, dest, off0);
> else
> {
> - if (STRICT_ALIGNMENT)
> + enum machine_mode mode = TYPE_MODE (srctype);
> + if ((mode == BLKmode && STRICT_ALIGNMENT)
> + || (targetm.slow_unaligned_access (mode, dest_align)
> + && (optab_handler (movmisalign_optab, mode)
> + == CODE_FOR_nothing)))
> return false;
> desttype = build_aligned_type (TYPE_MAIN_VARIANT (srctype),
> dest_align);
@@ -1254,7 +1254,11 @@ gimple_fold_builtin_memory_op (gimple_stmt_iterator *gsi,
srcvar = fold_build2 (MEM_REF, desttype, src, off0);
else
{
- if (STRICT_ALIGNMENT)
+ enum machine_mode mode = TYPE_MODE (desttype);
+ if ((mode == BLKmode && STRICT_ALIGNMENT)
+ || (targetm.slow_unaligned_access (mode, src_align)
+ && (optab_handler (movmisalign_optab, mode)
+ == CODE_FOR_nothing)))
return false;
srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
src_align);
@@ -1267,7 +1271,11 @@ gimple_fold_builtin_memory_op (gimple_stmt_iterator *gsi,
destvar = fold_build2 (MEM_REF, srctype, dest, off0);
else
{
- if (STRICT_ALIGNMENT)
+ enum machine_mode mode = TYPE_MODE (srctype);
+ if ((mode == BLKmode && STRICT_ALIGNMENT)
+ || (targetm.slow_unaligned_access (mode, dest_align)
+ && (optab_handler (movmisalign_optab, mode)
+ == CODE_FOR_nothing)))
return false;
desttype = build_aligned_type (TYPE_MAIN_VARIANT (srctype),
dest_align);