From 31fa5b0d2f64ac0734820eba0608d53c7728280c Mon Sep 17 00:00:00 2001 From: jakub Date: Thu, 8 Dec 2011 19:49:02 +0000 Subject: [PATCH] PR tree-optimization/51466 * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Also copy TREE_SIDE_EFFECTS. * gcc.c-torture/execute/pr51466.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182136 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/execute/pr51466.c | 43 +++++++++++++++++++++++++++ gcc/tree-ssa-forwprop.c | 4 +++ 4 files changed, 58 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr51466.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index acf73da830a..c2a3cee6344 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-12-08 Jakub Jelinek + + PR tree-optimization/51466 + * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Also copy + TREE_SIDE_EFFECTS. + 2011-12-08 Richard Guenther * tree-ssa-operands.c (add_stmt_operand): Do not mark stmts diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 30f16099369..ed2428d8c16 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-12-08 Jakub Jelinek + + PR tree-optimization/51466 + * gcc.c-torture/execute/pr51466.c: New test. + 2011-12-08 Tobias Burnus PR fortran/50815 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr51466.c b/gcc/testsuite/gcc.c-torture/execute/pr51466.c new file mode 100644 index 00000000000..aa0b7fd4fb9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr51466.c @@ -0,0 +1,43 @@ +/* PR tree-optimization/51466 */ + +extern void abort (void); + +__attribute__((noinline, noclone)) int +foo (int i) +{ + volatile int v[4]; + int *p; + v[i] = 6; + p = (int *) &v[i]; + return *p; +} + +__attribute__((noinline, noclone)) int +bar (int i) +{ + volatile int v[4]; + int *p; + v[i] = 6; + p = (int *) &v[i]; + *p = 8; + return v[i]; +} + +__attribute__((noinline, noclone)) int +baz (int i) +{ + volatile int v[4]; + int *p; + v[i] = 6; + p = (int *) &v[0]; + *p = 8; + return v[i]; +} + +int +main () +{ + if (foo (3) != 6 || bar (2) != 8 || baz (0) != 8 || baz (1) != 6) + abort (); + return 0; +} diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index 6ab47317770..20821ef8b98 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -929,10 +929,12 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, *def_rhs_basep = build2 (MEM_REF, TREE_TYPE (*def_rhs_basep), new_base, new_offset); TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (lhs); + TREE_SIDE_EFFECTS (*def_rhs_basep) = TREE_SIDE_EFFECTS (lhs); TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (lhs); new_lhs = unshare_expr (TREE_OPERAND (def_rhs, 0)); gimple_assign_set_lhs (use_stmt, new_lhs); TREE_THIS_VOLATILE (new_lhs) = TREE_THIS_VOLATILE (lhs); + TREE_SIDE_EFFECTS (new_lhs) = TREE_SIDE_EFFECTS (lhs); *def_rhs_basep = saved; tidy_after_forward_propagate_addr (use_stmt); /* Continue propagating into the RHS if this was not the @@ -1011,10 +1013,12 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, *def_rhs_basep = build2 (MEM_REF, TREE_TYPE (*def_rhs_basep), new_base, new_offset); TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (rhs); + TREE_SIDE_EFFECTS (*def_rhs_basep) = TREE_SIDE_EFFECTS (rhs); TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (rhs); new_rhs = unshare_expr (TREE_OPERAND (def_rhs, 0)); gimple_assign_set_rhs1 (use_stmt, new_rhs); TREE_THIS_VOLATILE (new_rhs) = TREE_THIS_VOLATILE (rhs); + TREE_SIDE_EFFECTS (new_rhs) = TREE_SIDE_EFFECTS (rhs); *def_rhs_basep = saved; fold_stmt_inplace (use_stmt_gsi); tidy_after_forward_propagate_addr (use_stmt); -- 2.11.0