[store-merging] Use store order as tie-breaker in sort_by_bitpos

Message ID 59B92C58.6070204@foss.arm.com
State New
Headers show
Series
  • [store-merging] Use store order as tie-breaker in sort_by_bitpos
Related show

Commit Message

Kyrill Tkachov Sept. 13, 2017, 1:02 p.m.
Hi all,

As Alexander pointed out in the thread starting at [1] the 
sort_by_bitpos sorting function
was behaving badly when we had multiple stores at the same position.  He 
fixed that (thanks!)
but we can do better by not returning zero when the bitpositions are 
equal but by falling back
to comparing the order the stores appear in, which is guaranteed to be 
unique (barring other
bugs elsewhere).

This patch does that.

Bootstrapped and tested on aarch64-none-linux-gnu.

Ok for trunk?

Thanks,
Kyrill

[1] https://gcc.gnu.org/ml/gcc-patches/2017-07/msg00895.html

2017-09-13  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

     * gimple-ssa-store-merging.c (sort_by_bitpos): Compare store order
     when bitposition is the same.

Comments

Richard Biener Sept. 13, 2017, 1:44 p.m. | #1
On Wed, Sep 13, 2017 at 3:02 PM, Kyrill  Tkachov
<kyrylo.tkachov@foss.arm.com> wrote:
> Hi all,
>
> As Alexander pointed out in the thread starting at [1] the sort_by_bitpos
> sorting function
> was behaving badly when we had multiple stores at the same position.  He
> fixed that (thanks!)
> but we can do better by not returning zero when the bitpositions are equal
> but by falling back
> to comparing the order the stores appear in, which is guaranteed to be
> unique (barring other
> bugs elsewhere).
>
> This patch does that.
>
> Bootstrapped and tested on aarch64-none-linux-gnu.
>
> Ok for trunk?

Ok.

Richard.

> Thanks,
> Kyrill
>
> [1] https://gcc.gnu.org/ml/gcc-patches/2017-07/msg00895.html
>
> 2017-09-13  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
>
>     * gimple-ssa-store-merging.c (sort_by_bitpos): Compare store order
>     when bitposition is the same.

Patch

diff --git a/gcc/gimple-ssa-store-merging.c b/gcc/gimple-ssa-store-merging.c
index c60d56a..3260c56 100644
--- a/gcc/gimple-ssa-store-merging.c
+++ b/gcc/gimple-ssa-store-merging.c
@@ -521,7 +521,9 @@  sort_by_bitpos (const void *x, const void *y)
   else if ((*tmp)->bitpos > (*tmp2)->bitpos)
     return 1;
   else
-    return 0;
+    /* If they are the same let's use the order which is guaranteed to
+       be different.  */
+    return (*tmp)->order - (*tmp2)->order;
 }
 
 /* Sorting function for store_immediate_info objects.