https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124809

--- Comment #8 from Andrew Macleod <amacleod at redhat dot com> ---
ick.   We don't remove relations once they are added. Never been a need.

IN this program we have:


   a.0_1 = a;
  _2 = (int) a.0_1;
  _3 = (int) g_16(D);
  _4 = _2 != _3;
  _20 = (short unsigned int) _4;
  if (a.0_1 != _20)
    goto <bb 4>; [5.50%]
  else
    goto <bb 6>; [94.50%]

  <bb 4> [local count: 55807731]:
  j_18 = a.0_1 + _20;
  k_19 = (int) j_18;
  if (a.0_1 == 0)
    goto <bb 5>; [50.00%]
  else
    goto <bb 11>; [50.00%]

  <bb 5> [local count: 27903866]:
  _21 = k_19 >> _2;
  goto <bb 11>; [100.00%]

  <bb 6> [local count: 958878295]:

      <<--- Partial equivalence
  if (d.10_9 != 0)
    goto <bb 7>; [50.00%]
  else
    goto <bb 8>; [50.00%]

at some point we register a partial equivalence of 16 bits between a.6_5 and
a.0_1
(Partial equivalences are also used between values of the same precision but
with difference signs as it represents a 16 bit equivalence, not a value.)

DOM continues omn its merry way, and decides at some point that on the else
side of 
  if (a.0_1 != _20) 
 that a.0_1 == _20, and as thats the only way to reach bb6,  it rewrites that
statement
Optimizing block #6

1>>> STMT 1 = a.0_1 le_expr _20
1>>> STMT 1 = a.0_1 ge_expr _20
1>>> STMT 1 = a.0_1 eq_expr _20
1>>> STMT 0 = a.0_1 ne_expr _20
0>>> COPY a.0_1 = _20
Optimizing statement a.6_5 = (short int) a.0_1;
  Replaced 'a.0_1' with variable '_20'

The next time ranger processes that statement, it registers a partial (bit)
equivalence between 
  a.6_5 and _20
but we do NOT delete the previous one... which means we now think that there is
an equivalence between a.6_5, _20, and a.0_1
Which there is not.  Only one of those  equivalences with a.6_5 can exist. 
Either the old one needs to be deleted, or the new one not added.

I'm thinking about it...?

Reply via email to