https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121829
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #3)
> I belive it's redirect_edge_and_branch called from split_edge done during
> vectorizer peeling. We are splitting the loop entry edge which produces
> the label copy and then we remove the (temporary) forwarder again with
>
> /* And remove the non-necessary forwarder again. Keep the other
> one so we have a proper pre-header for the loop at the exit edge.
> */
> redirect_edge_pred (single_succ_edge (preheader),
> single_pred (preheader));
> delete_basic_block (preheader);
>
> which does not adjust the branch (it's a forwarder, so no branch stmt ... in
> theory).
Oh, and we do it this way because it preserves PHI node args at the loop
header nicely while
redirect_edge_and_branch_force (single_pred_edge (preheader),
single_succ (preheader));
does not and requires extra work. It _does_ adjust the asm() goto label
correctly though.