aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2009-02-25 17:34:40 +0000
committerMartin Jambor <mjambor@suse.cz>2009-02-25 17:34:40 +0000
commitf2d919fdc7f31a54857ca672dd01e5f47db1559c (patch)
tree4182e728b6903dec746f498b358c66957fd4f37f
parenta4d2a938d1f071b4b85db1c86242211e1a94bc11 (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/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/torture/pr39259.C40
-rw-r--r--gcc/tree-inline.c12
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;