+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
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);
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;
+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
--- /dev/null
+// PR c++/85659
+// { dg-do compile }
+
+struct S { S (); ~S (); int s; };
+
+void
+foo (S &s)
+{
+ __asm volatile ("" : "+m,r" (s) : : "memory");
+}
--- /dev/null
+// PR c++/85659
+// { dg-do compile }
+
+struct S { S (); ~S (); int s; };
+
+void
+foo (S &s)
+{
+ __asm volatile ("" : "+r" (s) : : "memory"); // { dg-error "" }
+}
--- /dev/null
+// PR c++/85659
+// { dg-do compile }
+
+struct S { S (); ~S (); int s[64]; } s;
+
+void
+foo ()
+{
+ __asm volatile ("" : "=r" (s) : : "memory"); // { dg-error "" }
+}