aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-05-06 23:14:35 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-05-06 23:14:35 +0200
commitd5754d94e47e277a761715da3d3b93158cf179d9 (patch)
tree35adf5c4a8fa97f31b1ab2760eff5ca61a459d81
parenta9856a8d08902b1c11a730217a97302a92965996 (diff)
downloadgcc-d5754d94e47e277a761715da3d3b93158cf179d9.zip
gcc-d5754d94e47e277a761715da3d3b93158cf179d9.tar.gz
gcc-d5754d94e47e277a761715da3d3b93158cf179d9.tar.bz2
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cfgexpand.c8
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/ext/asm14.C10
-rw-r--r--gcc/testsuite/g++.dg/ext/asm15.C10
-rw-r--r--gcc/testsuite/g++.dg/ext/asm16.C10
6 files changed, 48 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f16a220..d462331 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index deab929..ff2f407 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2de621f..ce19dfb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..f7f61aa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/asm14.C
@@ -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
index 0000000..c4946dd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/asm15.C
@@ -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
index 0000000..565cbb3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/asm16.C
@@ -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 "" }
+}