Commit 8c29866f by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/50078 (combine wrong code: volatile accesses optimized out)

	PR tree-optimization/50078
	* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Copy over
	TREE_THIS_VOLATILE also from the old to new lhs resp. rhs.

	* gcc.dg/pr50078.c: New test.

From-SVN: r181786
parent 99d8763e
2011-11-28 Jakub Jelinek <jakub@redhat.com> 2011-11-28 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/50078
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Copy over
TREE_THIS_VOLATILE also from the old to new lhs resp. rhs.
PR tree-optimization/50682 PR tree-optimization/50682
* tree-eh.c (maybe_remove_unreachable_handlers): New function. * tree-eh.c (maybe_remove_unreachable_handlers): New function.
* tree-flow.h (maybe_remove_unreachable_handlers): New prototype. * tree-flow.h (maybe_remove_unreachable_handlers): New prototype.
2011-11-28 Jakub Jelinek <jakub@redhat.com> 2011-11-28 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/50078
* gcc.dg/pr50078.c: New test.
PR tree-optimization/50682 PR tree-optimization/50682
* g++.dg/opt/pr50682.C: New test. * g++.dg/opt/pr50682.C: New test.
......
/* PR tree-optimization/50078 */
/* { dg-do compile } */
/* { dg-options "-O2" } */
unsigned nonvolvar[2];
void
test (int arg)
{
unsigned v = *(volatile unsigned *) (&nonvolvar[arg]);
*(volatile unsigned *) (&nonvolvar[arg]) = v;
}
/* { dg-final { scan-assembler-times "movl\[^\n\r\]*nonvolvar" 2 { target { { i?86-*-* x86_64-*-* } && nonpic } } } } */
...@@ -910,7 +910,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, ...@@ -910,7 +910,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
TREE_TYPE (gimple_assign_rhs1 (use_stmt)))) TREE_TYPE (gimple_assign_rhs1 (use_stmt))))
{ {
tree *def_rhs_basep = &TREE_OPERAND (def_rhs, 0); tree *def_rhs_basep = &TREE_OPERAND (def_rhs, 0);
tree new_offset, new_base, saved; tree new_offset, new_base, saved, new_lhs;
while (handled_component_p (*def_rhs_basep)) while (handled_component_p (*def_rhs_basep))
def_rhs_basep = &TREE_OPERAND (*def_rhs_basep, 0); def_rhs_basep = &TREE_OPERAND (*def_rhs_basep, 0);
saved = *def_rhs_basep; saved = *def_rhs_basep;
...@@ -930,8 +930,9 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, ...@@ -930,8 +930,9 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
new_base, new_offset); new_base, new_offset);
TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (lhs); TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (lhs);
TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (lhs); TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (lhs);
gimple_assign_set_lhs (use_stmt, new_lhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
unshare_expr (TREE_OPERAND (def_rhs, 0))); gimple_assign_set_lhs (use_stmt, new_lhs);
TREE_THIS_VOLATILE (new_lhs) = TREE_THIS_VOLATILE (lhs);
*def_rhs_basep = saved; *def_rhs_basep = saved;
tidy_after_forward_propagate_addr (use_stmt); tidy_after_forward_propagate_addr (use_stmt);
/* Continue propagating into the RHS if this was not the /* Continue propagating into the RHS if this was not the
...@@ -991,7 +992,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, ...@@ -991,7 +992,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
TREE_TYPE (TREE_OPERAND (def_rhs, 0)))) TREE_TYPE (TREE_OPERAND (def_rhs, 0))))
{ {
tree *def_rhs_basep = &TREE_OPERAND (def_rhs, 0); tree *def_rhs_basep = &TREE_OPERAND (def_rhs, 0);
tree new_offset, new_base, saved; tree new_offset, new_base, saved, new_rhs;
while (handled_component_p (*def_rhs_basep)) while (handled_component_p (*def_rhs_basep))
def_rhs_basep = &TREE_OPERAND (*def_rhs_basep, 0); def_rhs_basep = &TREE_OPERAND (*def_rhs_basep, 0);
saved = *def_rhs_basep; saved = *def_rhs_basep;
...@@ -1011,8 +1012,9 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, ...@@ -1011,8 +1012,9 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
new_base, new_offset); new_base, new_offset);
TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (rhs); TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (rhs);
TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (rhs); TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (rhs);
gimple_assign_set_rhs1 (use_stmt, new_rhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
unshare_expr (TREE_OPERAND (def_rhs, 0))); gimple_assign_set_rhs1 (use_stmt, new_rhs);
TREE_THIS_VOLATILE (new_rhs) = TREE_THIS_VOLATILE (rhs);
*def_rhs_basep = saved; *def_rhs_basep = saved;
fold_stmt_inplace (use_stmt_gsi); fold_stmt_inplace (use_stmt_gsi);
tidy_after_forward_propagate_addr (use_stmt); tidy_after_forward_propagate_addr (use_stmt);
......
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