https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98069
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- The following helps: diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 3bf460cccfd..a7606b3db99 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -754,9 +759,10 @@ split_constant_offset_1 (tree type, tree op0, enum tree_code code, tree op1, && TYPE_PRECISION (type) >= TYPE_PRECISION (itype) && (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))) { - if (INTEGRAL_TYPE_P (itype) && TYPE_OVERFLOW_WRAPS (itype) + if (INTEGRAL_TYPE_P (itype) && (TYPE_PRECISION (type) > TYPE_PRECISION (itype) - || TYPE_UNSIGNED (itype) != TYPE_UNSIGNED (type))) + || (TYPE_UNSIGNED (itype) != TYPE_UNSIGNED (type) + && TYPE_OVERFLOW_WRAPS (itype)))) { /* Split the unconverted operand and try to prove that wrapping isn't a problem. */ but I fear this will have quite some negative impact on dependence analysis. I'm still not sure I have the issue nailed down properly :/