On Thu, Dec 11, 2014 at 10:52 PM, Eric Botcazou <ebotca...@adacore.com> wrote: >> Note that I think the place of the check is unfortunate as you for example >> will not remove the argument if it is unused. In fact I'm not yet sure >> what transform exactly we are disabling. I am guessing we are >> passing an aggregate by value that resides at a bit-aligned offset >> of some outer object: >> >> foo (x.aggr); >> >> and the function then does >> >> foo (Aggr a) >> { >> int i = a.foo; >> ... >> } >> >> thus use only a part of the aggregate. Then IPA SRA would like to >> pass x.aggr.foo instead of x.aggr and thus tries to materialize a >> load from x.aggr.foo at all callers but fails to do that in a valid way. > > Right, it's the usual MEM_EXPR business creating ADDR_EXPRs out of nowhere and > miserably failing on something not addressable.
Well, I call it a convenience that MEM_EXPR, unlike INDIRECT_REF, can be used to encapsulate an arbitrary byte-offset and view-conversion. Of course it's still a dereference of an address so that convenience doesn't work on sth non-addressable. >> Erics fix did, at all callers >> >> Aggr tem = x.aggr; >> foo (tem.foo); >> >> ? > > Yes, because the code wants to take &tem afterwards. > >> While we should be able to simply do >> >> foo (BIT_FIELD_REF <x.aggr, .....>) >> >> with the appropriate bit offset and size? (if that's of register type >> you need to do the load in a separate stmt of couse). >> >> Thus similar to Erics fix but avoiding the aggregate copy. > > Yes, that should be doable, but I'm not sure it's worth the hassle. I'll leave that to you two to decide - Martins patch is ok if you are fine with disabling the optimization (also removing an unused parameter). Thanks, Richard. > -- > Eric Botcazou