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]

Reply via email to