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:
parent
5bb339361a
commit
d97c9b2248
4 changed files with 43 additions and 13 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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)))
|
||||
|
|
|
@ -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
|
||||
|
|
29
gcc/testsuite/gcc.c-torture/execute/pr55750.c
Normal file
29
gcc/testsuite/gcc.c-torture/execute/pr55750.c
Normal 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue