mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
2447776cc9
commit
cf1867a027
|
@ -1,3 +1,11 @@
|
||||||
|
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>
|
2012-03-16 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
* stor-layout.c (finish_bitfield_representative): Fall back
|
* stor-layout.c (finish_bitfield_representative): Fall back
|
||||||
|
|
|
@ -2265,17 +2265,18 @@ gimplify_self_mod_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
|
||||||
arith_code = POINTER_PLUS_EXPR;
|
arith_code = POINTER_PLUS_EXPR;
|
||||||
}
|
}
|
||||||
|
|
||||||
t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
|
|
||||||
|
|
||||||
if (postfix)
|
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);
|
gimplify_seq_add_seq (orig_post_p, post);
|
||||||
*expr_p = lhs;
|
*expr_p = t2;
|
||||||
return GS_ALL_DONE;
|
return GS_ALL_DONE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
|
||||||
*expr_p = build2 (MODIFY_EXPR, TREE_TYPE (lvalue), lvalue, t1);
|
*expr_p = build2 (MODIFY_EXPR, TREE_TYPE (lvalue), lvalue, t1);
|
||||||
return GS_OK;
|
return GS_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,13 @@
|
||||||
|
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>
|
2012-03-16 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
* gnat.dg/specs/pack7.ads: New testcase.
|
* gnat.dg/specs/pack7.ads: New testcase.
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
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;
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
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;
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
/* { 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" } } */
|
|
@ -0,0 +1,13 @@
|
||||||
|
/* { 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" } } */
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* { 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" } } */
|
Loading…
Reference in New Issue