re PR middle-end/89412 (gcc ICE in simplify_subreg, at simplify-rtx.c:6273 on i686-linux-gnu)

PR middle-end/89412
	* expr.c (expand_assignment): If result is a MEM, use change_address
	instead of simplify_gen_subreg.

	* gcc.c-torture/compile/pr89412.c: New test.

From-SVN: r269057
This commit is contained in:
Jakub Jelinek 2019-02-21 00:02:29 +01:00 committed by Jakub Jelinek
parent cd56fb7957
commit 37d7267f80
4 changed files with 34 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2019-02-20 Jakub Jelinek <jakub@redhat.com>
PR middle-end/89412
* expr.c (expand_assignment): If result is a MEM, use change_address
instead of simplify_gen_subreg.
2019-02-20 Jakub Jelinek <jakub@redhat.com>
David Malcolm <dmalcolm@redhat.com>

View File

@ -5211,7 +5211,11 @@ expand_assignment (tree to, tree from, bool nontemporal)
}
else
{
rtx from_rtx
rtx from_rtx;
if (MEM_P (result))
from_rtx = change_address (result, to_mode, NULL_RTX);
else
from_rtx
= simplify_gen_subreg (to_mode, result,
TYPE_MODE (TREE_TYPE (from)), 0);
if (from_rtx)

View File

@ -1,3 +1,8 @@
2019-02-20 Jakub Jelinek <jakub@redhat.com>
PR middle-end/89412
* gcc.c-torture/compile/pr89412.c: New test.
2019-02-20 Jakub Jelinek <jakub@redhat.com>
David Malcolm <dmalcolm@redhat.com>

View File

@ -0,0 +1,16 @@
/* PR middle-end/89412 */
struct S { double a, b; } d;
int e;
double f;
void
foo ()
{
_Complex double h;
while (e)
{
f = h;
*(struct S *) &h = d;
}
}