tree-optimization/110043 - avoid overflow in pointer-query

pointer-query is built around using offset_int to avoid needing
to deal with overflow.  This falls apart when trying to analyze
array accesses indexed by __int128.  So don't.

	PR tree-optimization/110043
	* pointer-query.cc (get_offset_range): Fail for integer
	types with precision larger than ptrdiff_type_node.

	* gcc.dg/torture/pr110043.c: New testcase.
This commit is contained in:
Richard Biener
2026-01-27 15:43:53 +01:00
committed by Richard Biener
parent 11ef3c2e4f
commit 7fdb0e1b18
2 changed files with 15 additions and 1 deletions

View File

@@ -74,7 +74,12 @@ get_offset_range (tree x, gimple *stmt, offset_int r[2], range_query *rvals)
x = TREE_OPERAND (x, 0);
tree type = TREE_TYPE (x);
if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
if ((!INTEGRAL_TYPE_P (type)
/* ??? We get along without caring about overflow by using
offset_int, but that falls apart when indexes are bigger
than pointer differences. */
|| TYPE_PRECISION (type) > TYPE_PRECISION (ptrdiff_type_node))
&& !POINTER_TYPE_P (type))
return false;
if (TREE_CODE (x) != INTEGER_CST

View File

@@ -0,0 +1,9 @@
/* { dg-do compile } */
/* { dg-require-effective-target int128 } */
__int128 g_116_1;
extern char g_521[][8];
void func_24() {
for (; g_116_1 >= 0;)
g_521[g_116_1][g_116_1] &= 0;
}