Hi,
On Tue, Nov 12 2019, Jan Hubicka wrote:
> Also note that there is a long standing problem with inlining ipacp
> clones. This can be shown on the following example:
>
> struct a {int a;};
> static int foo (struct a a)
> {
> return a.a;
> }
> __attribute__ ((noinline))
> static int bar (struct a a)
> {
> return foo(a);
> }
> main()
> {
> struct a a={1};
> return bar (a);
> }
>
> Now if you compile it with -O2 -fno-early-inlining ipacp correctly
> determines constants:
>
> Estimating effects for bar/1.
> Estimating body: bar/1
> Known to be false:
> size:6 time:14.000000 nonspec time:14.000000
> - context independent values, size: 6, time_benefit: 0.000000
> Decided to specialize for all known contexts, code not going to grow.
> Setting dest_lattice to bottom, because type of param 0 of foo is NULL or
> unsuitable for bits propagation
>
> Estimating effects for foo/0.
> Estimating body: foo/0
> Known to be false: op0[offset: 0] changed
> size:3 time:2.000000 nonspec time:3.000000
> - context independent values, size: 3, time_benefit: 1.000000
> Decided to specialize for all known contexts, code not going to grow.
>
>
> Yet the intended tranformation to "return 1" does not happen:
>
> __attribute__((noinline))
> bar.constprop (struct a a)
> {
> int a$a;
>
> <bb 2> [local count: 1073741824]:
> a$a_5 = a.a;
> return a$a_5;
>
> }
>
>
>
> ;; Function main (main, funcdef_no=2, decl_uid=1937, cgraph_uid=3,
> symbol_order=2) (executed once)
>
> main ()
> {
> struct a a;
> int _3;
>
> <bb 2> [local count: 1073741824]:
> a.a = 1;
> _3 = bar.constprop (a); [tail call]
> a ={v} {CLOBBER};
> return _3;
>
> }
>
> The problem here is that foo get inlined into bar and we never apply
> ipcp transform on foo, so a.a never gets constant propagated.
Ugh, we never... what? That is quite bad, how come we don't have PR
about this?
>
> For value ranges this works since late passes are able to propagate
> constants from value ranges we attach to the default def SSA names. I
Well, there are no SSA names for parts of aggregates.
> think correct answer here is to do no subtitution in in ipa-prop.c
> transform function. Rather note the known values for late passes and
> let FRE do its job.
And where would you like to save it? Do a load at the beginning of the
function? My thinking was that it is better to modify the IL rather
than storing stuff to ad-hoc on-the-side data structures.
Martin