duplicate_loop_body_to_header_edge redirects the original loop entry edge to the loop copy header and the copied loop exit to the old loop header. But it does so in the order that requires temporary space for an extra edge on the original loop header, causing unnecessary re-allocations. The following avoids this by swapping the order of the redirects.
Bootstrapped and tested on x86_64-unknown-linux-gnu. This originally surfaced with the location_t work which effectively changed PHI allocations and thus made some passes unexpectedly get their PHI nodes re-allocated when calling loop_version. Mitigation for this was provided which might or might not be completely resolved by this (the vectorizer change is, as far as my testing goes). Pushed to trunk. I don't plan to revert the location_t changes in this area though, not at this stage at least. Richard. * cfgloopmanip.cc (duplicate_loop_body_to_header_edge): When copying to the header edge first redirect the entry to the new loop and then the exit to the old to avoid PHI node re-allocation. --- gcc/cfgloopmanip.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/cfgloopmanip.cc b/gcc/cfgloopmanip.cc index 534e556e1e4..17bcf9f4acc 100644 --- a/gcc/cfgloopmanip.cc +++ b/gcc/cfgloopmanip.cc @@ -1447,9 +1447,9 @@ duplicate_loop_body_to_header_edge (class loop *loop, edge e, } else { + redirect_edge_and_branch_force (e, new_bbs[0]); redirect_edge_and_branch_force (new_spec_edges[SE_LATCH], loop->header); - redirect_edge_and_branch_force (e, new_bbs[0]); set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], e->src); e = new_spec_edges[SE_LATCH]; } -- 2.43.0