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?

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

Reply via email to