re PR c/71969 (Wrong setting of DECL_DISREGARD_INLINE_LIMITS in the C FE)
authorJakub Jelinek <jakub@redhat.com>
Fri, 29 Jul 2016 12:00:43 +0000 (14:00 +0200)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 29 Jul 2016 12:00:43 +0000 (12:00 +0000)
PR c/71969
* c-decl.c (finish_function): Only set DECL_DISREGARD_INLINE_LIMITS
on GNU extern inline functions.

* gcc.dg/alias-11.c (add_cfi, new_cfi): Change __inline__ to
static __inline__.
* gcc.dg/pr71969-1.c: New test.
* gcc.dg/pr71969-2.c: New test.
* gcc.dg/pr71969-3.c: New test.

From-SVN: r238862

gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/alias-11.c
gcc/testsuite/gcc.dg/pr71969-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr71969-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr71969-3.c [new file with mode: 0644]

index a47b8a3b5edf4ef51c73cc5078ce8c766ceb1795..d512a3da482766cc12615a7694e815dc58396805 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/71969
+       * c-decl.c (finish_function): Only set DECL_DISREGARD_INLINE_LIMITS
+       on GNU extern inline functions.
+
 2016-07-29  Marek Polacek  <polacek@redhat.com>
 
        PR c/71583
index 41aabeb2972cf74f7b6316aea2193b0dac475bcd..f2773c5bb7287883e90681aad1b77412f6ab9073 100644 (file)
@@ -9262,7 +9262,9 @@ finish_function (void)
 
   /* For GNU C extern inline functions disregard inline limits.  */
   if (DECL_EXTERNAL (fndecl)
-      && DECL_DECLARED_INLINE_P (fndecl))
+      && DECL_DECLARED_INLINE_P (fndecl)
+      && (flag_gnu89_inline
+         || lookup_attribute ("gnu_inline", DECL_ATTRIBUTES (fndecl))))
     DECL_DISREGARD_INLINE_LIMITS (fndecl) = 1;
 
   /* Genericize before inlining.  Delay genericizing nested functions
index c1df9e98b1a1b5ebeadc925d99ca0b01c2abd68d..1bc34b96395cb4c85226dcf0139e8caedbb0641e 100644 (file)
@@ -1,3 +1,12 @@
+2016-07-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/71969
+       * gcc.dg/alias-11.c (add_cfi, new_cfi): Change __inline__ to
+       static __inline__.
+       * gcc.dg/pr71969-1.c: New test.
+       * gcc.dg/pr71969-2.c: New test.
+       * gcc.dg/pr71969-3.c: New test.
+
 2016-07-29  Marek Polacek  <polacek@redhat.com>
 
        PR c/71574
index 36175d7c25a80256b68c8b07eae3707fe17f742e..7629c6c7d1a1ed44e6f244f533b97fd9c1398288 100644 (file)
@@ -24,7 +24,7 @@ dw_cfi_node *cie_cfi_head;
 unsigned fde_table_in_use;
 dw_fde_node *fde_table;
 
-__inline__ void
+static __inline__ void
 add_cfi (dw_cfi_node **list_head, dw_cfi_node *cfi)
 {
   dw_cfi_node **p;
@@ -35,7 +35,7 @@ add_cfi (dw_cfi_node **list_head, dw_cfi_node *cfi)
   *p = cfi;
 }
 
-__inline__ struct dw_cfi_struct *
+static __inline__ struct dw_cfi_struct *
 new_cfi (void)
 {
   dw_cfi_node *cfi = (dw_cfi_node *) malloc (sizeof (dw_cfi_node));
diff --git a/gcc/testsuite/gcc.dg/pr71969-1.c b/gcc/testsuite/gcc.dg/pr71969-1.c
new file mode 100644 (file)
index 0000000..a39b05e
--- /dev/null
@@ -0,0 +1,37 @@
+/* PR c/71969 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fno-gnu89-inline -O2 -fdump-tree-einline-details" } */
+
+volatile int v;
+#define S v++;
+#define S10 S S S S S S S S S S
+#define S100 S10 S10 S10 S10 S10 S10 S10 S10 S10 S10
+
+extern inline void
+foo (void) { S100 }
+
+inline void
+bar (void) { S100 }
+
+static inline void
+baz (void) { S100 }
+
+int
+main ()
+{
+  foo ();
+  foo ();
+  foo ();
+  foo ();
+  bar ();
+  bar ();
+  bar ();
+  bar ();
+  baz ();
+  baz ();
+  baz ();
+  baz ();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "will not early inline" 12 "einline" } } */
diff --git a/gcc/testsuite/gcc.dg/pr71969-2.c b/gcc/testsuite/gcc.dg/pr71969-2.c
new file mode 100644 (file)
index 0000000..f434fd0
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR c/71969 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fno-gnu89-inline -O2 -fdump-tree-einline-details" } */
+
+volatile int v;
+#define S v++;
+#define S10 S S S S S S S S S S
+#define S100 S10 S10 S10 S10 S10 S10 S10 S10 S10 S10
+
+extern inline __attribute__((gnu_inline)) void
+foo (void) { S100 }
+
+int
+main ()
+{
+  foo ();
+  foo ();
+  foo ();
+  foo ();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "Inlining foo into main" 4 "einline" } } */
diff --git a/gcc/testsuite/gcc.dg/pr71969-3.c b/gcc/testsuite/gcc.dg/pr71969-3.c
new file mode 100644 (file)
index 0000000..583d89d
--- /dev/null
@@ -0,0 +1,38 @@
+/* PR c/71969 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fgnu89-inline -O2 -fdump-tree-einline-details" } */
+
+volatile int v;
+#define S v++;
+#define S10 S S S S S S S S S S
+#define S100 S10 S10 S10 S10 S10 S10 S10 S10 S10 S10
+
+extern inline void
+foo (void) { S100 }
+
+inline void
+bar (void) { S100 }
+
+static inline void
+baz (void) { S100 }
+
+int
+main ()
+{
+  foo ();
+  foo ();
+  foo ();
+  foo ();
+  bar ();
+  bar ();
+  bar ();
+  bar ();
+  baz ();
+  baz ();
+  baz ();
+  baz ();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "will not early inline" 8 "einline" } } */
+/* { dg-final { scan-tree-dump-times "Inlining foo into main" 4 "einline" } } */