On Tue, Dec 13, 2016 at 5:42 PM, David Laight <david.lai...@aculab.com> wrote: > From: Alexey Dobriyan >> Sent: 13 December 2016 14:23 > ... >> Well, the point of the patch is to save .text, so might as well save >> as much as possible. Any form other than "ptr[id]" is going >> to be either bigger or bigger and slower and "ptr" should be the first field. > > You've not read and understood the next bit: > >> > However if you offset the 'id' values so that only >> > values 2 up are valid the code becomes: >> > return net->gen2->ptr[id - 2]; >> > which will be exactly the same code as: >> > return net->gen1->ptr[id]; >> > but it is much more obvious that 'id' values must be >= 2. >> > >> > The '2' should be generated from the structure offset, but with my method >> > is doesn't actually matter if it is wrong. > > If you have foo->bar[id - const] then the compiler has to add the > offset of 'bar' and subtract for 'const'. > If the numbers match no add or subtract is needed. > > It is much cleaner to do this by explicitly removing the offset on the > accesses than using a union.
Surprisingly, the trick only works if array index is cast to "unsigned long" before subtracting. Code becomes ... ptr = ng->ptr[(unsigned long)id - 3]; ... I'll post a patch when net-next reopens.