https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81921

            Bug ID: 81921
           Summary: Fails to always-inline intrinsics with -flto
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Keywords: lto, rejects-valid
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
  Target Milestone: ---
            Target: x86_64-*-*, i?86-*-*

With -flto free_lang_data forces a DECL_FUNCTION_SPECIFIC_TARGET node if not
set
(target_option_default_node).  The way ix86_can_inline_p works this causes
behavioral differences for

extern __inline int  __attribute__((__gnu_inline__, __always_inline__,
__artificial__, target("sse2")))
_mm_loadu_si128 (int const *__P)
{
    return *__P;
}   

void __attribute__((target("ssse3"))) foo (void *p)
{
  volatile int x = _mm_loadu_si128 (p);
}

with -m32 vs. -m32 -flto.  The following fixes it (and allows free-lang-data
to be turned on unconditionally).

Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c  (revision 251266)
+++ config/i386/i386.c  (working copy)
@@ -7507,12 +7507,12 @@ ix86_can_inline_p (tree caller, tree cal
   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);

   /* If callee has no option attributes, then it is ok to inline.  */
-  if (!callee_tree)
+  if (!callee_tree || callee_tree == target_option_default_node)
     ret = true;

   /* If caller has no option attributes, but callee does then it is not ok to
      inline.  */
-  else if (!caller_tree)
+  else if (!caller_tree && caller_tree != target_option_default_node)
     ret = false;

   else

Reply via email to