https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126446
--- Comment #15 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The releases/gcc-14 branch has been updated by Jakub Jelinek <[email protected]>: https://gcc.gnu.org/g:b750098281a54d88207f31b648dd644c32371642 commit r14-12785-gb750098281a54d88207f31b648dd644c32371642 Author: Jakub Jelinek <[email protected]> Date: Wed Jul 29 23:34:54 2026 +0200 isel: Fix ICE on out of bounds vector elt access [PR126446] 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. Furthermore, the known_gt check looks wrong, already idx_poly known_eq to nelts is too large and out of bounds for .VEC_SET. This patch fixes that by punting if !poly_int_tree_p (idx, &idx_poly) and poly_int_tree_p (idx), so when it is INTEGER_CST or POLY_INT_CST which doesn't fit into poly_uint64 (so likely negative), and uses known_ge instead of known_gt. 2026-07-29 Jakub Jelinek <[email protected]> PR target/126446 * gimple-isel.cc (gimple_expand_vec_set_extract_expr): Punt if idx doesn't fit into poly_uint64 but is poly_int_tree_p. Use known_ge rather than known_gt for out of bounds check. Formatting fixes. Reviewed-by: Richard Biener <[email protected]> (cherry picked from commit a7ba10ac1e027349a655ee4572abf34c1b9c1db1)
