PING^2: [PATCH, cgraph] Fix "mismatched arguments" inlining warning

Adam Nemet anemet@caviumnetworks.com
Sun Mar 29 00:17:00 GMT 2009


Jan Hubicka writes:
> Sorry for that.
> The patch is OK with the obvious chagne replacing strings by new enum
> values.

Thanks.  This is what I've checked in as r145215 after bootstrapping and
regtesting it on x86_64-linux.

Adam


2009-03-28  Adam Nemet  <anemet@caviumnetworks.com>

	* cgraphbuild.c (build_cgraph_edges, rebuild_cgraph_edges): Don't
	call initialize_inline_failed.
	(initialize_inline_failed): Move it from here ...
	* cgraph.c (initialize_inline_failed): ... to here.
	(cgraph_create_edge): Call initialize_inline_failed rather than
	setting inline_failed directly.

2009-03-28  Adam Nemet  <anemet@caviumnetworks.com>

	* gcc.dg/winline-10.c: New test.

Index: cgraphbuild.c
===================================================================
--- cgraphbuild.c	(revision 145202)
+++ cgraphbuild.c	(working copy)
@@ -78,30 +78,6 @@ record_reference (tree *tp, int *walk_su
   return NULL_TREE;
 }
 
-/* Give initial reasons why inlining would fail on all calls from
-   NODE.  Those get either nullified or usually overwritten by more precise
-   reason later.  */
-
-static void
-initialize_inline_failed (struct cgraph_node *node)
-{
-  struct cgraph_edge *e;
-
-  for (e = node->callers; e; e = e->next_caller)
-    {
-      gcc_assert (!e->callee->global.inlined_to);
-      gcc_assert (e->inline_failed);
-      if (node->local.redefined_extern_inline)
-	e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
-      else if (!node->local.inlinable)
-	e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
-      else if (gimple_call_cannot_inline_p (e->call_stmt))
-	e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
-      else
-	e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
-    }
-}
-
 /* Computes the frequency of the call statement so that it can be stored in
    cgraph_edge.  BB is the basic block of the call statement.  */
 int
@@ -193,7 +169,6 @@ build_cgraph_edges (void)
     }
 
   pointer_set_destroy (visited_nodes);
-  initialize_inline_failed (node);
   return 0;
 }
 
@@ -253,8 +228,8 @@ rebuild_cgraph_edges (void)
 			      bb->loop_depth);
 
       }
-  initialize_inline_failed (node);
   gcc_assert (!node->global.inlined_to);
+
   return 0;
 }
 
Index: cgraph.c
===================================================================
--- cgraph.c	(revision 145202)
+++ cgraph.c	(working copy)
@@ -652,6 +652,26 @@ cgraph_set_call_stmt (struct cgraph_edge
     }
 }
 
+/* Give initial reasons why inlining would fail on EDGE.  This gets either
+   nullified or usually overwritten by more precise reasons later.  */
+
+static void
+initialize_inline_failed (struct cgraph_edge *e)
+{
+  struct cgraph_node *callee = e->callee;
+
+  if (!callee->analyzed)
+    e->inline_failed = CIF_BODY_NOT_AVAILABLE;
+  else if (callee->local.redefined_extern_inline)
+    e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
+  else if (!callee->local.inlinable)
+    e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
+  else if (gimple_call_cannot_inline_p (e->call_stmt))
+    e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
+  else
+    e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
+}
+
 /* Create edge from CALLER to CALLEE in the cgraph.  */
 
 struct cgraph_edge *
@@ -679,15 +699,6 @@ cgraph_create_edge (struct cgraph_node *
       edge->uid = cgraph_edge_max_uid++;
     }
 
-  if (!callee->analyzed)
-    edge->inline_failed = CIF_BODY_NOT_AVAILABLE;
-  else if (callee->local.redefined_extern_inline)
-    edge->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
-  else if (callee->local.inlinable)
-    edge->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
-  else
-    edge->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
-
   edge->aux = NULL;
 
   edge->caller = caller;
@@ -721,6 +732,9 @@ cgraph_create_edge (struct cgraph_node *
       gcc_assert (!*slot);
       *slot = edge;
     }
+
+  initialize_inline_failed (edge);
+
   return edge;
 }
 
Index: testsuite/gcc.dg/winline-10.c
===================================================================
--- testsuite/gcc.dg/winline-10.c	(revision 0)
+++ testsuite/gcc.dg/winline-10.c	(revision 0)
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Winline" } */
+
+struct s { int a; };
+
+inline void f (x)	/* { dg-warning "inlining .* mismatched arg" "" } */
+     int x;
+{
+  asm ("");
+}
+
+void g (struct s x)
+{
+  f (x); 		/* { dg-warning "called from here" "" } */
+}
+
+void f (int x);		/* { dg-warning "follows non-prototype definition" } */



More information about the Gcc-patches mailing list