[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