On Thu, 12 Jul 2018, Jakub Jelinek wrote:

> Hi!
> 
> The following testcase is a similar issue to PR84503 and the fix is similar,
> because coalesce_immediate_stores temporarily sorts the stores on ascending
> bitpos and if stores are merged, the merged store is emitted in the location
> of the latest of the stores, we need to verify that there is no overlap with
> other stores that are originally before that latest store from those we are
> considering and overlaps the set of stores we are considering to merge.
> In that case we need to punt and not merge (unless we do smarts like prove
> overlap between just some of the stores and force reordering).
> 
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk and 8.2?

OK.

Thanks,
Richard.

> 2018-07-11  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/86492
>       * gimple-ssa-store-merging.c
>       (imm_store_chain_info::coalesce_immediate_stores): Call
>       check_no_overlap even for the merge_overlapping case.  Formatting fix.
> 
>       * gcc.c-torture/execute/pr86492.c: New test.
> 
> --- gcc/gimple-ssa-store-merging.c.jj 2018-06-13 10:05:53.000000000 +0200
> +++ gcc/gimple-ssa-store-merging.c    2018-07-11 19:24:12.084120206 +0200
> @@ -2702,7 +2702,12 @@ imm_store_chain_info::coalesce_immediate
>       {
>         /* Only allow overlapping stores of constants.  */
>         if (info->rhs_code == INTEGER_CST
> -           && merged_store->stores[0]->rhs_code == INTEGER_CST)
> +           && merged_store->stores[0]->rhs_code == INTEGER_CST
> +           && check_no_overlap (m_store_info, i, INTEGER_CST,
> +                                MAX (merged_store->last_order, info->order),
> +                                MAX (merged_store->start
> +                                     + merged_store->width,
> +                                     info->bitpos + info->bitsize)))
>           {
>             merged_store->merge_overlapping (info);
>             goto done;
> @@ -2732,10 +2737,8 @@ imm_store_chain_info::coalesce_immediate
>             info->ops_swapped_p = true;
>           }
>         if (check_no_overlap (m_store_info, i, info->rhs_code,
> -                             MAX (merged_store->last_order,
> -                                  info->order),
> -                             MAX (merged_store->start
> -                                  + merged_store->width,
> +                             MAX (merged_store->last_order, info->order),
> +                             MAX (merged_store->start + merged_store->width,
>                                    info->bitpos + info->bitsize)))
>           {
>             /* Turn MEM_REF into BIT_INSERT_EXPR for bit-field stores.  */
> --- gcc/testsuite/gcc.c-torture/execute/pr86492.c.jj  2018-07-11 
> 19:40:27.760122514 +0200
> +++ gcc/testsuite/gcc.c-torture/execute/pr86492.c     2018-07-11 
> 19:40:13.460107841 +0200
> @@ -0,0 +1,34 @@
> +/* PR tree-optimization/86492 */
> +
> +union U
> +{
> +  unsigned int r;
> +  struct S
> +  {
> +    unsigned int a:12;
> +    unsigned int b:4;
> +    unsigned int c:16;
> +  } f;
> +};
> +
> +__attribute__((noipa)) unsigned int
> +foo (unsigned int x)
> +{
> +  union U u;
> +  u.r = 0;
> +  u.f.c = x;
> +  u.f.b = 0xe;
> +  return u.r;
> +}
> +
> +int
> +main ()
> +{
> +  union U u;
> +  if (__CHAR_BIT__ * __SIZEOF_INT__ != 32 || sizeof (u.r) != sizeof (u.f))
> +    return 0;
> +  u.r = foo (0x72);
> +  if (u.f.a != 0 || u.f.b != 0xe || u.f.c != 0x72)
> +    __builtin_abort ();
> +  return 0;
> +}
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to