https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81409
--- Comment #1 from Marc Glisse <glisse at gcc dot gnu.org> --- The most obvious thing I notice is <bb 6> [100.00%] [count: INV]: # it$_M_current_23 = PHI <it$_M_current_41(5), _27(7)> _20 = _7 == it$_M_current_23; _5 = _20 | _53; if (_5 != 0) goto <bb 9>; [7.36%] [count: INV] else goto <bb 7>; [92.64%] [count: INV] <bb 7> [92.60%] [count: INV]: _27 = it$_M_current_23 + 4; if (_7 != _27) goto <bb 8>; [3.75%] [count: INV] else goto <bb 6>; [96.25%] [count: INV] where 7 -> 6 means that _7 == _27 == it$_M_current_23 so _5 != 0 has to be true. However, we do not thread that (at thread4 time, we go from 7 to 12 (empty latch) to 6 instead of directly to 6).