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

--- Comment #7 from Rama Malladi <rvmallad at amazon dot com> ---
I haven't been successful to create a reproducer yet. A simple `test.cc` as
follows isn't showing this behavior as the compiler inlines these irrespective
(at `-O3`).

```
#include<iostream>
#define N 30
void init_array(int *a, int x)
{
  for (int i = 0; i < N*N*N; i++)
    a[i] = i + x;
}
int D(int *arr, int n);
int C(int *a, int n)
{
  for (int i = 0; i < N*N*N; i+=8){
    n += a[i];
    < unrolled 8 times>
}   
  return D(a,n);
}

int B(int *arr, int n)
{
  int result = n;
  for (int i = 0; i < N*N*N; i++)
    result += arr[i];
  result = C(arr, result);
  return result;
}
int D(int *arr, int n)
{
  <large function body>
}
int A(int *arr, int x)
{
  int callerResult = x;
  if (x > 99000)
    callerResult += B(arr, x);
  return callerResult;
}
int main(int argc, char* argv[])
{
  int arr[N*N*N];
  int outval = atoi(argv[1]);
  init_array(arr, 2);
  for(int i=0; i<100000; i++)
    outval += A(arr, i);
  for(int i=0; i<100000; i++)
    outval += C(arr, outval);
  outval += D(arr, outval);
  std::cout<<outval<<std::endl;
  return 0;
}
```

Here are some diagnostic prints. Expected behavior that `B` and `D` are less
often called and hence not inlined into `main`. I was also expecting that `C`
and `D` wouldn't be inlined into `B`. But this wasn't the case.

```
test.cc:21:10: missed:   not inlinable: int main(int, char**)/546 -> int
D(int*, int)/544, call is unlikely and code size would grow
test.cc:70:19: missed:   not inlinable: int main(int, char**)/546 -> int
B(int*, int)/543, call is unlikely and code size would grow

test.cc:38:15: optimized:  Inlined int C(int*, int)/1240 into int B(int*,
int)/543 which now has time 8335.001846 and size 91, net change of +42.
test.cc:21:10: optimized:  Inlined int D(int*, int)/1241 into int C(int*,
int)/542 which now has time 12282.002762 and size 127, net change of +78.
```

I will continue to attempt creating a stand-alone test-case or if get a
compilation unit extracted from the MySQL code itself and upload it.

Reply via email to