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

Aldy Hernandez <aldyh at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |aldyh at gcc dot gnu.org

--- Comment #4 from Aldy Hernandez <aldyh at gcc dot gnu.org> ---
(In reply to Andrew Macleod from comment #3)
> 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?

The threader only looks at paths that end in a block with multiple exits:

 FOR_EACH_BB_FN (bb, m_fun)
    if (EDGE_COUNT (bb->succs) > 1)
      maybe_thread_block (bb);

so...a switch or a cond.

Reply via email to