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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|ice-checking                |

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Oh, and

#define bitsize_int(L) size_int_kind (L, stk_bitsizetype)
extern tree size_int_kind (poly_int64, enum size_type_kind);

so bitsize_int truncates as well.  The following fixes the ICE
but generates wrong code (the * 8 / 8 truncates/sign-extends).
The wrong-code is very old - before poly-int size_int_kind had
a HOST_WIDE_INT argument.

foo:
.LFB0:
        .cfi_startproc
        movabsq $-1079849033811971180, %rax
        movupd  -8(%rsp,%rax), %xmm0
        addpd   cf(%rip), %xmm0
        movaps  %xmm0, cf(%rip)
        ret


diff --git a/gcc/tree-eh.cc b/gcc/tree-eh.cc
index 7015189a2de..128744eebdd 100644
--- a/gcc/tree-eh.cc
+++ b/gcc/tree-eh.cc
@@ -2652,16 +2652,14 @@ range_in_array_bounds_p (tree ref)
 static bool
 bit_field_ref_in_bounds_p (tree expr)
 {
-  tree size_tree;
-  poly_uint64 size_max, min, wid, max;
-
-  size_tree = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (expr, 0)));
-  if (!size_tree || !poly_int_tree_p (size_tree, &size_max))
+  tree size_tree = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (expr, 0)));
+  if (!size_tree || !poly_int_tree_p (size_tree))
     return false;

-  min = bit_field_offset (expr);
-  wid = bit_field_size (expr);
-  max = min + wid;
+  poly_offset_int size_max = wi::to_poly_offset (size_tree);
+  poly_offset_int min = wi::to_poly_offset (TREE_OPERAND (expr, 2));
+  poly_offset_int wid = wi::to_poly_offset (TREE_OPERAND (expr, 1));
+  poly_offset_int max = min + wid;
   if (maybe_lt (max, min)
       || maybe_lt (size_max, max))
     return false;

Reply via email to