re PR c++/85659 (ICE with inline assembly inside virtual function)
authorJakub Jelinek <jakub@redhat.com>
Sun, 6 May 2018 21:14:35 +0000 (23:14 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 6 May 2018 21:14:35 +0000 (23:14 +0200)
PR c++/85659
* cfgexpand.c (expand_asm_stmt): Don't create a temporary if
the type is addressable.  Don't force op into register if it has
BLKmode.

* g++.dg/ext/asm14.C: New test.
* g++.dg/ext/asm15.C: New test.
* g++.dg/ext/asm16.C: New test.

From-SVN: r259981

gcc/ChangeLog
gcc/cfgexpand.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/asm14.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/asm15.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/asm16.C [new file with mode: 0644]

index f16a220efcc93fc12247dfb8974ea1148057e809..d4623313b164d3986a6395d8127cb82f96a8b7af 100644 (file)
@@ -1,3 +1,10 @@
+2018-05-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/85659
+       * cfgexpand.c (expand_asm_stmt): Don't create a temporary if
+       the type is addressable.  Don't force op into register if it has
+       BLKmode.
+
 2018-05-05  Roland McGrath  <mcgrathr@google.com>
 
        PR other/77609
index deab9296001aa1350c62c6543261015fcf123819..ff2f4074df2867bb9ded0936d20ec30355f2f7a1 100644 (file)
@@ -3044,14 +3044,14 @@ expand_asm_stmt (gasm *stmt)
 
       generating_concat_p = 0;
 
-      if ((TREE_CODE (val) == INDIRECT_REF
-          && allows_mem)
+      if ((TREE_CODE (val) == INDIRECT_REF && allows_mem)
          || (DECL_P (val)
              && (allows_mem || REG_P (DECL_RTL (val)))
              && ! (REG_P (DECL_RTL (val))
                    && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type)))
          || ! allows_reg
-         || is_inout)
+         || is_inout
+         || TREE_ADDRESSABLE (type))
        {
          op = expand_expr (val, NULL_RTX, VOIDmode,
                            !allows_reg ? EXPAND_MEMORY : EXPAND_WRITE);
@@ -3060,7 +3060,7 @@ expand_asm_stmt (gasm *stmt)
 
          if (! allows_reg && !MEM_P (op))
            error ("output number %d not directly addressable", i);
-         if ((! allows_mem && MEM_P (op))
+         if ((! allows_mem && MEM_P (op) && GET_MODE (op) != BLKmode)
              || GET_CODE (op) == CONCAT)
            {
              rtx old_op = op;
index 2de621f3083682d14162c5f053f2bbb552f8013b..ce19dfb6cf04b78f60f86a3806e4b310063749da 100644 (file)
@@ -1,3 +1,10 @@
+2018-05-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/85659
+       * g++.dg/ext/asm14.C: New test.
+       * g++.dg/ext/asm15.C: New test.
+       * g++.dg/ext/asm16.C: New test.
+
 2018-05-06  Michael Eager  <eager@eagercon.com>
 
        * gcc.target/microblaze/others/picdtr.c: Correct option
diff --git a/gcc/testsuite/g++.dg/ext/asm14.C b/gcc/testsuite/g++.dg/ext/asm14.C
new file mode 100644 (file)
index 0000000..f7f61aa
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/85659
+// { dg-do compile }
+
+struct S { S (); ~S (); int s; };
+
+void
+foo (S &s)
+{
+  __asm volatile ("" : "+m,r" (s) : : "memory");
+}
diff --git a/gcc/testsuite/g++.dg/ext/asm15.C b/gcc/testsuite/g++.dg/ext/asm15.C
new file mode 100644 (file)
index 0000000..c4946dd
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/85659
+// { dg-do compile }
+
+struct S { S (); ~S (); int s; };
+
+void
+foo (S &s)
+{
+  __asm volatile ("" : "+r" (s) : : "memory"); // { dg-error "" }
+}
diff --git a/gcc/testsuite/g++.dg/ext/asm16.C b/gcc/testsuite/g++.dg/ext/asm16.C
new file mode 100644 (file)
index 0000000..565cbb3
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/85659
+// { dg-do compile }
+
+struct S { S (); ~S (); int s[64]; } s;
+
+void
+foo ()
+{
+  __asm volatile ("" : "=r" (s) : : "memory"); // { dg-error "" }
+}