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)

Reply via email to