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

--- Comment #3 from Andrew Macleod <amacleod at redhat dot com> ---
we now know the PHI is an equivalence when the other argument is UNDEFINED.:
    <bb 4> [local count: 268435456]:
    x_12 = i_8(D) + 1;

x_12 : int [3, +INF]

Equivalence set : [x_7, x_12]                <<--Equivalence marked   
    <bb 5> [local count: 805306367]:
    # x_7 = PHI <x_10(D)(2), x_12(4)>
    _4 = i_8(D) == 2;
    _5 = j_9(D) == 3;
    _15 = k_11(D) == 4;
    _21 = _5 & _15;
    _16 = _4 & _21;
    _17 = x_7 != 3;
    _18 = _16 & _17;
    if (_18 != 0)
      goto <bb 6>; [0.00%]
    else
      goto <bb 7>; [100.00%]

x_7 : int [3, +INF]
5->6  (T) _4 :  _Bool [1, 1]
5->6  (T) _5 :  _Bool [1, 1]
5->6  (T) x_7 :         int [4, +INF]
5->6  (T) i_8(D) :      int [2, 2]
5->6  (T) j_9(D) :      int [3, 3]

Whats missing is potentially recalculating equivalences on outgoing edges.
we know 
  1) i_8 has a range of [2,2] on the edge 5->6
  2) we know that x_7 and x_12 are equivalences
  3) we know that x_12 = i_8(D) + 1;
  4) We have the ability to recompute x_12 using i_8 on that edge, which would 
conclude x_12 = [3,3] on that edge.  We just don't know to ask that question
(yet).
  5) the equivalence set of x_12=[3, 3] and x_7=[4, +INF] are incompatible.
their intersection is EMPTY, which in turns means the edge is unexecutable.

This is demonstrated by the requirement that x_7 != 3 be true, as well as (x_7
== x_12 == [3,3]) at the same time.

The information is all there, we just need to figure out how best to use it.

Reply via email to