http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55833



--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> 2013-01-10 
15:02:37 UTC ---

By unswitching on an exit test that exits to the enclosing loop we create

an unswitched loop that is now reached by what looks like an exit test

of the outer loop which is part of an irreducible region.



I'm not sure we can reliably detect all cases we need to manually mark

the entry edge for.  So ... re-mark_irreducible_loops () after each

transform?



And cheaper checking by



Index: loop-unswitch.c

===================================================================

--- loop-unswitch.c     (revision 195085)

+++ loop-unswitch.c     (working copy)

@@ -145,12 +145,7 @@ unswitch_loops (void)

   /* Go through inner loops (only original ones).  */



   FOR_EACH_LOOP (li, loop, LI_ONLY_INNERMOST)

-    {

-      unswitch_single_loop (loop, NULL_RTX, 0);

-#ifdef ENABLE_CHECKING

-      verify_loop_structure ();

-#endif

-    }

+    unswitch_single_loop (loop, NULL_RTX, 0);



   iv_analysis_done ();

 }

@@ -370,6 +365,10 @@ unswitch_single_loop (struct loop *loop,

   nloop = unswitch_loop (loop, bbs[i], copy_rtx_if_shared (cond), cinsn);

   gcc_assert (nloop);



+#ifdef ENABLE_CHECKING

+  verify_loop_structure ();

+#endif

+

   /* Invoke itself on modified loops.  */

   unswitch_single_loop (nloop, rconds, num + 1);

   unswitch_single_loop (loop, conds, num + 1);

Reply via email to