From d84b37b08adcd3f280d1711317488ad7824e4697 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Mon, 24 Apr 2006 02:06:51 -0700 Subject: [PATCH] re PR tree-optimization/27236 (inliner creates an INDIRECT_REF without TREE_THIS_VOLATILE set for *a) 2006-04-24 Andrew Pinski Richard Guenther 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 From-SVN: r113221 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/tree-ssa/pr27236.c | 19 +++++++++++++++++++ gcc/tree-inline.c | 7 ++++++- 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr27236.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 171808d73cd..51d8065086b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-04-24 Andrew Pinski + Richard Guenther + + PR tree-optimization/27236 + * tree-inline.c (copy_body_r): Make sure to copy + TREE_THIS_VOLATILE flag. + 2006-04-24 Richard Guenther PR middle-end/26869 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f477f4b89c1..e6096c11bfe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-04-24 Andrew Pinski + Richard Guenther + + PR tree-optimization/27236 + * gcc.dg/tree-ssa/pr27236.c: New testcase. + 2006-04-24 Volker Reichelt PR c++/19963 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr27236.c b/gcc/testsuite/gcc.dg/tree-ssa/pr27236.c new file mode 100644 index 00000000000..b623486294a --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr27236.c @@ -0,0 +1,19 @@ +/* { 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" } } */ diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 6eb890b0ea2..309bb406fb8 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -590,6 +590,7 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data) if (n) { tree new; + tree old; /* If we happen to get an ADDR_EXPR in n->value, strip it manually here as we'll eventually get ADDR_EXPRs which lie about their types pointed to. In this case @@ -598,13 +599,17 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data) does other useful transformations, try that first, though. */ tree type = TREE_TYPE (TREE_TYPE ((tree)n->value)); new = unshare_expr ((tree)n->value); + old = *tp; *tp = fold_indirect_ref_1 (type, new); if (! *tp) { if (TREE_CODE (new) == ADDR_EXPR) *tp = TREE_OPERAND (new, 0); else - *tp = build1 (INDIRECT_REF, type, new); + { + *tp = build1 (INDIRECT_REF, type, new); + TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old); + } } *walk_subtrees = 0; return NULL;