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

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

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

commit r16-3855-gbd83c6227c6c2ccb5df88937a338b501fd550de6
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Mon Sep 15 10:34:33 2025 +0200

    expr, tree: Ensure get_range_pos_neg is called only on scalar integral
types [PR121904]

    The gcc.c-torture/compile/20111209-1.c testcase which uses
    typedef char* char_ptr32 __attribute__ ((mode(SI)));
    ICEs on s390x since my change to optimize extensions by cheaper of
    signed or unsigned extension if sign bit is known from VRP not to be set.

    The problem is that get_range_pos_neg uses ranger into int_range_max
    and so ICEs on pointers.  All the other current callers call it from places
    where only scalar integral types can appear (scalar division/modulo,
    overflow ifns, etc.) I think, this spot was just testing SCALAR_INT_MODE_P.

    The following patch adds check for INTEGRAL_TYPE_P, I think ranger will not
    do anything useful for pointers here anyway and what is a negative pointer
    is also fuzzy.  I've changed both get_range_pos_neg to punt on that and
    the caller, either of those changes are sufficient to fix the ICE, but I
    think it doesn't hurt to do it in both places.

    2025-09-15  Jakub Jelinek  <ja...@redhat.com>

            PR middle-end/121904
            * tree.cc (get_range_pos_neg): Return 3 if arg doesn't have
            scalar integral type.
            * expr.cc (expand_expr_real_2) <CASE_CONVERT>: Only choose between
            sign and zero extension based on costs for scalar integral inner
            types.

Reply via email to