[PATCH] Fix expansion ICE with VOIDmode MEM (PR middle-end/46388)
Jakub Jelinek
jakub@redhat.com
Thu Nov 11 15:32:00 GMT 2010
On Wed, Nov 10, 2010 at 04:04:30PM -0800, Richard Henderson wrote:
> On 11/10/2010 03:21 PM, Jakub Jelinek wrote:
> > I think we just should avoid having VOIDmode MEM around whenever possible,
> > the following patch fixes it by using the MEM_REF access mode instead
> > (alternatively we could always use BLKmode for it).
>
> I prefer we create the mem with BLKmode.
Here is that version, again bootstrapped/regtested on x86_64-linux and
i686-linux and tested on the testcase with ia64-linux cross. Ok for trunk?
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.
* gcc.c-torture/compile/pr46388.c: New test.
--- gcc/expr.c.jj 2010-11-09 13:58:30.000000000 +0100
+++ gcc/expr.c 2010-11-10 11:37:53.000000000 +0100
@@ -4260,11 +4260,16 @@ expand_assignment (tree to, tree from, b
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
/* 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);
--- gcc/testsuite/gcc.c-torture/compile/pr46388.c.jj 2010-11-10 11:45:52.000000000 +0100
+++ gcc/testsuite/gcc.c-torture/compile/pr46388.c 2010-11-10 11:45:37.000000000 +0100
@@ -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;
+}
Jakub
More information about the Gcc-patches
mailing list