[Bug target/94959] Wrong code gen for MVE intrinsics vldrbq_s32 which fails with assembler `Error: lo register required`

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Jun 16 13:46:42 GMT 2020


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

--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-10 branch has been updated by SRINATH PARVATHANENI
<sripar01@gcc.gnu.org>:

https://gcc.gnu.org/g:32c348ce3efd1d693df43045338c8c3e33798edd

commit r10-8310-g32c348ce3efd1d693df43045338c8c3e33798edd
Author: Srinath Parvathaneni <srinath.parvathaneni@arm.com>
Date:   Tue Jun 16 13:26:41 2020 +0100

    arm: Fix the wrong code-gen generated by MVE vector load/store intrinsics
(PR94959).

    Few MVE intrinsics like vldrbq_s32, vldrhq_s32 etc., the assembler
instructions
    generated by current compiler are wrong.
    eg: vldrbq_s32 generates an assembly instructions `vldrb.s32 q0,[ip]`.
    But as per Arm-arm second argument in above instructions must also be a low
    register (<= r7). This patch fixes this issue by creating a new predicate
    "mve_memory_operand" and constraint "Ux" which allows low registers as
arguments
    to the generated instructions depending on the mode of the argument. A new
constraint
    "Ul" is created to handle loading to PC-relative addressing modes for
vector
    store/load intrinsiscs.
    All the corresponding MVE intrinsic generating wrong code-gen as vldrbq_s32
    are modified in this patch.

            Backported from mainline
            2020-05-20  Srinath Parvathaneni  <srinath.parvathaneni@arm.com>

    gcc/
            PR target/94959
            * config/arm/arm-protos.h (arm_mode_base_reg_class): Function
            declaration.
            (mve_vector_mem_operand): Likewise.
            * config/arm/arm.c (thumb2_legitimate_address_p): For MVE target
check
            the load from memory to a core register is legitimate for give
mode.
            (mve_vector_mem_operand): Define function.
            (arm_print_operand): Modify comment.
            (arm_mode_base_reg_class): Define.
            * config/arm/arm.h (MODE_BASE_REG_CLASS): Modify to add check for
            TARGET_HAVE_MVE and expand to arm_mode_base_reg_class on TRUE.
            * config/arm/constraints.md (Ux): Likewise.
            (Ul): Likewise.
            * config/arm/mve.md (mve_mov): Replace constraint Us with Ux and
also
            add support for missing Vector Store Register and Vector Load
Register.
            Add a new alternative to support load from memory to PC (or label)
in
            vector store/load.
            (mve_vstrbq_<supf><mode>): Modify constraint Us to Ux.
            (mve_vldrbq_<supf><mode>): Modify constriant Us to Ux, predicate to
            mve_memory_operand and also modify the MVE instructions to emit.
            (mve_vldrbq_z_<supf><mode>): Modify constraint Us to Ux.
            (mve_vldrhq_fv8hf): Modify constriant Us to Ux, predicate to
            mve_memory_operand and also modify the MVE instructions to emit.
            (mve_vldrhq_<supf><mode>): Modify constriant Us to Ux, predicate to
            mve_memory_operand and also modify the MVE instructions to emit.
            (mve_vldrhq_z_fv8hf): Likewise.
            (mve_vldrhq_z_<supf><mode>): Likewise.
            (mve_vldrwq_fv4sf): Likewise.
            (mve_vldrwq_<supf>v4si): Likewise.
            (mve_vldrwq_z_fv4sf): Likewise.
            (mve_vldrwq_z_<supf>v4si): Likewise.
            (mve_vld1q_f<mode>): Modify constriant Us to Ux.
            (mve_vld1q_<supf><mode>): Likewise.
            (mve_vstrhq_fv8hf): Modify constriant Us to Ux, predicate to
            mve_memory_operand.
            (mve_vstrhq_p_fv8hf): Modify constriant Us to Ux, predicate to
            mve_memory_operand and also modify the MVE instructions to emit.
            (mve_vstrhq_p_<supf><mode>): Likewise.
            (mve_vstrhq_<supf><mode>): Modify constriant Us to Ux, predicate to
            mve_memory_operand.
            (mve_vstrwq_fv4sf): Modify constriant Us to Ux.
            (mve_vstrwq_p_fv4sf): Modify constriant Us to Ux and also modify
the MVE
            instructions to emit.
            (mve_vstrwq_p_<supf>v4si): Likewise.
            (mve_vstrwq_<supf>v4si): Likewise.Modify constriant Us to Ux.
            * config/arm/predicates.md (mve_memory_operand): Define.

    gcc/testsuite/
            PR target/94959
            * gcc.target/arm/mve/intrinsics/mve_vector_float2.c: Modify.
            * gcc.target/arm/mve/intrinsics/mve_vldr.c: New test.
            * gcc.target/arm/mve/intrinsics/mve_vldr_z.c: Likewise.
            * gcc.target/arm/mve/intrinsics/mve_vstr.c: Likewise.
            * gcc.target/arm/mve/intrinsics/mve_vstr_p.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_f16.c: Modify.
            * gcc.target/arm/mve/intrinsics/vld1q_f32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_s16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_s32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_s8.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_u16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_u32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_u8.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_z_f16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_z_f32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_z_s16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_z_s32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_z_s8.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_z_u16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_z_u32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vld1q_z_u8.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrbq_s8.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrbq_u8.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrbq_z_s8.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrbq_z_u8.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrdq_gather_base_wb_s64.c:
Likewise.
            * gcc.target/arm/mve/intrinsics/vldrdq_gather_base_wb_u64.c:
Likewise.
            * gcc.target/arm/mve/intrinsics/vldrdq_gather_base_wb_z_s64.c:
Likewise.
            * gcc.target/arm/mve/intrinsics/vldrdq_gather_base_wb_z_u64.c:
Likewise.
            * gcc.target/arm/mve/intrinsics/vldrhq_f16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrhq_s16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrhq_s32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrhq_u16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrhq_u32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrhq_z_f16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrhq_z_s16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrhq_z_s32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrhq_z_u16.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrhq_z_u32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_f32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_f32.c:
Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_s32.c:
Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_u32.c:
Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_z_f32.c:
Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_z_s32.c:
Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_z_u32.c:
Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_s32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_u32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_z_f32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_z_s32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vldrwq_z_u32.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vuninitializedq_float.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vuninitializedq_float1.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vuninitializedq_int.c: Likewise.
            * gcc.target/arm/mve/intrinsics/vuninitializedq_int1.c: Likewise.

    Co-Authored-By: Andre Vieira  <andre.simoesdiasvieira@arm.com>


More information about the Gcc-bugs mailing list