On Thu, 22 Mar 2018, Jakub Jelinek wrote: > Hi! > > Something I wasn't really aware, apparently we allow extern vars with > incomplete types in "m" and "=m" constrained asm. The problem is that > incomplete vars have VOIDmode mode and so their MEMs do as well, apparently > everything works with it except a 2013-ish assert in alias.c. > > The following patch just makes sure x_mode is not VOIDmode if x doesn't have > VOIDmode, if x has VOIDmode, then it is fine for x_mode to be VOIDmode too. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. The question now is whether we handle dependences correctly for VOIDmode MEMs? Do they have !MEM_SIZE_KNOWN_P? Thanks, Richard. > 2018-03-22 Jakub Jelinek <ja...@redhat.com> > > PR inline-asm/85022 > * alias.c (write_dependence_p): Don't require for x_canonicalized > non-VOIDmode if x has VOIDmode. > > * c-c++-common/torture/pr85022.c: New test. > > --- gcc/alias.c.jj 2018-03-01 11:29:06.725104754 +0100 > +++ gcc/alias.c 2018-03-22 10:35:15.649546027 +0100 > @@ -2999,7 +2999,8 @@ write_dependence_p (const_rtx mem, > int ret; > > gcc_checking_assert (x_canonicalized > - ? (x_addr != NULL_RTX && x_mode != VOIDmode) > + ? (x_addr != NULL_RTX > + && (x_mode != VOIDmode || GET_MODE (x) == VOIDmode)) > : (x_addr == NULL_RTX && x_mode == VOIDmode)); > > if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem)) > --- gcc/testsuite/c-c++-common/torture/pr85022.c.jj 2018-03-22 > 10:44:40.520679173 +0100 > +++ gcc/testsuite/c-c++-common/torture/pr85022.c 2018-03-22 > 10:44:29.550675460 +0100 > @@ -0,0 +1,9 @@ > +/* PR inline-asm/85022 */ > + > +extern struct B b; > + > +void > +foo () > +{ > + __asm ("" : "+m" (b)); > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)