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
This commit is contained in:
parent
86de8875db
commit
1004f0c5c8
4 changed files with 46 additions and 10 deletions
|
@ -1,3 +1,10 @@
|
|||
2010-11-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
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 <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||
|
||||
* doc/sourcebuild.texi (LTO Testing, dg-suppress-ld-options):
|
||||
|
|
30
gcc/expr.c
30
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);
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-11-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/46388
|
||||
* gcc.c-torture/compile/pr46388.c: New test.
|
||||
|
||||
2010-11-11 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||
|
||||
* lib/lto.exp (lto-get-options-main): Support optional target
|
||||
|
|
14
gcc/testsuite/gcc.c-torture/compile/pr46388.c
Normal file
14
gcc/testsuite/gcc.c-torture/compile/pr46388.c
Normal file
|
@ -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;
|
||||
}
|
Loading…
Add table
Reference in a new issue