Hi,
Ondrej Kubanek implemented profiling of loop histograms which sould be useful 
to improve
i.e. quality of loop peeling of verctorization.  However it turns out that most 
of histograms
are lost on the way from profiling to loop peeling pass (about 90%).  One 
common case is the
following latent bug in loop header copying which forgets to update the loop 
header pointer.

Curiously enough it does work to make single latch and preheader edge by 
splitting basic blocks
but it works with wrong edge.  As a consequence every loop where loop header 
was copied is
removed from loop tree and inserted again losing all metadata included.

Patch correctly updates the loop structure and also add verification
that the loop tree is OK after all transforms which is failing without
the patch.

Bootstrapped/regtested x86_64-linux, plan to insteall this as obvious.

diff --git a/gcc/tree-ssa-loop-ch.cc b/gcc/tree-ssa-loop-ch.cc
index 6b332719411..2c56b3b3c31 100644
--- a/gcc/tree-ssa-loop-ch.cc
+++ b/gcc/tree-ssa-loop-ch.cc
@@ -557,6 +557,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));
@@ -583,6 +594,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
  • Fix loop-ch Jan Hubicka via Gcc-patches

Reply via email to