https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67778

--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
But it is shrink-wrapping that inserts the prologue into the loop.
Before pro_and_epilogue we have cfg like:

     ENTRY
       |
      bb2
     /   \
    v     v<----+
   bb3    bb4    \
    |      \      \
    v<+     \      \
   bb5 \     \      \
  /  \  \     \      \
 v<+  v  \     \      \
bb6|  bb7 |     \      \
 | |  / \ |     |      |
 +-+  | +-+     |      |
      v         |      |
     bb8        |      |
      |         v      |
      +-------> bb9    |
                / \    |
               v   +---+
              bb10
               |
               v
              EXIT

and the only bb that needs prologue is bb10.
The changes that pro_and_epilogue pass does are:
1) the bb4 -> bb9 edge, previously DFS_BACK,IRREDUCIBLE_LOOP, looses both of
those flags
2) prologue is inserted at the beginning of bb9
3) epilogue (ending with (simple_return) is inserted at the end of bb10
4) a barrier is inserted after that (simple_return)
I don't see any other changes.  Please have a look at the dumps.

Multiple paths to the same bb having different CFI info are a direct
consequence of this bug, because bb9 is then reachable from the CFI info at the
beginning of function (when reached from bb8 or bb2->bb4) and CFI info after
prologue (when reached from bb9->bb4).  What code in the shrink-wrapping bb
discovery rewrite is supposed to make sure that the prologue is not put into
the middle of a loop?

Reply via email to