aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr27236.c19
-rw-r--r--gcc/tree-inline.c7
4 files changed, 38 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 171808d..51d8065 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+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>
PR middle-end/26869
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f477f4b..e6096c1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+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>
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 0000000..b623486
--- /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 6eb890b..309bb40 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;