https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100512
--- Comment #4 from Aldy Hernandez <aldyh at gcc dot gnu.org> ---
After the mentioned commit, e_27(D) is considered undefined, and since
_3 is [0,0], e_26 folds to [0,0] and the PHI is marked for removal:
# e_26 = PHI <e_27(D)(2), _3(13)>
However, when propagating to the uses of e_26 (replace_uses_in) here:
if (e_26 != 0)
...value_of_expr() returns NULL, because get_non_stale_global_range()
considers the value of e_26 stale:
if (m_globals.get_global_range (r, name))
{
if (m_temporal->current_p (name))
return true;
}
The dependencies for e_26 are e_27 and _3, per the PHI, but _3 has a
later time stamp.
The full IL follows. Notice the interdependence between e_26 and _3.
void b ()
{
int16_t i;
uint64_t * f;
uint64_t e;
uint16_t d;
int16_t * c;
long unsigned int _3;
long int d.3_5;
short int _7;
int a.5_8;
int iftmp.4_11;
<bb 2> :
d = 2;
// predicted unlikely by goto predictor.
goto <bb 9>; [INV]
<bb 3> :
# e_25 = PHI <e_26(10)>
_3 = e_25 + 1;
if (_3 != 0)
goto <bb 4>; [INV]
else
goto <bb 9>; [INV]
<bb 4> :
goto <bb 4>; [INV]
<bb 5> :
d.3_5 = (long int) &d;
i_19 = (int16_t) d.3_5;
if (i_19 != 0)
goto <bb 6>; [INV]
else
goto <bb 7>; [INV]
<bb 6> :
if (e_26 != 0)
goto <bb 8>; [INV]
else
goto <bb 7>; [INV]
<bb 7> :
<bb 8> :
# iftmp.4_11 = PHI <1(6), 0(7)>
_7 = (short int) iftmp.4_11;
*c_22(D) = _7;
goto <bb 10>; [INV]
<bb 9> :
# e_26 = PHI <e_27(D)(2), _3(3)>
g:
<bb 10> :
a.5_8 = a;
if (a.5_8 != 0)
goto <bb 5>; [INV]
else
goto <bb 3>; [INV]
}