https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92883
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jamborm at gcc dot gnu.org --- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Note, qux is passing through the argument to quux (after it has been determined that d after early inlining has [0, 1] range and thus d & 2 is always 0): # RANGE [0, 4294967295] NONZERO 4294967295 _2 = (long unsigned int) e.3_1; qux (_2); ... qux (long unsigned int g) { long unsigned int g_5(D) = g; long unsigned int _1; ... <bb 2> [local count: 1073741824]: if (g_5(D) != 0) goto <bb 3>; [33.00%] ... # RANGE [1, 18446744073709551615] _1 = g_5(D); e.5_2 = e; e.6_3 = (int) e.5_2; quux (e.6_3, _1); so I'd expect an intersection between the [0, 4294967295] range and [1, 18446744073709551615], yielding [1, 4294967295], but instead it intersects [0, 4294967295] with the pointer-ish unrelated ~[0B, 0B] where the effect is actually the same. I think the #c3 patch is fairly obviously correct, but there is still the question if there isn't something else broken too.