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

--- Comment #2 from luoxhu at gcc dot gnu.org ---
(In reply to Richard Biener from comment #1)
> Looks related to PR99991 - we do an IPA SRA clone but fail to inline it and
> thus we end up with
> 
> void d.isra ()
> {
>   int D.1980;
>   int g.2_1;
> 
>   <bb 2> [local count: 10631108]:
> 
>   <bb 3> [local count: 96646437]:
>   g.2_1 = 0;
>   if (g.2_1 != 0)
>     goto <bb 3>; [89.00%]
>   else
>     goto <bb 4>; [11.00%]
> 
>   <bb 4> [local count: 1073741824]:
>   foo ();
>   goto <bb 4>; [100.00%]
> 
> }
> 
> int main ()
> {
>   int a.0_2;
>   int b.1_3;
> 
>   <bb 2> [local count: 59461674]:
>   goto <bb 6>; [100.00%]
> 
>   <bb 3> [local count: 1014686025]:
>   a.0_2 = a;
>   if (a.0_2 == 0)
>     goto <bb 4>; [99.96%]
>   else
>     goto <bb 5>; [0.04%]
> 
>   <bb 4> [local count: 1014280151]:
>   // predicted unlikely by continue predictor.
>   goto <bb 6>; [100.00%]
> 
>   <bb 5> [local count: 405874]:
>   d.isra ();
> 
>   <bb 6> [local count: 1073741824]:
>   b.1_3 = b;
>   if (b.1_3 != 0)
>     goto <bb 3>; [94.50%]
>   else
>     goto <bb 7>; [5.50%]
> 
>   <bb 7> [local count: 59055800]:
>   return 0;
> 
> }
> 
> where we optimize main to 'return 0' but fail to elide the unused d.isra.
> 
> So also a dup of the cases where a late IPA function reclaim is missing.

early_inliner inlines e to main in -O3 due to param_early_inlining_insns is 14
for O3, but it is 6 for -O2, so want_early_inline_function_p returns different.

Then ipa-inline fails to inline d.isra by inline_functions_called_once as it is
called by two callees e->d.isra and main->d.isra.

But The two d.isra calls are removed by gimple 102t.ccp2 pass after all ipa
passes:


pr100034.O3.c.103t.objsz1:

;; Function d.isra (d.isra.0, funcdef_no=4, decl_uid=2014, cgraph_uid=7,
symbol_order=10) (executed once)

void d.isra ()
{
  int D.2016;

  <bb 2> [local count: 10631108]:

  <bb 3> [local count: 1073741824]:
  foo ();
  goto <bb 3>; [100.00%]

}



;; Function e (e, funcdef_no=2, decl_uid=1994, cgraph_uid=3, symbol_order=6)

void e ()
{
  <bb 2> [local count: 59461674]:
  return;

}



;; Function main (main, funcdef_no=3, decl_uid=1999, cgraph_uid=4,
symbol_order=7) (executed once)

int main ()
{
  <bb 2> [local count: 59461674]:
  return 0;

} 

Currently all IPA passes are run before gimple optimizations, is it possible to
run some passes like pass_rebuild_cgraph_edges and pass_ipa_remove_symbols
after some gimple optimisations expose new opertunities?

Reply via email to