https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93281
--- Comment #1 from David Malcolm <dmalcolm at gcc dot gnu.org> --- These are all of the various: __analyzer_eval (q[-2].x == 107024); /* { dg-warning "TRUE" } */ __analyzer_eval (q[-2].y == 107025); /* { dg-warning "TRUE" } */ emitting UNKNOWN instead. The -m32 gimple has: _55 = q_92 + 4294967280; _56 = _55->x; _57 = _56 == 107024; _58 = (int) _57; __analyzer_eval (_58); whereas the -m64 gimple has: _55 = q_92 + 18446744073709551600; _56 = _55->x; _57 = _56 == 107024; _58 = (int) _57; __analyzer_eval (_58); Looks like somewhere below region_model::convert_byte_offset_to_array_index the 64-bit case reconstructs -2, whereas the 32-bit case doesn't.