https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104639
Aldy Hernandez <aldyh at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |amacleod at redhat dot com --- Comment #7 from Aldy Hernandez <aldyh at gcc dot gnu.org> --- FWIW, thread2 does thread everything that is threadable. That is, we thread 5->3->4 from this: <bb 3> [local count: 1073741824]: # i_1 = PHI <i_2(D)(2), 6(5)> if (i_1 == 4) goto <bb 5>; [89.00%] else goto <bb 4>; [11.00%] <bb 5> [local count: 955630224]: goto <bb 3>; [100.00%] into this: <bb 2> [local count: 118111600]: if (i_2(D) == 4) goto <bb 3>; [97.00%] else goto <bb 4>; [3.00%] <bb 3> [local count: 955630224]: # i_5 = PHI <6(2)> <bb 4> [local count: 118111600]: # i_6 = PHI <i_2(D)(2), i_5(3)> _3 = i_6 != 0; return _3; There are no more conditionals we can thread in the final form above. To my untrained eye, it does seem like phiopt should be able to optimize: <bb 4> [local count: 118111600]: # i_6 = PHI <i_2(D)(2), 6(3)> _3 = i_6 != 0; into: _3 = i_2 != 0; Then BB2 and BB3 can just be cleaned up as dead?