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.