[LLVMdev] instcombine does silly things with vector x+x
Chris Lattner
clattner at apple.com
Fri Oct 28 16:04:27 PDT 2011
On Oct 28, 2011, at 2:13 PM, andrew adams wrote:
> Consider the following function which doubles a <16 x i8> vector:
>
> define <16 x i8> @test(<16 x i8> %a) {
> %b = add <16 x i8> %a, %a
> ret <16 x i8> %b
> }
>
> If I compile it for x86 with llc like so:
>
> llc paddb.ll -filetype=asm -o=/dev/stdout
>
> I get a two-op function that just does paddb %xmm0 %xmm0 and then
> returns. llc does this regardless of the optimization level. Great!
>
> If I let the instcombine pass touch it like so:
>
> opt -instcombine paddb.ll | llc -filetype=asm -o=/dev/stdout
>
> or like so:
>
> opt -O3 paddb.ll | llc -filetype=asm -o=/dev/stdout
>
> then the add gets converted to a vector left shift by 1, which then
> lowers to a much slower function with about a hundred ops. No amount
> of optimization after the fact will simplify it back to paddy.
This sounds like a really serious X86 backend performance bug. Canonicalizing "x+x" to a shift is the "right thing to do", the backend should match it.
-Chris
>
> I'm actually generating these ops in a JIT context, and I want to use
> instcombine, as it seems like a useful pass. Any idea how I can
> reliably generate the 128-bit sse version of paddb? I thought I might
> be able to force the issue with an intrinsic, but there only seems to
> be an intrinsic for the 64 bit version (llvm.x86.mmx.padd.b), and the
> saturating 128 bit version (llvm.x86.sse2.padds.b). I would just give
> up and use inline assembly, but it seems I can't JIT that.
>
> I'm using the latest llvm 3.1 from svn. I get similar behavior at
> llvm.org/demo using the following equivalent C code:
>
> #include <emmintrin.h>
> __m128i f(__m128i a) {
> return _mm_add_epi8(a, a);
> }
>
> The no-optimization compilation of this is better than the optimized version.
>
> Any ideas? Should I just not use this pass?
>
> - Andrew
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list