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

--- Comment #12 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Maciej W. Rozycki <ma...@gcc.gnu.org>:

https://gcc.gnu.org/g:e0dae4da4c45e3959b0624551f80283c45a60446

commit r15-6440-ge0dae4da4c45e3959b0624551f80283c45a60446
Author: Maciej W. Rozycki <ma...@orcam.me.uk>
Date:   Wed Dec 25 22:23:40 2024 +0000

    Alpha: Also use tree information to get base block alignment

    We hardly ever emit code using machine instructions for aligned memory
    accesses for block move and clear operation and the reason for this
    appears to be that suboptimal alignment is often passed by the caller
    and then we only try to find a better alignment by checking pseudo
    register pointer alignment information, and from observation it's most
    often only set for stack frame references.

    This code originates from before Tree SSA days and we can do better
    nowadays, by looking up the original tree node associated with a MEM
    RTL, so implement this approach, factoring out repeating code from
    `alpha_expand_block_move' and `alpha_expand_block_clear' to a new
    function.

    In some cases howewer tree information is not available while pointer
    alignment is, such as with the case concerned with PR target/115459,
    where we have:

    (gdb) pr orig_src
    (mem:BLK (plus:DI (reg/f:DI 65 virtual-stack-vars [ lock.206_2 ])
            (const_int 8368 [0x20b0])) [8  S18 A8])
    (gdb) pr orig_dst
    (mem/j/c:BLK (plus:DI (reg/f:DI 65 virtual-stack-vars [ lock.206_2 ])
            (const_int 8208 [0x2010])) [8 MEM[(struct
gnat__debug_pools__print_info_stdout__internal__L_18__B1182b__S1183b___PAD
*)_339].F[1 ...]{lb: 1 sz: 1}+0 S18 A128])
    (gdb)

    showing no tree information and the alignment of 8 only for `orig_src',
    while indeed REGNO_POINTER_ALIGN returns 128 for pseudo 65.  So retain
    the old approach and return the largest alignment determined and its
    associated offset.

    Add test cases accordingly and remove XFAILs from memclr-a2-o1-c9-ptr.c
    now that it does get aligned code produced now.

            gcc/
            * config/alpha/alpha.cc
            (alpha_get_mem_rtx_alignment_and_offset): New function.
            (alpha_expand_block_move, alpha_expand_block_clear): Use it for
            alignment retrieval.

            gcc/testsuite/
            * gcc.target/alpha/memclr-a2-o1-c9-ptr.c: Remove XFAILs.
            * gcc.target/alpha/memcpy-di-aligned.c: New file.
            * gcc.target/alpha/memcpy-di-unaligned.c: New file.
            * gcc.target/alpha/memcpy-di-unaligned-dst.c: New file.
            * gcc.target/alpha/memcpy-di-unaligned-src.c: New file.

Reply via email to