]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix latent bug in loop header copying which forgets to update the loop header pointer
authorJan Hubicka <jh@suse.cz>
Fri, 21 Apr 2023 13:53:21 +0000 (15:53 +0200)
committerJan Hubicka <jh@suse.cz>
Fri, 21 Apr 2023 13:54:06 +0000 (15:54 +0200)
gcc/ChangeLog:

2023-04-21  Jan Hubicka  <hubicka@ucw.cz>
    Ondrej Kubanek  <kubanek0ondrej@gmail.com>

* tree-ssa-loop-ch.cc (ch_base::copy_headers): Update loop header and
latch.

gcc/tree-ssa-loop-ch.cc

index ddf025c0cfdd0b421df7faed0f943897be5829e8..560df39893ef3db48ac72f570773fe8cf0647575 100644 (file)
@@ -542,6 +542,17 @@ ch_base::copy_headers (function *fun)
            }
        }
 
+      /* Update header of the loop.  */
+      loop->header = header;
+      /* Find correct latch.  We only duplicate chain of conditionals so
+        there should be precisely two edges to the new header.  One entry
+        edge and one to latch.  */
+      FOR_EACH_EDGE (e, ei, loop->header->preds)
+       if (header != e->src)
+         {
+           loop->latch = e->src;
+           break;
+         }
       /* Ensure that the latch and the preheader is simple (we know that they
         are not now, since there was the loop exit condition.  */
       split_edge (loop_preheader_edge (loop));
@@ -561,6 +572,8 @@ ch_base::copy_headers (function *fun)
 
   if (changed)
     {
+      if (flag_checking)
+       verify_loop_structure ();
       update_ssa (TODO_update_ssa);
       /* After updating SSA form perform CSE on the loop header
         copies.  This is esp. required for the pass before