https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102540
--- Comment #3 from Aldy Hernandez <aldyh at gcc dot gnu.org> --- To elide the foo(), _2 must be non-zero on the 2->3 edge dominating the call. Interestingly, a.0_1 is non-zero on the 2->3 edge, and we have: _2 = (unsigned int) a.0_1 but somehow we have no knowledge of _2. Andrew, wanna take a stab at this? =========== BB 2 ============ Imports: a.0_1 Exports: a.0_1 _6 c_10 _2 : a.0_1(I) _6 : a.0_1(I) c_10 : a.0_1(I) _6 Equivalence set : [] Equivalence set : [_6, c_10] <bb 2> : a.0_1 = a; _2 = (unsigned int) a.0_1; b = _2; _6 = a.0_1 & 4294967295; c_10 = _6; if (c_10 != 0) goto <bb 3>; [INV] else goto <bb 6>; [INV] _6 : long int [0, 4294967295] c_10 : long int [0, 4294967295] 2->3 (T) a.0_1 : long int [-INF, -1][1, +INF] 2->3 (T) _6 : long int [1, 4294967295] 2->3 (T) c_10 : long int [1, 4294967295] 2->6 (F) a.0_1 : long int [-INF, -4294967296][0, +INF] 2->6 (F) _6 : long int [0, 0] 2->6 (F) c_10 : long int [0, 0]