Commit d84b37b0 by Andrew Pinski Committed by Richard Biener

re PR tree-optimization/27236 (inliner creates an INDIRECT_REF without…

re PR tree-optimization/27236 (inliner creates an INDIRECT_REF without TREE_THIS_VOLATILE set for *a)

2006-04-24  Andrew Pinski  <pinskia@gcc.gnu.org>
	Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/27236
	* tree-inline.c (copy_body_r): Make sure to copy
	TREE_THIS_VOLATILE flag.

	* gcc.dg/tree-ssa/pr27236.c: New testcase.

Co-Authored-By: Richard Guenther <rguenther@suse.de>

From-SVN: r113221
parent 4e3bd7d5
2006-04-24 Andrew Pinski <pinskia@gcc.gnu.org>
Richard Guenther <rguenther@suse.de>
PR tree-optimization/27236
* tree-inline.c (copy_body_r): Make sure to copy
TREE_THIS_VOLATILE flag.
2006-04-24 Richard Guenther <rguenther@suse.de> 2006-04-24 Richard Guenther <rguenther@suse.de>
PR middle-end/26869 PR middle-end/26869
......
2006-04-24 Andrew Pinski <pinskia@gcc.gnu.org>
Richard Guenther <rguenther@suse.de>
PR tree-optimization/27236
* gcc.dg/tree-ssa/pr27236.c: New testcase.
2006-04-24 Volker Reichelt <reichelt@igpm.rwth-aachen.de> 2006-04-24 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/19963 PR c++/19963
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
static inline int inline_read(volatile int *mem)
{
return *mem;
}
int foo_read(volatile int *mem)
{
return inline_read(mem);
}
unsigned int foo(volatile int *mem)
{
foo_read(mem);
return foo_read(mem);
}
/* { dg-final { scan-tree-dump-times "foo_read" 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
...@@ -590,6 +590,7 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data) ...@@ -590,6 +590,7 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data)
if (n) if (n)
{ {
tree new; tree new;
tree old;
/* If we happen to get an ADDR_EXPR in n->value, strip /* If we happen to get an ADDR_EXPR in n->value, strip
it manually here as we'll eventually get ADDR_EXPRs it manually here as we'll eventually get ADDR_EXPRs
which lie about their types pointed to. In this case which lie about their types pointed to. In this case
...@@ -598,13 +599,17 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data) ...@@ -598,13 +599,17 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data)
does other useful transformations, try that first, though. */ does other useful transformations, try that first, though. */
tree type = TREE_TYPE (TREE_TYPE ((tree)n->value)); tree type = TREE_TYPE (TREE_TYPE ((tree)n->value));
new = unshare_expr ((tree)n->value); new = unshare_expr ((tree)n->value);
old = *tp;
*tp = fold_indirect_ref_1 (type, new); *tp = fold_indirect_ref_1 (type, new);
if (! *tp) if (! *tp)
{ {
if (TREE_CODE (new) == ADDR_EXPR) if (TREE_CODE (new) == ADDR_EXPR)
*tp = TREE_OPERAND (new, 0); *tp = TREE_OPERAND (new, 0);
else else
*tp = build1 (INDIRECT_REF, type, new); {
*tp = build1 (INDIRECT_REF, type, new);
TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old);
}
} }
*walk_subtrees = 0; *walk_subtrees = 0;
return NULL; return NULL;
......
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