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

--- Comment #9 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
With early VRP (but also without) the inliner seems to now suffer from extreme
roundoff errors at badness.  With VRP the first uninlined function still has
badness 0:

Considering std::_Bit_reference& std::_Bit_reference::operator=(bool)/797 with
15 size
 to be inlined into <built-in>/47767 in /aux/hubicka/tramp3d-v4.cpp:38764
 Estimated badness is 0, frequency 0.71.
    Badness calculation for <built-in>/47767 -> std::_Bit_reference&
std::_Bit_reference::operator=(bool)/797
      size growth 8, time 5 inline hints: declared_inline
      0: guessed profile. frequency 0.709000, benefit 0.002000%, time w/o
inlining 500006, time w inlining 499996 overall growth 612 (current) 398
(original)
  not inlinable: <built-in>/47767 -> std::_Bit_reference&
std::_Bit_reference::operator=(bool)/797, --param inline-unit-growth limit
reached
   Estimating body: std::basic_ostream<char, _Traits>&
std::operator<<(std::basic_ostream<char, _Traits>&, const char*) [with _Traits
= std::char_traits<char>]/2076
   Known to be false: not inlined, op1 == 0B, op1 changed
   size:7 time:22

so inline decisions are basically random.  I tuned this few times, but it is
hard to balance the fixpoint arithmetic to not get into 0.  The function in
question is very small, but there are too many of them.

I wonder if we can't switch inliner to std::priority_queue and use sreal to
drive the priority queue? Or one can hold fractions and compare in wide int
calculations.

Reply via email to