summaryrefslogtreecommitdiff
path: root/gcc/domwalk.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-08-01 17:16:48 +0000
committerAlexander Monakov <amonakov@gcc.gnu.org>2019-08-01 20:16:48 +0300
commit51007dc16a71e1289546f92dfebbe4ef3026176c (patch)
treea25014d6b09ce6cc182aa8a51642201e04aaa246 /gcc/domwalk.c
parentce0454d9419dbcd73e65dae2a3eba15eeddbe338 (diff)
downloadgcc-51007dc16a71e1289546f92dfebbe4ef3026176c.tar.gz
domwalk: use gcc_sort_r
2019-08-01 Richard Biener <rguenther@suse.de> * domwalk.c (bb_postorder): Remove static variable. (cmp_bb_postorder): Adjust. (sort_bbs_postorder): Adjust and use gcc_sort_r. (dom_walker::walk): Adjust. From-SVN: r273978
Diffstat (limited to 'gcc/domwalk.c')
-rw-r--r--gcc/domwalk.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/gcc/domwalk.c b/gcc/domwalk.c
index 8c0fdecb462..42c5127695b 100644
--- a/gcc/domwalk.c
+++ b/gcc/domwalk.c
@@ -128,14 +128,12 @@ along with GCC; see the file COPYING3. If not see
which is currently an abstraction over walking tree statements. Thus
the dominator walker is currently only useful for trees. */
-/* Reverse postorder index of each basic block. */
-static int *bb_postorder;
-
static int
-cmp_bb_postorder (const void *a, const void *b)
+cmp_bb_postorder (const void *a, const void *b, void *data)
{
basic_block bb1 = *(const basic_block *)(a);
basic_block bb2 = *(const basic_block *)(b);
+ int *bb_postorder = (int *)data;
/* Place higher completion number first (pop off lower number first). */
return bb_postorder[bb2->index] - bb_postorder[bb1->index];
}
@@ -144,7 +142,7 @@ cmp_bb_postorder (const void *a, const void *b)
i.e. by descending number in BB_POSTORDER array. */
static void
-sort_bbs_postorder (basic_block *bbs, int n)
+sort_bbs_postorder (basic_block *bbs, int n, int *bb_postorder)
{
if (__builtin_expect (n == 2, true))
{
@@ -166,7 +164,7 @@ sort_bbs_postorder (basic_block *bbs, int n)
bbs[0] = bb0, bbs[1] = bb1, bbs[2] = bb2;
}
else
- qsort (bbs, n, sizeof *bbs, cmp_bb_postorder);
+ gcc_sort_r (bbs, n, sizeof *bbs, cmp_bb_postorder, bb_postorder);
}
/* Set EDGE_EXECUTABLE on every edge within FN's CFG. */
@@ -294,7 +292,6 @@ dom_walker::walk (basic_block bb)
basic_block *worklist = XNEWVEC (basic_block,
n_basic_blocks_for_fn (cfun) * 2);
int sp = 0;
- bb_postorder = m_bb_to_rpo;
while (true)
{
@@ -339,7 +336,8 @@ dom_walker::walk (basic_block bb)
if (sp - saved_sp > 1
&& m_dom_direction == CDI_DOMINATORS
&& m_bb_to_rpo)
- sort_bbs_postorder (&worklist[saved_sp], sp - saved_sp);
+ sort_bbs_postorder (&worklist[saved_sp], sp - saved_sp,
+ m_bb_to_rpo);
}
}
/* NULL is used to mark pop operations in the recursion stack. */
@@ -360,6 +358,5 @@ dom_walker::walk (basic_block bb)
else
break;
}
- bb_postorder = NULL;
free (worklist);
}