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
This commit is contained in:
Jakub Jelinek 2012-12-20 19:13:56 +01:00 committed by Jakub Jelinek
parent 5bb339361a
commit d97c9b2248
4 changed files with 43 additions and 13 deletions

View 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>

View 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)))

View 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

View file

@ -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;
}