[PATCH] Fix postincrement/decrement of a bitfield (PR middle-end/55750)

rguenther@suse.de rguenther@suse.de
Thu Dec 20 17:47:00 GMT 2012


Jakub Jelinek <jakub@redhat.com> wrote:

>Hi!
>
>As the following testcase shows, the !is_gimple_min_lval code would for
>bit
>fields want to take address of those bitfields and dereference it,
>which of
>course leads to ICEs.
>
>As discussed with Richard on IRC, this code is not needed at all since
>PR48814 fix, so there is no need to teach it about bitfields and
>instead it
>can be just removed altogether.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

>2012-12-20  Jakub Jelinek  <jakub@redhat.com>
>
>	PR middle-end/55750
>	* gimplify.c (gimplify_self_mod_expr): Don't force lvalue to
>	pass is_gimple_min_lval.
>
>	* gcc.c-torture/execute/pr55750.c: New test.
>
>--- gcc/gimplify.c.jj	2012-12-20 11:38:45.000000000 +0100
>+++ gcc/gimplify.c	2012-12-20 14:45:42.586627882 +0100
>@@ -2391,25 +2391,15 @@ gimplify_self_mod_expr (tree *expr_p, gi
>   rhs = TREE_OPERAND (*expr_p, 1);
> 
> /* For postfix operator, we evaluate the LHS to an rvalue and then use
>-     that as the result value and in the postqueue operation.  We also
>-     make sure to make lvalue a minimal lval, see
>-     gcc.c-torture/execute/20040313-1.c for an example where this
>matters.  */
>+     that as the result value and in the postqueue operation.  */
>   if (postfix)
>     {
>-      if (!is_gimple_min_lval (lvalue))
>-	{
>-	  mark_addressable (lvalue);
>-	  lvalue = build_fold_addr_expr_loc (input_location, lvalue);
>-	  gimplify_expr (&lvalue, pre_p, post_p, is_gimple_val, fb_rvalue);
>-	  lvalue = build_fold_indirect_ref_loc (input_location, lvalue);
>-	}
>   ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
>       if (ret == GS_ERROR)
> 	return ret;
>-    }
> 
>-  if (postfix)
>-    lhs = get_initialized_tmp_var (lhs, pre_p, NULL);
>+      lhs = get_initialized_tmp_var (lhs, pre_p, NULL);
>+    }
> 
>   /* For POINTERs increment, use POINTER_PLUS_EXPR.  */
>   if (POINTER_TYPE_P (TREE_TYPE (lhs)))
>--- gcc/testsuite/gcc.c-torture/execute/pr55750.c.jj	2012-12-20
>14:24:03.487344949 +0100
>+++ gcc/testsuite/gcc.c-torture/execute/pr55750.c	2012-12-20
>14:25:10.000000000 +0100
>@@ -0,0 +1,29 @@
>+/* PR middle-end/55750 */
>+
>+extern void abort (void);
>+
>+struct S
>+{
>+  int m : 1;
>+  int n : 7;
>+} arr[2];
>+
>+__attribute__((noinline, noclone)) void
>+foo (unsigned i)
>+{
>+  arr[i].n++;
>+}
>+
>+int
>+main ()
>+{
>+  arr[0].m = -1;
>+  arr[0].n = (1 << 6) - 1;
>+  arr[1].m = 0;
>+  arr[1].n = -1;
>+  foo (0);
>+  foo (1);
>+  if (arr[0].m != -1 || arr[0].n != -(1 << 6) || arr[1].m != 0 ||
>arr[1].n != 0)
>+    abort ();
>+  return 0;
>+}
>
>	Jakub


-- 
Sent from my Android phone with K-9 Mail. Please excuse my brevity.



More information about the Gcc-patches mailing list