summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2005-02-17 23:50:02 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2005-02-17 23:50:02 +0000
commit06bf91cbff74301a0a7b0c75472caa7002a00b78 (patch)
treec8d718fc6dcc552bb2e503ca60d1d787e1f0197b
parent3bb6785a76262a13038c5e439549d1615c7fb361 (diff)
downloadppe42-gcc-06bf91cbff74301a0a7b0c75472caa7002a00b78.tar.gz
ppe42-gcc-06bf91cbff74301a0a7b0c75472caa7002a00b78.zip
PR tree-optimization/18947
* cgraphunit.c (cgraph_finalize_function): When redefining an extern inline, remove all nodes that are inlined into the extern inline being redefined. * gcc.c-torture/compile/20050215-1.c: New test. * gcc.c-torture/compile/20050215-2.c: New test. * gcc.c-torture/compile/20050215-3.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@95207 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cgraphunit.c10
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20050215-1.c4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20050215-2.c7
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20050215-3.c8
6 files changed, 43 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4bc79610871..610d47ac393 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2005-02-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/18947
+ * cgraphunit.c (cgraph_finalize_function): When redefining an extern
+ inline, remove all nodes that are inlined into the extern inline
+ being redefined.
+
2005-02-17 Kazu Hirata <kazu@cs.umass.edu>
* bt-load.c, cfgloop.c, convert.c, dominance.c, global.c,
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 22b33816caa..b9931602e03 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -346,6 +346,16 @@ cgraph_finalize_function (tree decl, bool nested)
memset (&node->rtl, 0, sizeof (node->rtl));
node->analyzed = false;
node->local.redefined_extern_inline = true;
+
+ if (!flag_unit_at_a_time)
+ {
+ struct cgraph_node *n;
+
+ for (n = cgraph_nodes; n; n = n->next)
+ if (n->global.inlined_to == node)
+ cgraph_remove_node (n);
+ }
+
while (node->callees)
cgraph_remove_edge (node->callees);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d03c81fa06f..ccfd4ef6929 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2005-02-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/18947
+ * gcc.c-torture/compile/20050215-1.c: New test.
+ * gcc.c-torture/compile/20050215-2.c: New test.
+ * gcc.c-torture/compile/20050215-3.c: New test.
+
2005-02-17 Alexandre Oliva <aoliva@redhat.com>
PR c++/20028
diff --git a/gcc/testsuite/gcc.c-torture/compile/20050215-1.c b/gcc/testsuite/gcc.c-torture/compile/20050215-1.c
new file mode 100644
index 00000000000..e9717797a10
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20050215-1.c
@@ -0,0 +1,4 @@
+/* PR tree-optimization/18947 */
+extern __inline void f1 (void) { }
+extern __inline void f2 (void) { f1 (); }
+void f2 (void) {}
diff --git a/gcc/testsuite/gcc.c-torture/compile/20050215-2.c b/gcc/testsuite/gcc.c-torture/compile/20050215-2.c
new file mode 100644
index 00000000000..44550d04ce7
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20050215-2.c
@@ -0,0 +1,7 @@
+/* PR tree-optimization/18947 */
+int v;
+extern __inline void f1 (void) { v++; }
+void f4 (void) { f1 (); }
+extern __inline void f2 (void) { f1 (); }
+void f3 (void) { f2 (); }
+void f2 (void) { f1 (); }
diff --git a/gcc/testsuite/gcc.c-torture/compile/20050215-3.c b/gcc/testsuite/gcc.c-torture/compile/20050215-3.c
new file mode 100644
index 00000000000..7a35eb6d0c1
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20050215-3.c
@@ -0,0 +1,8 @@
+/* PR tree-optimization/18947 */
+int v;
+extern __inline void f0 (void) { v++; }
+extern __inline void f1 (void) { f0 (); }
+void f4 (void) { f1 (); }
+extern __inline void f2 (void) { f1 (); }
+void f3 (void) { f2 (); }
+void f2 (void) { f1 (); }
OpenPOWER on IntegriCloud