]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
expr, tree: Ensure get_range_pos_neg is called only on scalar integral types [PR121904]
authorJakub Jelinek <jakub@redhat.com>
Mon, 15 Sep 2025 08:34:33 +0000 (10:34 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 15 Sep 2025 08:34:33 +0000 (10:34 +0200)
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  <jakub@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.

gcc/expr.cc
gcc/tree.cc

index 4f7b457aa678538fb6115bd2c49ee5b14be98065..4a699101bb5aeca940ae516ee690fb9017736393 100644 (file)
@@ -9960,6 +9960,7 @@ expand_expr_real_2 (const_sepops ops, rtx target, machine_mode tmode,
       else if (SCALAR_INT_MODE_P (GET_MODE (op0))
               && optimize >= 2
               && SCALAR_INT_MODE_P (mode)
+              && INTEGRAL_TYPE_P (TREE_TYPE (treeop0))
               && (GET_MODE_SIZE (as_a <scalar_int_mode> (mode))
                   > GET_MODE_SIZE (as_a <scalar_int_mode> (GET_MODE (op0))))
               && get_range_pos_neg (treeop0,
index 2a3ab23f1dc7622295c66922fc7fdb9c1b9584df..5d52a3886cefd427e78135efb38a42bf36f030a8 100644 (file)
@@ -14708,7 +14708,7 @@ verify_type (const_tree t)
 int
 get_range_pos_neg (tree arg, gimple *stmt)
 {
-  if (arg == error_mark_node)
+  if (arg == error_mark_node || !INTEGRAL_TYPE_P (TREE_TYPE (arg)))
     return 3;
 
   int prec = TYPE_PRECISION (TREE_TYPE (arg));