diff options
author | Martin Jambor <mjambor@suse.cz> | 2009-02-25 18:34:40 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2009-02-25 18:34:40 +0100 |
commit | f618d33ef115544bb371c67ff937e9ce97969712 (patch) | |
tree | 4182e728b6903dec746f498b358c66957fd4f37f /gcc | |
parent | 054efbba9dbf01e8f1b52f01aafa324f57f701ba (diff) | |
download | gcc-f618d33ef115544bb371c67ff937e9ce97969712.zip gcc-f618d33ef115544bb371c67ff937e9ce97969712.tar.gz gcc-f618d33ef115544bb371c67ff937e9ce97969712.tar.bz2 |
tree-inline.c (initialize_cfun): Remove asserts for calls_setjmp and alls_alloca function flags.
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.
From-SVN: r144428
Diffstat (limited to 'gcc')
-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 cb0b440..2aa1030 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 00a2ce9..4e54e54 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 0000000..256181f --- /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 075e575..fd4443c 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; |