On Sun, Feb 5, 2017 at 11:06 AM, Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx> wrote: > + if (IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) || > + !((unsigned long)b & (__alignof__(*b) - 1))) Why not simply use the IS_ALIGNED macro? Also, are you might consider checking to see if this is a constant, so that you can avoid an unnecessary branch. Alternatively, if you want to use the branch, I'd be interested in you writing back saying, "I tested both cases, and branching is faster than always using the slow unaligned path." > + while (((unsigned long)dst & (relalign - 1)) && len > 0) { IS_ALIGNED > +static inline void crypto_xor(u8 *dst, const u8 *src, unsigned int size) > +{ > + if (IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && > + __builtin_constant_p(size) && > + (size % sizeof(unsigned long)) == 0) { You can expand this condition to be: if ( (is_constant(size) && size%sizeof(ulong)==0) && (efficient_unaligned || (is_constant(dst) && is_constant(src) && is_aligned(dst) && is_aligned(src))) ) It might seem complex, but it all gets compiled out.