c-decl.c (finish_function): Always defer if DECL_DECLARED_INLINE_P.
authorRichard Henderson <rth@redhat.com>
Wed, 26 Mar 2003 22:53:37 +0000 (14:53 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 26 Mar 2003 22:53:37 +0000 (14:53 -0800)
        * c-decl.c (finish_function): Always defer if DECL_DECLARED_INLINE_P.
* gcc.dg/inline-4.c: New.

From-SVN: r64906

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/gcc.dg/inline-4.c [new file with mode: 0644]

index 6aba36fde217dfd223f16648ce90a73e428a1ad5..676400029bd624049dcabb84f9e33229220b04bb 100644 (file)
@@ -1,3 +1,7 @@
+2003-03-26  Richard Henderson  <rth@redhat.com>
+
+       * c-decl.c (finish_function): Always defer if DECL_DECLARED_INLINE_P.
+
 2003-03-26  Roger Sayle  <roger@eyesopen.com>
 
        PR bootstrap/10051, PR bootstrap/10169.
index 52b42a18c06b3323700c0fd3e50746b62d5b0ce1..d52823bde97b3e74eeb71bbc04f13d20ffd2f67c 100644 (file)
@@ -6460,8 +6460,13 @@ finish_function (nested, can_defer_p)
             function completely.  */
          timevar_push (TV_INTEGRATION);
          uninlinable = ! tree_inlinable_function_p (fndecl, 0);
-         
-         if (! uninlinable && can_defer_p
+
+         if (can_defer_p
+             /* We defer functions marked inline *even if* the function
+                itself is not inlinable.  This is because we don't yet
+                know if the function will actually be used; we may be
+                able to avoid emitting it entirely.  */
+             && (! uninlinable || DECL_DECLARED_INLINE_P (fndecl))
              /* Save function tree for inlining.  Should return 0 if the
                 language does not support function deferring or the
                 function could not be deferred.  */
diff --git a/gcc/testsuite/gcc.dg/inline-4.c b/gcc/testsuite/gcc.dg/inline-4.c
new file mode 100644 (file)
index 0000000..2442f2d
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not "big_static_inline" } } */
+
+extern void f(void);
+static inline void big_static_inline(void)
+{
+  f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+  f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+  f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+  f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+  f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+  f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+  f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+  f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+  f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+  f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+}