On Fri, Jun 25, 2010 at 1:02 PM, Richard Guenther <richard.guent...@gmail.com> wrote: > On Fri, Jun 25, 2010 at 12:45 PM, Eric Botcazou <ebotca...@adacore.com> wrote: >>> I do think so. >> >> Huh? What do your version and mine return for the following assignment? >> >> void foo (int i) >> { >> struct S s; >> s.a = i; >> } >> >>> Which in the following example makes i = *p not likely eliminated >>> but makes j = *q likely eliminated. >>> >>> void foo (int *p, struct X *q) >>> { >>> int i; >>> struct X j; >>> i = *p; >>> j = *q; >>> bar (&i, &q); >>> } >>> >>> That doesn't make sense. >> >> Yet that's what's supposed to be implemented, see the comment: "loads from >> parameters passed by reference". >> >>> What makes sense is that all scalar (thus gimple_reg_typed) >>> loads/stores to/from parameters or the result are free. >> >> Precisely not, they aren't free, otherwise they wouldn't exist in the first >> place. Scalar loads/stores are never free, aggregate loads/stores may be >> free if they are created only to pass the object around. > > Err. aggregate loads/stores do not appear because aggregate > uses can appear in calls. > > Scalar uses cannot appear in calls and thus you see them as > separate statements. > > Thus, > > struct X; > void bar(struct X); > void foo(struct X&x) > { > bar (x); > } > > will appear as a single call stmt while > > void bar (int); > void foo(int &x) > { > bar (x); > } > > will have a load that is not supposed to be "free"?
Thus, do you have a testcase where your patch helps? Richard. > Richard. > >> -- >> Eric Botcazou >> >