From b6bdd09f1e536c5e63721c40e4d5571b9af34572 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Wed, 15 Dec 2004 19:14:55 +0000 Subject: [PATCH] PR c++/17972 * tree-inline.c (expand_call_inline): Set TREE_SIDE_EFFECTS on the STMT_EXPR wrapping up the inlined body. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92210 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/opt/inline9.C | 29 +++++++++++++++++++++++++++++ gcc/tree-inline.c | 7 +++++-- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/inline9.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6b987df1fa4..fee46800edf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-12-15 Eric Botcazou + + PR c++/17972 + * tree-inline.c (expand_call_inline): Set TREE_SIDE_EFFECTS + on the STMT_EXPR wrapping up the inlined body. + 2004-12-15 Vladimir Makarov Steven Bosscher PR middle end/17340 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 58d4e787d15..06dd868513a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-12-15 Alan Modra + + * g++.dg/opt/inline9.C: New test. + 2004-12-15 Tobias Schlueter PR fortran/18993 diff --git a/gcc/testsuite/g++.dg/opt/inline9.C b/gcc/testsuite/g++.dg/opt/inline9.C new file mode 100644 index 00000000000..10ccb47dc79 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline9.C @@ -0,0 +1,29 @@ +// PR c++/17972 +// Origin: Michal Ostrowski +// Testcase by Alan Modra +// { dg-do run } +// { dg-options "-O" } +// { dg-options "-O -mtune=i686" { target i?86-*-* } } + +struct thread_info +{ + short preempt_count; +} x; + +static inline struct thread_info *cti (void) __attribute__ ((const)); +static inline struct thread_info *cti (void) +{ + return &x; +} + +void fn (void) __attribute__ ((noinline)); +void fn (void) +{ + ++cti()->preempt_count; +} + +int main (void) +{ + fn (); + return 0; +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index db2b2361874..61fe66dbb08 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1625,8 +1625,11 @@ expand_call_inline (tree *tp, int *walk_subtrees, void *data) splay_tree_delete (id->decl_map); id->decl_map = st; - /* The new expression has side-effects if the old one did. */ - TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (t); + /* Although, from the semantic viewpoint, the new expression has + side-effects only if the old one did, it is not possible, from + the technical viewpoint, to evaluate the body of a function + multiple times without serious havoc. */ + TREE_SIDE_EFFECTS (expr) = 1; tsi_link_before (&id->tsi, expr, TSI_SAME_STMT); -- 2.11.4.GIT