On Fri, Jan 09, 2015 at 10:36:09AM +0100, Richard Biener wrote: > I wonder why post_order_compute calls tidy_fallthru_edges at all - won't > that break the just computed postorder?
Dunno, but I think it shouldn't break anything, the function doesn't remove any blocks, just in the typical case of an unconditional jump to the next bb or conditional jump to the next bb (if only successor) removes the jump and makes the edge EDGE_FALLTHRU. > Other than that, why doesn't can't the issue show up with non-table-jumps? I think tablejumps are the only case where (at least during jump2) code_labels live in between the basic blocks, not inside of them. > What does it take to preserve (all) the labels? Then we'd need to remove all the instructions in between the two basic blocks (as we currently do), but move any code_labels from there first to the start of the next basic block. Probably better just call tablejump_p with non-NULL args and move precisely that code_label that it sets. But, as I said, we'd still not optimize it if tidy_fallthru_edges is not called, so we'd need to do it at another place too. Jakub