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)