re PR c++/85659 (ICE with inline assembly inside virtual function)

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
This commit is contained in:
Jakub Jelinek 2018-05-06 23:14:35 +02:00 committed by Jakub Jelinek
parent a9856a8d08
commit d5754d94e4
6 changed files with 48 additions and 4 deletions

View 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

View 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;

View 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

View file

@ -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");
}

View file

@ -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 "" }
}

View file

@ -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 "" }
}