shrink-wrap: Fix thinko (PR68520)
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 24 Nov 2015 21:23:25 +0000 (22:23 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 24 Nov 2015 21:23:25 +0000 (22:23 +0100)
Part of the shrink-wrapping algorithm has this comment:

  /* Now see if we can put the prologue at the start of PRO.  Putting it
     there might require duplicating a block that cannot be duplicated,
     or in some cases we cannot insert the prologue there at all.  If PRO
     wont't do, try again with the immediate dominator of PRO, and so on.

     The blocks that need duplicating are those reachable from PRO but
     not dominated by it.  We keep in BB_WITH a bitmap of the blocks
     reachable from PRO that we already found, and in VEC a stack of
     those we still need to consider (to find successors).  */

Two of the cases that push to that stack do not actually check the
bitmap first.  Either I thought those blocks could not be on the stack
already, or more likely I didn't think and it just didn't crash during
any testing.  But of course those blocks *can* already be on the stack
(if you have a hideous loop structure), and then we end up with the
same block on the stack more than once.  This is harmless, except that
(like in the PR) this can overflow the stack.

This fixes it, by doing the necessary bitmap checks before pushing.

PR rtl-optimization/68520
* shrink-wrap.c (try_shrink_wrapping): Don't push a block to VEC if
its bit was already set in BB_WITH.

From-SVN: r230843

gcc/ChangeLog
gcc/shrink-wrap.c

index b097f4ea71ecebb975ccff1ea6a884004f1fbfa4..6333faa94f3a22c771637d9766feee3b4959dcd4 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-24  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/68520
+       * shrink-wrap.c (try_shrink_wrapping): Don't push a block to VEC if
+       its bit was already set in BB_WITH.
+
 2015-11-24  Jan Hubicka  <hubicka@ucw.cz>
 
        * alias.c (get_alias_set): Before checking TYPE_ALIAS_SET_KNOWN_P
index 61765ff2cfbbe01a8ee37b02f8ee5606c420ef02..3a1df845e2089c1c70a18966e6b41a3cdfaa2895 100644 (file)
@@ -722,8 +722,8 @@ try_shrink_wrapping (edge *entry_edge, bitmap_head *bb_with,
        {
          pro = get_immediate_dominator (CDI_DOMINATORS, pro);
 
-         bitmap_set_bit (bb_with, pro->index);
-         vec.quick_push (pro);
+         if (bitmap_set_bit (bb_with, pro->index))
+           vec.quick_push (pro);
        }
 
       basic_block bb = vec.pop ();
@@ -734,8 +734,8 @@ try_shrink_wrapping (edge *entry_edge, bitmap_head *bb_with,
 
            pro = get_immediate_dominator (CDI_DOMINATORS, pro);
 
-           bitmap_set_bit (bb_with, pro->index);
-           vec.quick_push (pro);
+           if (bitmap_set_bit (bb_with, pro->index))
+             vec.quick_push (pro);
          }
 
       FOR_EACH_EDGE (e, ei, bb->succs)