From 1004f0c5c83b9cffe17adbaabf935db8ab290911 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 11 Nov 2010 16:48:39 +0100 Subject: [PATCH] re PR middle-end/46388 (ICE in int_mode_for_mode, at stor-layout.c:493) PR middle-end/46388 * expr.c (expand_assignment): If to_rtx is a VOIDmode MEM, use BLKmode mode for it. (expand_expr_real_1): Similarly for op0. * gcc.c-torture/compile/pr46388.c: New test. From-SVN: r166603 --- gcc/ChangeLog | 7 +++++ gcc/expr.c | 30 ++++++++++++------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/compile/pr46388.c | 14 +++++++++ 4 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr46388.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1d686e95963..1888e2fed08 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-11-11 Jakub Jelinek + + PR middle-end/46388 + * expr.c (expand_assignment): If to_rtx is a VOIDmode MEM, use + BLKmode mode for it. + (expand_expr_real_1): Similarly for op0. + 2010-11-11 Rainer Orth * doc/sourcebuild.texi (LTO Testing, dg-suppress-ld-options): diff --git a/gcc/expr.c b/gcc/expr.c index cb73f01f28c..d2aefd5d763 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -4260,11 +4260,16 @@ expand_assignment (tree to, tree from, bool nontemporal) to_rtx = expand_normal (tem); /* If the bitfield is volatile, we want to access it in the - field's mode, not the computed mode. */ - if (volatilep - && GET_CODE (to_rtx) == MEM - && flag_strict_volatile_bitfields > 0) - to_rtx = adjust_address (to_rtx, mode1, 0); + field's mode, not the computed mode. + If a MEM has VOIDmode (external with incomplete type), + use BLKmode for it instead. */ + if (MEM_P (to_rtx)) + { + if (volatilep && flag_strict_volatile_bitfields > 0) + to_rtx = adjust_address (to_rtx, mode1, 0); + else if (GET_MODE (to_rtx) == VOIDmode) + to_rtx = adjust_address (to_rtx, BLKmode, 0); + } if (offset != 0) { @@ -9013,11 +9018,16 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, /* If the bitfield is volatile, we want to access it in the - field's mode, not the computed mode. */ - if (volatilep - && GET_CODE (op0) == MEM - && flag_strict_volatile_bitfields > 0) - op0 = adjust_address (op0, mode1, 0); + field's mode, not the computed mode. + If a MEM has VOIDmode (external with incomplete type), + use BLKmode for it instead. */ + if (MEM_P (op0)) + { + if (volatilep && flag_strict_volatile_bitfields > 0) + op0 = adjust_address (op0, mode1, 0); + else if (GET_MODE (op0) == VOIDmode) + op0 = adjust_address (op0, BLKmode, 0); + } mode2 = CONSTANT_P (op0) ? TYPE_MODE (TREE_TYPE (tem)) : GET_MODE (op0); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 26b24d3e598..7828567c3f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-11 Jakub Jelinek + + PR middle-end/46388 + * gcc.c-torture/compile/pr46388.c: New test. + 2010-11-11 Rainer Orth * lib/lto.exp (lto-get-options-main): Support optional target diff --git a/gcc/testsuite/gcc.c-torture/compile/pr46388.c b/gcc/testsuite/gcc.c-torture/compile/pr46388.c new file mode 100644 index 00000000000..74f60bb569a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr46388.c @@ -0,0 +1,14 @@ +/* PR middle-end/46388 */ + +struct S; +struct T +{ + struct S *t; +}; +extern struct S s, u; + +void +foo (void) +{ + ((struct T *) &u)->t = &s; +}