https://gcc.gnu.org/g:beb9073dcdf254ac3e3bffa25dbce714a9d537a6
commit r16-3716-gbeb9073dcdf254ac3e3bffa25dbce714a9d537a6 Author: Tamar Christina <tamar.christ...@arm.com> Date: Tue Sep 9 13:51:37 2025 +0100 Revert "tree-optimization/121829 - bogus CFG with asm goto" This reverts commit a632becefad29206a980cc080eee74ed808f9cd3. Diff: --- gcc/testsuite/gcc.dg/torture/pr121829.c | 21 --------------------- gcc/tree-vect-loop-manip.cc | 33 +++++++++++++++------------------ 2 files changed, 15 insertions(+), 39 deletions(-) diff --git a/gcc/testsuite/gcc.dg/torture/pr121829.c b/gcc/testsuite/gcc.dg/torture/pr121829.c deleted file mode 100644 index afcf7595a73d..000000000000 --- a/gcc/testsuite/gcc.dg/torture/pr121829.c +++ /dev/null @@ -1,21 +0,0 @@ -/* { dg-do compile } */ - -int a[1][1]; -int *b(int *); -int c() { - int *d[4]; - int **e = &d[3]; - int f; - for (; f; f++) - d[f] = &a[1][0]; - b(*e); -} -int *b(int *g) { - asm goto("" : : : : h); - int i[9]; -h: - int f; - for (f = 0; f < 9; f++) - i[f] = 1; - *g = i[4]; -} diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index 7af70a51335f..20141dbc2e54 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -1459,21 +1459,6 @@ get_live_virtual_operand_on_edge (edge e) while (1); } -/* Remove the single succ/pred forwarder block BB. */ - -static void -vect_remove_forwarder (basic_block bb) -{ - edge pred = single_pred_edge (bb); - edge succ = single_succ_edge (bb); - basic_block to = single_succ (bb); - edge e = redirect_edge_and_branch (pred, to); - gcc_assert (e == pred); - copy_phi_arg_into_existing_phi (succ, e); - delete_basic_block (bb); - set_immediate_dominator (CDI_DOMINATORS, to, pred->src); -} - /* Given LOOP this function generates a new copy of it and puts it on E which is either the entry or exit of LOOP. If SCALAR_LOOP is non-NULL, assume LOOP and SCALAR_LOOP are equivalent and copy the @@ -1873,7 +1858,11 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, /* 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. */ - vect_remove_forwarder (preheader); + redirect_edge_pred (single_succ_edge (preheader), + single_pred (preheader)); + delete_basic_block (preheader); + set_immediate_dominator (CDI_DOMINATORS, scalar_loop->header, + loop_preheader_edge (scalar_loop)->src); /* Finally after wiring the new epilogue we need to update its main exit to the original function exit we recorded. Other exits are already @@ -1931,7 +1920,11 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, if (scalar_loop != loop) { /* Remove the non-necessary forwarder of scalar_loop again. */ - vect_remove_forwarder (preheader); + redirect_edge_pred (single_succ_edge (preheader), + single_pred (preheader)); + delete_basic_block (preheader); + set_immediate_dominator (CDI_DOMINATORS, scalar_loop->header, + loop_preheader_edge (scalar_loop)->src); preheader = split_edge (loop_preheader_edge (loop)); entry_e = single_pred_edge (preheader); } @@ -1946,7 +1939,11 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, /* 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. */ - vect_remove_forwarder (new_preheader); + redirect_edge_pred (single_succ_edge (new_preheader), + single_pred (new_preheader)); + delete_basic_block (new_preheader); + set_immediate_dominator (CDI_DOMINATORS, new_loop->header, + loop_preheader_edge (new_loop)->src); /* Update dominators for multiple exits. */ if (multiple_exits_p)