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

Andrew Macleod <amacleod at redhat dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |aldyh at redhat dot com

--- Comment #3 from Andrew Macleod <amacleod at redhat dot com> ---
in VRP2 we see:

 <bb 2> [local count: 1073741824]:
  _1 = (*a_6(D))[0];
  _2 = (*a_6(D))[1];
  pretmp_8 = (*a_6(D))[2];
  if (_1 < _2)
    goto <bb 3>; [50.00%]
  else
    goto <bb 5>; [50.00%]

  <bb 3> [local count: 536870913]:
  if (_2 < pretmp_8)
    goto <bb 4>; [0.00%]
  else
    goto <bb 5>; [100.00%]

  <bb 4> [count: 0]:
  __builtin_unreachable ();

  <bb 5> [local count: 1073741824]:
  _7 = _1 < pretmp_8;
  return _7;

There isnt much VRP can do about this because if we take the path 2->5, we have
no way of resolving _1 < pretmp_8 because the comparison has not been made yet.

interestingly, if this were to be threaded, 
2->3 would register _1 < _2
3->5 would register _2 >= ptrtmp_8
then in bb5'  _1 < pretmp_8 should be answered by the path oracle as TRUE and
then be folded to return true.  at least it should :-)

I guess the next question would be... why doesn't the threader think this is
worth threading?

Reply via email to