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)

Reply via email to