diff options
author | Martin Jambor <mjambor@suse.cz> | 2009-02-25 17:34:40 +0000 |
---|---|---|
committer | Martin Jambor <mjambor@suse.cz> | 2009-02-25 17:34:40 +0000 |
commit | f2d919fdc7f31a54857ca672dd01e5f47db1559c (patch) | |
tree | 4182e728b6903dec746f498b358c66957fd4f37f | |
parent | a4d2a938d1f071b4b85db1c86242211e1a94bc11 (diff) |
2009-02-25 Martin Jambor <mjambor@suse.cz>
* tree-inline.c (initialize_cfun): Remove asserts for calls_setjmp and
alls_alloca function flags.
(copy_bb): Set calls_setjmp and alls_alloca function flags if such
calls are detected.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@144428 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr39259.C | 40 | ||||
-rw-r--r-- | gcc/tree-inline.c | 12 |
4 files changed, 60 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cb0b4400505..2aa1030c022 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2009-02-25 Martin Jambor <mjambor@suse.cz> + + PR tree-optimization/39259 + * tree-inline.c (initialize_cfun): Remove asserts for calls_setjmp and + alls_alloca function flags. + (copy_bb): Set calls_setjmp and alls_alloca function flags if such + calls are detected. + 2009-02-25 Paolo Bonzini <bonzini@gnu.org> * regmove.c (discover_flags_reg, flags_set_1, mark_flags_life_zones, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 00a2ce9acaa..4e54e54b06d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-02-25 Martin Jambor <mjambor@suse.cz> + PR tree-optimizations/39259 + * g++.dg/torture/pr39259.C: New testcase. + 2009-02-24 Richard Guenther <rguenther@suse.de> PR c++/39242 diff --git a/gcc/testsuite/g++.dg/torture/pr39259.C b/gcc/testsuite/g++.dg/torture/pr39259.C new file mode 100644 index 00000000000..256181fa655 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39259.C @@ -0,0 +1,40 @@ +// PR tree-optimization/39259 +// { dg-do compile } +// { dg-options "-O2" } + + +extern "C" int __mysetjmp () __attribute__ ((__returns_twice__)); + +class TContStatus {}; + +class TContEvent +{ +public: + inline void Execute () throw(); +}; + +class TCont +{ +public: + TContStatus ReadD (void* buf, int deadline) + { + TContEvent event; + event.Execute (); + return TContStatus(); + } + TContStatus ReadI (void *buf) + { + return ReadD (buf, 1); + } +}; + +void TContEvent::Execute () throw () +{ + __mysetjmp(); +} + +void Broken (TCont *mCont) +{ + mCont->ReadI(0); + mCont->ReadI(0); +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 075e575d11b..fd4443c74f9 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1398,6 +1398,7 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, { struct cgraph_node *node; struct cgraph_edge *edge; + int flags; switch (id->transform_call_graph_edges) { @@ -1429,6 +1430,13 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, default: gcc_unreachable (); } + + flags = gimple_call_flags (stmt); + + if (flags & ECF_MAY_BE_ALLOCA) + cfun->calls_alloca = true; + if (flags & ECF_RETURNS_TWICE) + cfun->calls_setjmp = true; } /* If you think we can abort here, you are wrong. @@ -1745,10 +1753,6 @@ initialize_cfun (tree new_fndecl, tree callee_fndecl, gcov_type count, gcc_assert (cfun->cfg == NULL); gcc_assert (cfun->decl == new_fndecl); - /* No need to copy; this is initialized later in compilation. */ - gcc_assert (!src_cfun->calls_setjmp); - gcc_assert (!src_cfun->calls_alloca); - /* Copy items we preserve during clonning. */ cfun->static_chain_decl = src_cfun->static_chain_decl; cfun->nonlocal_goto_save_area = src_cfun->nonlocal_goto_save_area; |