summaryrefslogtreecommitdiff
path: root/gcc/bb-reorder.c
diff options
context:
space:
mode:
authorAlexander Monakov <amonakov@ispras.ru>2018-09-03 19:55:05 +0300
committerAlexander Monakov <amonakov@gcc.gnu.org>2018-09-03 19:55:05 +0300
commit64979e04afabef10adfce819b9955dd8ae6c2fbe (patch)
treef3eabcf353766734feceb7ca5e4c92b1eefbd14f /gcc/bb-reorder.c
parentd2391983fc709bf83e3d10e00de7e06ad25464ca (diff)
downloadgcc-64979e04afabef10adfce819b9955dd8ae6c2fbe.tar.gz
bb-reorder: convert to gcc_stablesort
* bb-reorder.c (edge_order): Convert to C-qsort-style tri-state comparator. (reorder_basic_blocks_simple): Change std::stable_sort to gcc_stablesort. From-SVN: r264068
Diffstat (limited to 'gcc/bb-reorder.c')
-rw-r--r--gcc/bb-reorder.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c
index 57edde62c62..e20df160723 100644
--- a/gcc/bb-reorder.c
+++ b/gcc/bb-reorder.c
@@ -91,7 +91,6 @@
*/
#include "config.h"
-#define INCLUDE_ALGORITHM /* stable_sort */
#include "system.h"
#include "coretypes.h"
#include "backend.h"
@@ -2351,13 +2350,20 @@ reorder_basic_blocks_software_trace_cache (void)
FREE (bbd);
}
-/* Return true if edge E1 is more desirable as a fallthrough edge than
- edge E2 is. */
+/* Order edges by execution frequency, higher first. */
-static bool
-edge_order (edge e1, edge e2)
+static int
+edge_order (const void *ve1, const void *ve2)
{
- return e1->count () > e2->count ();
+ edge e1 = *(const edge *) ve1;
+ edge e2 = *(const edge *) ve2;
+ profile_count c1 = e1->count ();
+ profile_count c2 = e2->count ();
+ /* Since profile_count::operator< does not establish a strict weak order
+ in presence of uninitialized counts, use 'max': this makes them appear
+ as if having execution frequency less than any initialized count. */
+ profile_count m = c1.max (c2);
+ return (m == c2) - (m == c1);
}
/* Reorder basic blocks using the "simple" algorithm. This tries to
@@ -2410,7 +2416,7 @@ reorder_basic_blocks_simple (void)
all edges are equally desirable. */
if (optimize_function_for_speed_p (cfun))
- std::stable_sort (edges, edges + n, edge_order);
+ gcc_stablesort (edges, n, sizeof *edges, edge_order);
/* Now decide which of those edges to make fallthrough edges. We set
BB_VISITED if a block already has a fallthrough successor assigned