re PR middle-end/55750 (-( in expand_expr_addr_expr_1, at expr.c:7646)
authorJakub Jelinek <jakub@redhat.com>
Thu, 20 Dec 2012 18:13:56 +0000 (19:13 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 20 Dec 2012 18:13:56 +0000 (19:13 +0100)
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.

From-SVN: r194647

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr55750.c [new file with mode: 0644]

index 1fb596f..9e7a4b7 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2012-12-20  Richard Henderson  <rth@redhat.com>
            Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
index f628b8a..e79d063 100644 (file)
@@ -2391,25 +2391,15 @@ gimplify_self_mod_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
   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)))
index c7cb233..b89fa02 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/55750
+       * gcc.c-torture/execute/pr55750.c: New test.
+
 2012-12-20  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/55740
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr55750.c b/gcc/testsuite/gcc.c-torture/execute/pr55750.c
new file mode 100644 (file)
index 0000000..d2b3c63
--- /dev/null
@@ -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;
+}