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

--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Andrew Pinski <[email protected]>:

https://gcc.gnu.org/g:794acc6340cb2869a74fc69104c38ac5c2840a91

commit r16-8064-g794acc6340cb2869a74fc69104c38ac5c2840a91
Author: Andrew Pinski <[email protected]>
Date:   Wed Mar 11 13:01:08 2026 -0700

    simplify-rtx: Fix the case where subreg of a vec_concat could fail
[PR123822]

    So combine (rightfully) produces:
    (subreg:DD (vec_concat:V2DI (const_int -1 [0xffffffffffffffff])
            (reg:DI 145 [ _22 ])) 0)

    And then calls simplify_subreg on it.
    simplify_subreg then sees it can remove the vec_concat as this is
    the lower part and try to do `(subreg:DD (const_int -1
[0xffffffffffffffff]))`
    but that is an invalid constant for DF64 so simplify_subreg rejects
    that and returns NULL but there is code in simplify_subreg to create
    a SUBREG then if the subreg validates. The problem is we are using DImode
    for the inner mode and that validates but when gen_rtx_SUBREG is called
    the inner mode of DImode is not there; only VOIDmode.
    So the fix is to check for VOIDmode before the call to validate_subreg.

    Bootstrapped and tested on x86_64-linux-gnu. And lightly tested for
aarch64-linux-gnu.

            PR rtl-optimization/123822

    gcc/ChangeLog:

            * simplify-rtx.cc (simplify_context::simplify_subreg): Check the
            mode of the part to be non-VOIDmode before calling gen_rtx_SUBREG.

    gcc/testsuite/ChangeLog:

            * gcc.dg/torture/pr123822-1.c: New test.

    Signed-off-by: Andrew Pinski <[email protected]>

Reply via email to