On 16.09.2013 18:20, Richard Henderson wrote: > On 09/16/2013 12:42 AM, Claudio Fontana wrote: >>> + /* Hoist the loads of the most common arguments. */ >>>> + TCGArg a0 = args[0]; >>>> + TCGArg a1 = args[1]; >>>> + TCGArg a2 = args[2]; >>>> + int c2 = const_args[2]; >>>> + >> Either all or none (add c0, c1), I would expect the compiler not to >> generate code for the paths that don't use C[n]. > > I chose the most common. Those used in 90% of all of the cases.
What you did is clear, does not change the fact that the mixing of use of the variables and args[] is confusing. So either we add int c0 and int c1, and use the hoisted variables exclusively later, or we don't do it. >> Btw, if the compiler generates bloated code without this, we should notify >> the projects working on gcc for aarch64. > > It's not the compiler's fault. After parameter decomposition, the arrays > become pointers, and the compiler can't tell that it's always safe to perform > the loads. So in general it can't hoist the loads higher than the first > explicit reference that proves the pointers must be non-null. > > Now that I think about it, we might actually do better, generically, to > package > all of these arguments up into a struct. The compiler can more easily reason > about the collective safety of structure access... I don't have anything against it in principle, but just adding c0 and c1, which iirc should cover all uses, would be fine by me. Claudio