This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

question about inlining


While testing a libstdc++ patch that relies on inlining to
expose a GCC limitation I noticed that the same member function
of a class template is inlined into one function in the test but
not into the other, even though it is inlined into each if each
is compiled separately (i.e., in a file on its own).

I wasn't aware that inlining decisions made in one function could
affect those in another, or in the whole file.  Is that expected?
And if yes, what's the rationale?

Here's a simplified test case.  When compiled with -O2 or -O3
and either just -DFOO or just -DBAR, the call to vector::resize()
and all the functions called from it, including (crucially)
vector::_M_default_append, are inlined.  But when compiled with
-DFOO -DBAR _M_default_append is not inlined.  With a somewhat
more involved test case I've also seen the first call inlined
but not the second, which was also surprising to me.

  #include <vector>

  void sink (std::vector<int>&);

  #if FOO
  void foo (unsigned n)
  {
    std::vector<int> a;
    a.resize (n);
    sink (a);
  }
  #endif

  #if BAR
  void bar (unsigned long n)
  {
    std::vector<int> a;
    a.resize (n);
    sink (a);
  }
  #endif

Thanks
Martin


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]