Commit d97c9b22 by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/55750 (-( in expand_expr_addr_expr_1, at expr.c:7646)

	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
parent 5bb33936
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> 2012-12-20 Richard Henderson <rth@redhat.com>
Andreas Krebbel <Andreas.Krebbel@de.ibm.com> Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
...@@ -2391,25 +2391,15 @@ gimplify_self_mod_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, ...@@ -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); rhs = TREE_OPERAND (*expr_p, 1);
/* For postfix operator, we evaluate the LHS to an rvalue and then use /* 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 that as the result value and in the postqueue operation. */
make sure to make lvalue a minimal lval, see
gcc.c-torture/execute/20040313-1.c for an example where this matters. */
if (postfix) 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); ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
if (ret == GS_ERROR) if (ret == GS_ERROR)
return ret; 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. */ /* For POINTERs increment, use POINTER_PLUS_EXPR. */
if (POINTER_TYPE_P (TREE_TYPE (lhs))) if (POINTER_TYPE_P (TREE_TYPE (lhs)))
......
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> 2012-12-20 Richard Biener <rguenther@suse.de>
PR middle-end/55740 PR middle-end/55740
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment