This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR 44915 - ensure indirect inlining is never run at -O0


H,

this is a quick workaround for PR 44915.  The problem is that if user
specifically requests indirect inlining at the command line when not
optimizing, we segfault because virtual operands are not there when we
expect them.

I understand that a proper fix would be to disable IPA passes at -O0
but at the moment I feel I should work on more serious problems
instead.

Bootstrapped and tested on x86_64-linux.  OK for trunk?

Thanks,

Martin


2010-07-23  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/44915
	* ipa-cp.c (cgraph_gate_cp): Also check that optimize is true.
	* ipa-inline.c (cgraph_mark_inline_edge): Likewise.
	(analyze_function): Likewise.

	* testsuite/g++.dg/torture/pr44915.C: New test.

Index: icln/gcc/ipa-cp.c
===================================================================
--- icln.orig/gcc/ipa-cp.c
+++ icln/gcc/ipa-cp.c
@@ -1278,7 +1278,9 @@ ipcp_read_summary (void)
 static bool
 cgraph_gate_cp (void)
 {
-  return flag_ipa_cp;
+  /* FIXME: We should remove the optimize check after we ensure we never run
+     IPA passes when not optimizng.  */
+  return flag_ipa_cp && optimize;
 }
 
 struct ipa_opt_pass_d pass_ipa_cp =
Index: icln/gcc/ipa-inline.c
===================================================================
--- icln.orig/gcc/ipa-inline.c
+++ icln/gcc/ipa-inline.c
@@ -334,7 +334,9 @@ cgraph_mark_inline_edge (struct cgraph_e
     overall_size += new_size - old_size;
   ncalls_inlined++;
 
-  if (flag_indirect_inlining)
+  /* FIXME: We should remove the optimize check after we ensure we never run
+     IPA passes when not optimizng.  */
+  if (flag_indirect_inlining && optimize)
     return ipa_propagate_indirect_call_infos (curr, new_edges);
   else
     return false;
@@ -2085,7 +2087,9 @@ analyze_function (struct cgraph_node *no
   current_function_decl = node->decl;
 
   compute_inline_parameters (node);
-  if (flag_indirect_inlining)
+  /* FIXME: We should remove the optimize check after we ensure we never run
+     IPA passes when not optimizng.  */
+  if (flag_indirect_inlining && optimize)
     inline_indirect_intraprocedural_analysis (node);
 
   current_function_decl = NULL;
Index: icln/gcc/testsuite/g++.dg/torture/pr44915.C
===================================================================
--- /dev/null
+++ icln/gcc/testsuite/g++.dg/torture/pr44915.C
@@ -0,0 +1,13 @@
+/* { dg-do compile }  */
+/* { dg-options "-findirect-inlining" } */
+
+struct A;
+
+typedef void (A::*f_ptr) ();
+
+void dummy (f_ptr) { }
+
+void call_dummy (f_ptr cb)
+{
+  dummy (cb);
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]