Some more symmetry fixes. These were detected manually (not via
automatic analysis by SortChecker)
so I've put them to a separate patch.
Cc-ing
* Alexandre for sel_rank_for_schedule
* Ben for cmp_modes
* Jakub for range_entry_cmp
* Richard for sort_bbs_in_loop_postorder_cmp,
sort_locs_in_loop_postorder_cmp, find_ref_loc_in_loop_cmp and
dr_group_sort_cmp
/Yury
>From 5716669d0b88265ee610ad139a0dc4152d1c20f3 Mon Sep 17 00:00:00 2001
From: Yury Gribov <tetra2...@gmail.com>
Date: Sat, 12 Dec 2015 10:27:45 +0300
Subject: [PATCH 2/5] Fix more asymmetric comparison functions.
2015-12-17 Yury Gribov <tetra2...@gmail.com>
* genmodes.c (cmp_modes): Make symmetric.
* sel-sched.c (sel_rank_for_schedule): Ditto.
* tree-ssa-loop-im.c (sort_bbs_in_loop_postorder_cmp):
(sort_locs_in_loop_postorder_cmp):
(find_ref_loc_in_loop_cmp): Check invariant.
* tree-ssa-reassoc.c (range_entry_cmp): Make symmetric.
* tree-vect-data-refs (dr_group_sort_cmp): Ditto.
---
gcc/genmodes.c | 6 ++++--
gcc/sel-sched.c | 4 +++-
gcc/tree-ssa-loop-im.c | 19 +++++++++++++++----
gcc/tree-ssa-reassoc.c | 8 +++-----
gcc/tree-vect-data-refs.c | 7 ++++---
5 files changed, 29 insertions(+), 15 deletions(-)
diff --git a/gcc/genmodes.c b/gcc/genmodes.c
index 15d62a0..f78a4da 100644
--- a/gcc/genmodes.c
+++ b/gcc/genmodes.c
@@ -813,8 +813,9 @@ cmp_modes (const void *a, const void *b)
{
if (m->counter < n->counter)
return -1;
- else
+ else if (m->counter > n->counter)
return 1;
+ return 0;
}
if (m->component->bytesize > n->component->bytesize)
@@ -829,8 +830,9 @@ cmp_modes (const void *a, const void *b)
if (m->counter < n->counter)
return -1;
- else
+ else if (m->counter > n->counter)
return 1;
+ return 0;
}
static void
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index aebc2d9..c6efe9b 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -3343,7 +3343,9 @@ sel_rank_for_schedule (const void *x, const void *y)
tmp2_insn = EXPR_INSN_RTX (tmp2);
/* Schedule debug insns as early as possible. */
- if (DEBUG_INSN_P (tmp_insn) && !DEBUG_INSN_P (tmp2_insn))
+ if (DEBUG_INSN_P (tmp_insn) && DEBUG_INSN_P (tmp2_insn))
+ return 0;
+ else if (DEBUG_INSN_P (tmp_insn))
return -1;
else if (DEBUG_INSN_P (tmp2_insn))
return 1;
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index 9b1b815..b53a490 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -1504,7 +1504,11 @@ sort_bbs_in_loop_postorder_cmp (const void *bb1_, const void *bb2_)
struct loop *loop2 = bb2->loop_father;
if (loop1->num == loop2->num)
return 0;
- return bb_loop_postorder[loop1->num] < bb_loop_postorder[loop2->num] ? -1 : 1;
+ gcc_assert(bb_loop_postorder[loop1->num] != bb_loop_postorder[loop2->num]);
+ if (bb_loop_postorder[loop1->num] < bb_loop_postorder[loop2->num])
+ return -1;
+ else
+ return 1;
}
/* qsort sort function to sort ref locs after their loop fathers postorder. */
@@ -1518,7 +1522,11 @@ sort_locs_in_loop_postorder_cmp (const void *loc1_, const void *loc2_)
struct loop *loop2 = gimple_bb (loc2->stmt)->loop_father;
if (loop1->num == loop2->num)
return 0;
- return bb_loop_postorder[loop1->num] < bb_loop_postorder[loop2->num] ? -1 : 1;
+ gcc_assert(bb_loop_postorder[loop1->num] != bb_loop_postorder[loop2->num]);
+ if (bb_loop_postorder[loop1->num] < bb_loop_postorder[loop2->num])
+ return -1;
+ else
+ return 1;
}
/* Gathers memory references in loops. */
@@ -1625,8 +1633,11 @@ find_ref_loc_in_loop_cmp (const void *loop_, const void *loc_)
if (loop->num == loc_loop->num
|| flow_loop_nested_p (loop, loc_loop))
return 0;
- return (bb_loop_postorder[loop->num] < bb_loop_postorder[loc_loop->num]
- ? -1 : 1);
+ gcc_assert(bb_loop_postorder[loop->num] != bb_loop_postorder[loc_loop->num]);
+ if (bb_loop_postorder[loop->num] < bb_loop_postorder[loc_loop->num])
+ return -1;
+ else
+ return 1;
}
/* Iterates over all locations of REF in LOOP and its subloops calling
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index e54700e..472c8b1 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -2018,11 +2018,9 @@ range_entry_cmp (const void *a, const void *b)
if (p->idx < q->idx)
return -1;
- else
- {
- gcc_checking_assert (p->idx > q->idx);
- return 1;
- }
+ else if (p->idx > q->idx)
+ return 1;
+ return 0;
}
/* Helper routine of optimize_range_test.
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 4c566c8..7755aaa 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -2643,9 +2643,10 @@ dr_group_sort_cmp (const void *dra_, const void *drb_)
/* Then sort after DR_INIT. In case of identical DRs sort after stmt UID. */
cmp = tree_int_cst_compare (DR_INIT (dra), DR_INIT (drb));
- if (cmp == 0)
- return gimple_uid (DR_STMT (dra)) < gimple_uid (DR_STMT (drb)) ? -1 : 1;
- return cmp;
+ if (cmp)
+ return cmp;
+
+ return gimple_uid (DR_STMT (dra)) - gimple_uid (DR_STMT (drb));
}
/* Function vect_analyze_data_ref_accesses.
--
1.9.1