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

            Bug ID: 69708
           Summary: ipa inline not working for function reference in
                    static const struct
           Product: gcc
           Version: 5.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ipa
          Assignee: unassigned at gcc dot gnu.org
          Reporter: carlosjosepita at gmail dot com
  Target Milestone: ---

Please see full discussion at https://gcc.gnu.org/ml/gcc/2016-02/msg00042.html.

Here is a summary of the above:

```
typedef struct F {
  int (*call)(int);
} F;

static int g(F f, int x) {
  x = f.call(x);
  x = f.call(x);
  x = f.call(x);
  x = f.call(x);
  x = f.call(x);
  x = f.call(x);
  x = f.call(x);
  x = f.call(x);
  return x;
}

static int sq(int x) {
  return x * x;
}

static const F f = {sq};

void dosomething(int);

int h(int x) {
  dosomething(g(f, x));
  dosomething(g((F){sq}, x));
}
```

I've reported this: .

Just to summarize:

1) If early inlining is forced then fre replaces the many references to sq and
ipa inlining is able to do its job.

2) If early inlining is disabled then ipa inlining only works for the compound
literal case. The cp pass (happening immediately before the ipa inline one)
results in:

```
h (int x)
{
  ...
  _4 = g (f, x_2(D));
  dosomething (_4);
  D.1847.call = sq;
  _8 = g (D.1847, x_2(D));
  dosomething (_8);
  ....
}
```

Nevertheless ipa inline seems clever enough to expand the second call to g.

3) The proper solution seems to be that cp were able to propagate sq to both
call sites in order to make things easy to ipa inline.

Reply via email to