This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[CFG] Dominator updating patch
- From: Zdenek Dvorak <rakdver at atrey dot karlin dot mff dot cuni dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Cc: gcc-pdo at atrey dot karlin dot mff dot cuni dot cz
- Date: Thu, 28 Feb 2002 22:03:39 +0100
- Subject: [CFG] Dominator updating patch
Hello.
This patch fixes bug in updating dominators in try_remove_path.
Zdenek
Changelog:
* loop-new.c (try_remove_path) Fix updating dominators.
Index: loop-new.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/loop-new.c,v
retrieving revision 1.1.2.5
diff -c -3 -p -r1.1.2.5 loop-new.c
*** loop-new.c 2002/02/25 16:50:24 1.1.2.5
--- loop-new.c 2002/02/28 20:27:02
*************** try_remove_path (loops, loop, e)
*** 740,763 ****
edge e;
{
edge ae;
! basic_block *rem_bbs, *dom_bbs, from;
! int i, nrem, n_dom_bbs;
/* First identify the branch. */
nrem = find_branch (e, loops->cfg.dom, loop, &rem_bbs);
/* Check whether we would not create unreachable blocks and whether
! we would be able to recount dominators. */
for (i = 0; i < nrem; i++)
for (ae = rem_bbs[i]->succ; ae; ae = ae->succ_next)
{
basic_block dom_bb;
if (flow_bb_inside_loop_p (loop, ae->dest))
continue;
dom_bb = get_immediate_dominator (loops->cfg.dom, ae->dest);
if (flow_bb_inside_loop_p (loop, dom_bb))
{
free (rem_bbs);
return 0;
}
}
--- 740,767 ----
edge e;
{
edge ae;
! basic_block *rem_bbs, *dom_bbs, from, *border_bbs;
! int i, nrem, n_dom_bbs, n_border_bbs;
/* First identify the branch. */
nrem = find_branch (e, loops->cfg.dom, loop, &rem_bbs);
/* Check whether we would not create unreachable blocks and whether
! we would be able to recount dominators. Also remember border blocks. */
! border_bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
! n_border_bbs = 0;
for (i = 0; i < nrem; i++)
for (ae = rem_bbs[i]->succ; ae; ae = ae->succ_next)
{
basic_block dom_bb;
if (flow_bb_inside_loop_p (loop, ae->dest))
continue;
+ border_bbs[n_border_bbs++] = ae->dest;
dom_bb = get_immediate_dominator (loops->cfg.dom, ae->dest);
if (flow_bb_inside_loop_p (loop, dom_bb))
{
free (rem_bbs);
+ free (border_bbs);
return 0;
}
}
*************** try_remove_path (loops, loop, e)
*** 772,777 ****
--- 776,785 ----
n_dom_bbs = get_dominated_by (loops->cfg.dom, from, &dom_bbs);
iterate_fix_dominators (loops->cfg.dom, dom_bbs, n_dom_bbs, 1);
free (dom_bbs);
+
+ /* Recount dominators for border bbs. */
+ iterate_fix_dominators (loops->cfg.dom, border_bbs, n_border_bbs, 0);
+ free (border_bbs);
/* Fix loop placement. */
fix_loop_placement (loop);