From: Jakub Jelinek Date: Mon, 25 Jun 2018 17:51:44 +0000 (+0200) Subject: backport: re PR c++/85659 (ICE with inline assembly inside virtual function) X-Git-Tag: releases/gcc-6.5.0~187 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5565ecd255f26a1ea126ef716b8c1712ec12825e;p=thirdparty%2Fgcc.git backport: re PR c++/85659 (ICE with inline assembly inside virtual function) Backported from mainline 2018-05-06 Jakub Jelinek 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: r262098 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6bafb746d894..7d162fbcaa42 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,13 @@ 2018-06-25 Jakub Jelinek Backported from mainline + 2018-05-06 Jakub Jelinek + + 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-04-17 Jakub Jelinek PR rtl-optimization/85431 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index b612293b1a7a..2163bddbbd55 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2974,14 +2974,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); @@ -2990,7 +2990,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 92d3b5aaeb35..b9d590446fc3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,13 @@ 2018-06-25 Jakub Jelinek Backported from mainline + 2018-05-06 Jakub Jelinek + + 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-04-10 Jakub Jelinek PR rtl-optimization/85300 diff --git a/gcc/testsuite/g++.dg/ext/asm14.C b/gcc/testsuite/g++.dg/ext/asm14.C new file mode 100644 index 000000000000..f7f61aabd93d --- /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 000000000000..c4946ddc5367 --- /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 000000000000..565cbb33e5f6 --- /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 "" } +}