This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[CFG] Loop unswitching 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: Fri, 1 Mar 2002 00:19:39 +0100
- Subject: [CFG] Loop unswitching patch
Hello.
This patch enables removing of predictable paths for some more situations
(now that I've noticed that I must recount dominators the hard way anyway).
Zdenek
Changelog:
* loop-new.c (try_remove_path): Modified.
Index: loop-new.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/loop-new.c,v
retrieving revision 1.1.2.6
diff -c -3 -p -r1.1.2.6 loop-new.c
*** loop-new.c 2002/02/28 22:38:50 1.1.2.6
--- loop-new.c 2002/02/28 23:13:45
*************** try_remove_path (loops, loop, e)
*** 741,770 ****
{
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;
}
! }
/* OK. Remove the path. */
from = e->src;
--- 741,772 ----
{
edge ae;
basic_block *rem_bbs, *dom_bbs, from, *border_bbs;
! int i, j, 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. */
for (i = 0; i < nrem; i++)
! {
! n_dom_bbs = get_dominated_by (loops->cfg.dom, from, &dom_bbs);
! for (j = 0; j < n_dom_bbs; j++)
! if (!flow_bb_inside_loop_p (loop, dom_bbs[j]))
{
+ free (dom_bbs);
free (rem_bbs);
return 0;
}
! free (dom_bbs);
! }
!
! /* 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)
! if (!flow_bb_inside_loop_p (loop, ae->dest))
! border_bbs[n_border_bbs++] = ae->dest;
/* OK. Remove the path. */
from = e->src;