On 09/28/2015 05:32 PM, David Laight wrote: > From: Eric Dumazet >> Sent: 28 September 2015 15:27 >> On Mon, 2015-09-28 at 14:12 +0000, David Laight wrote: >>> From: Neil Horman >>>> Sent: 28 September 2015 14:51 >>>> On Mon, Sep 28, 2015 at 02:34:04PM +0200, Denys Vlasenko wrote: >>>>> Seemingly innocuous sctp_trans_state_to_prio_map[] array >>>>> is way bigger than it looks, since >>>>> "[SCTP_UNKNOWN] = 2" expands into "[0xffff] = 2" ! >>>>> >>>>> This patch replaces it with switch() statement. >>> >>> What about just adding 1 (and masking) before indexing the array? >>> That might require a static inline function with a local static array. >>> >>> Or define the array as (say) [16] and just mask the state before using >>> it as an index? >> >> Just let the compiler do its job, instead of obfuscating source. >> >> Compilers can transform a switch into an (optimal) table if it is really >> a gain. > > The compiler can choose between a jump table and nested ifs for a switch > statement. I've never seen it convert one into a data array index.
I don't know why people are fixated on a lookup table here. For just four possible values, the amount of generated code is less than one Icache cacheline. Instruction cachelines are efficiently prefetched and branches are predicted on all modern CPUs. Possible data access for lookup table can not be prefetched as efficiently. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html