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

Martin Liška <marxin at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jamborm at gcc dot gnu.org
           Assignee|marxin at gcc dot gnu.org          |unassigned at gcc dot 
gnu.org

--- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> ---
Interesting problem, first we IPA CP creates a clone:

Evaluating opportunities for calcPercent/34.
 - considering value "" for param #1 const char * (caller_count: 1)
     good_cloning_opportunity_p (time: 2, size: 12, freq_sum: 4532) ->
evaluation: 755, threshold: 500
  Creating a specialized node of calcPercent/34.
    adding an extra known polymorphic context     Speculative outer type:struct
Position (or a derived type) at offset 0 for param #0 struct Combined * const
    replacing param #1 const char * with const ""
                Accounting size:3.00, time:2.85 on predicate:(true)
                Accounting size:4.00, time:2.85 on new predicate:(not inlined)
                Accounting size:1.00, time:1.00 on new predicate:(op2 changed)
                Accounting size:1.00, time:10.00 on new predicate:(op2 changed
|| op3 changed)
     the new node is calcPercent.constprop/69.
     known ctx 0 is     Speculative outer type:struct Position (or a derived
type) at offset 0

Which is fine. Then we inline the function:

Considering calcPercent.constprop/69 with 12 size
 to be inlined into _ZThn8_N8Combined11calcPercentEPKcii.artificial_thunk.1/70
in unknown:-1
 Estimated badness is -5.611048, frequency 4.53.
    Badness calculation for
_ZThn8_N8Combined11calcPercentEPKcii.artificial_thunk.1/70 ->
calcPercent.constprop/69
      size growth 7, time 26 inline hints: declared_inline big_speedup
      -0.175345: guessed profile. frequency 4.532000, count 0 caller count 0
time w/o inlining 318.428000, time w/ inlining 259.512000 overall growth -5
(current) -5 (original) -5 (compensated)
      Adjusted by hints -5.611048
                Accounting size:3.00, time:12.90 on predicate:(true)
                Accounting size:1.00, time:4.53 on predicate:(true)
                Accounting size:1.00, time:45.32 on predicate:(true)
Processing frequency calcPercent.constprop
  Called by _ZThn8_N8Combined11calcPercentEPKcii.artificial_thunk.1 that is
normal or hot
 Inlined into _ZThn8_N8Combined11calcPercentEPKcii.artificial_thunk.1 which now
has time 12 and size 5, net change of -5.
New minimal size reached: 95

The caller is inline copy in main:
Function _ZThn8_N8Combined11calcPercentEPKcii.artificial_thunk.1/70 is inline
copy in main/37

And somewhere here there must be a function signature discrepancy because we
end in ltrans with:

  <bb 5> [67.99%]:
  _47 = _16 + 18446744073709551608;
  pos_40 = (int) "";
  _41 = pos_40 * 100;
  percent_42 = _41 / pos_15;
  _43 = MEM[(struct Combined *)_47].m_percent;
  if (percent_42 != _43)
    goto <bb 6>; [69.50%]
  else
    goto <bb 8>; [30.50%]

Note that original function does:

    void calcPercent( const char *name,int pos,int size )
    {
      int percent = 100*pos/size;
      if( percent!=m_percent )
        m_percent = percent;
    }

So arguments are shifted by one. Martin can you please take a look?

Reply via email to