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

            Bug ID: 88010
           Summary: noinline function alias unexpectedly inlined
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

GCC appears to ignore attribute noinline on aliases whose target is a function
declared inline and inline calls to those aliases even at -O0.  (I noticed this
while testing Glibc's uses of attributes alias and always_inline.)  If the
noinline attribute on the alias is deliberately ignored in favor of those on
its target GCC should issue a warning.  Otherwise, if the attribute on the
alias should be respected then this is a codegen bug.

$ cat t.c && gcc -O0 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout t.c
__attribute__ ((always_inline)) static inline int 
finline (void) { return 1; }

__attribute__ ((alias ("finline"))) int
alias_finline (void);

__attribute__ ((alias ("finline"))) inline int
inline_alias_finline (void);

__attribute__ ((alias ("finline"), noinline)) int
noinline_alias_finline (void);

int call_alias_finline (void)
{
  return alias_finline ();   // inlined (should it be?)
}

int call_inline_alias_finline (void)
{
  return inline_alias_finline ();   // inlined as expected
}

int call_noinline_alias_finline (void)
{
  return noinline_alias_finline ();   // unexpectedly inlined
}


;; Function finline (finline, funcdef_no=0, decl_uid=1906, cgraph_uid=1,
symbol_order=0)

__attribute__((always_inline))
finline ()
{
  int D.1924;
  int _1;

  <bb 2> :
  _1 = 1;

  <bb 3> :
<L0>:
  return _1;

}



;; Function call_alias_finline (call_alias_finline, funcdef_no=1,
decl_uid=1915, cgraph_uid=5, symbol_order=4)

call_alias_finline ()
{
  int D.1937;
  int D.1936;
  int D.1926;
  int _2;
  int _3;

  <bb 2> :
  _3 = 1;

  <bb 3> :
<L1>:
  _4 = _3;

  <bb 4> :
  _2 = _4;

  <bb 5> :
<L0>:
  return _2;

}



;; Function call_inline_alias_finline (call_inline_alias_finline, funcdef_no=2,
decl_uid=1918, cgraph_uid=6, symbol_order=5)

call_inline_alias_finline ()
{
  int D.1940;
  int D.1939;
  int D.1928;
  int _2;
  int _3;

  <bb 2> :
  _3 = 1;

  <bb 3> :
<L1>:
  _4 = _3;

  <bb 4> :
  _2 = _4;

  <bb 5> :
<L0>:
  return _2;

}



;; Function call_noinline_alias_finline (call_noinline_alias_finline,
funcdef_no=3, decl_uid=1921, cgraph_uid=7, symbol_order=6)

call_noinline_alias_finline ()
{
  int D.1943;
  int D.1942;
  int D.1930;
  int _2;
  int _3;

  <bb 2> :
  _3 = 1;

  <bb 3> :
<L1>:
  _4 = _3;

  <bb 4> :
  _2 = _4;

  <bb 5> :
<L0>:
  return _2;

}

Reply via email to