Commit cf1867a0 by Richard Guenther Committed by Richard Biener

re PR middle-end/48814 (Incorrect scalar increment result)

2012-03-16  Richard Guenther  <rguenther@suse.de>
	Kai Tietz  <ktietz@redhat.com>

	PR middle-end/48814
	* gimplify.c (gimplify_self_mod_expr): Evaluate postfix
	side-effects completely in the pre-queue and use a temporary
	for the result.

	* gcc.c-torture/execute/pr48814-1.c: New test.
	* gcc.c-torture/execute/pr48814-2.c: New test.
	* gcc.dg/tree-ssa/assign-1.c: New test.
	* gcc.dg/tree-ssa/assign-2.c: New test.
	* gcc.dg/tree-ssa/assign-3.c: New test.

Co-Authored-By: Kai Tietz <ktietz@redhat.com>

From-SVN: r185465
parent 2447776c
2012-03-16 Richard Guenther <rguenther@suse.de>
Kai Tietz <ktietz@redhat.com>
PR middle-end/48814
* gimplify.c (gimplify_self_mod_expr): Evaluate postfix
side-effects completely in the pre-queue and use a temporary
for the result.
2012-03-16 Richard Guenther <rguenther@suse.de>
* stor-layout.c (finish_bitfield_representative): Fall back
to the conservative maximum size if we cannot compute the
......
......@@ -2265,17 +2265,18 @@ gimplify_self_mod_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
arith_code = POINTER_PLUS_EXPR;
}
t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
if (postfix)
{
gimplify_assign (lvalue, t1, orig_post_p);
tree t2 = get_initialized_tmp_var (lhs, pre_p, NULL);
t1 = build2 (arith_code, TREE_TYPE (*expr_p), t2, rhs);
gimplify_assign (lvalue, t1, pre_p);
gimplify_seq_add_seq (orig_post_p, post);
*expr_p = lhs;
*expr_p = t2;
return GS_ALL_DONE;
}
else
{
t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
*expr_p = build2 (MODIFY_EXPR, TREE_TYPE (lvalue), lvalue, t1);
return GS_OK;
}
......
2012-03-16 Richard Guenther <rguenther@suse.de>
Kai Tietz <ktietz@redhat.com>
PR middle-end/48814
* gcc.c-torture/execute/pr48814-1.c: New test.
* gcc.c-torture/execute/pr48814-2.c: New test.
* gcc.dg/tree-ssa/assign-1.c: New test.
* gcc.dg/tree-ssa/assign-2.c: New test.
* gcc.dg/tree-ssa/assign-3.c: New test.
2012-03-16 Richard Guenther <rguenther@suse.de>
* gnat.dg/specs/pack7.ads: New testcase.
......
extern void abort (void);
int arr[] = {1,2,3,4};
int count = 0;
int __attribute__((noinline))
incr (void)
{
return ++count;
}
int main()
{
arr[count++] = incr ();
if (count != 2 || arr[count] != 3)
abort ();
return 0;
}
extern void abort (void);
int arr[] = {1,2,3,4};
int count = 0;
int
incr (void)
{
return ++count;
}
int main()
{
arr[count++] = incr ();
if (count != 2 || arr[count] != 3)
abort ();
return 0;
}
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
volatile int count;
void bar(int);
void foo()
{
bar(count++);
}
/* { dg-final { scan-tree-dump-times "count =" 1 "optimized"} } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
volatile int count;
int arr[4];
void foo()
{
arr[count++] = 0;
}
/* { dg-final { scan-tree-dump-times "count =" 1 "optimized"} } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* { dg-do run } */
/* { dg-options "-O2 -fdump-tree-gimple" } */
extern void abort (void);
struct S { int i; };
struct S arr[32];
volatile int count = 0;
struct S __attribute__((noinline))
incr ()
{
++count;
}
int main()
{
arr[count++] = incr ();
if (count != 2)
abort ();
return 0;
}
/* { dg-final { scan-tree-dump-times " = count;" 3 "gimple" } } */
/* { dg-final { cleanup-tree-dump "gimple" } } */
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