[Bug middle-end/126446] [13/14/15/16/17 Regression] X86-64: ICE at -O1 -mavx2 during RTL pass: vregs since r12-2085

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Jul 29 08:17:30 GMT 2026


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

--- Comment #6 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:1bc2fdc4f4cbe1b68237f49f211473c56d8a44a3

commit r17-2778-g1bc2fdc4f4cbe1b68237f49f211473c56d8a44a3
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Wed Jul 29 10:15:11 2026 +0200

    i386: Fix ICE on out of bounds vector elt access [PR126446]

    The following testcase ICEs on x86_64.
    The isel pass has a check for out of bounds constant index before
    optimizing into .VEC_SET, but it does it using
          // if index is a constant, then check the bounds
          poly_uint64 idx_poly;
          if (poly_int_tree_p (idx, &idx_poly))
            {
              poly_uint64 nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (view_op0));
              if (known_gt (idx_poly, nelts))
                return false;
            }
    In the testcase below, idx is INTEGER_CST with long long type and
    negative value, that doesn't fit into poly_uint64, so we happily convert
    it into .VEC_SET.

    And another problem is that the x86 backend isn't trying to be careful
    and handle out of bounds elt gracefully (I think it could still in theory
    happen, if GIMPLE lets it through but e.g. something during expansion
    figures out the index is constant or whatever).

    The following patch fixes it in the backend to avoid triggering UB at
compile
    time by doing HOST_WIDE_INT_1U << elt etc. when elt is negative or too
    large.  In order to avoid ICE, we need to emit something, so I emit
    a no-op move, out of bounds vector set shouldn't change anything in
    the target.

    gimple-isel.cc will be changed incrementally.

    2026-07-29  Jakub Jelinek  <jakub@redhat.com>

            PR target/126446
            * config/i386/i386-expand.cc (ix86_expand_vector_set): If elt is
            out of bounds, emit a no-op move.

            * gcc.target/i386/avx2-pr126446.c: New test.

    Reviewed-by: Uros Bizjak <ubizjak@gmail.com>


More information about the Gcc-bugs mailing list