[LLVMbugs] [Bug 11289] New: Inefficient x86 vector code generation for compare less than 0

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue Nov 1 13:09:55 PDT 2011


http://llvm.org/bugs/show_bug.cgi?id=11289

             Bug #: 11289
           Summary: Inefficient x86 vector code generation for compare
                    less than 0
           Product: libraries
           Version: trunk
          Platform: Macintosh
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Backend: X86
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: fbossen at gmail.com
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified


Code generated for a vector comparison to zero is inefficient.

For example the C code below creates mask where each result vector element is
equal to -1 if the input vector element is negative, and 0 otherwise.

#include <emmintrin.h>

void test(__m128i* p)
{
  *p = _mm_cmplt_epi8(*p, _mm_setzero_si128());
}

Using http://llvm.org/demo/index.cgi the generated LLVM assembly is

; ModuleID = '/tmp/webcompile/_11830_0.bc'
target datalayout =
"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"

define void @test(<2 x i64>* nocapture %p) nounwind {
  %1 = load <2 x i64>* %p, align 16, !tbaa !0
  %2 = bitcast <2 x i64> %1 to <16 x i8>
  %.lobit.i.i = ashr <16 x i8> %2, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,
i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
  %3 = bitcast <16 x i8> %.lobit.i.i to <2 x i64>
  store <2 x i64> %3, <2 x i64>* %p, align 16, !tbaa !0
  ret void
}

!0 = metadata !{metadata !"omnipotent char", metadata !1}
!1 = metadata !{metadata !"Simple C/C++ TBAA", null}

where the comparison < 0 is replaced by >> 7

Alternatively the vector comparison could also be written as

define <16 x i8> @test(<16 x i8> %a) {
       %b = icmp sgt <16 x i8> zeroinitializer, %a
       %c = sext <16 x i1> %b to <16 x i8>
       ret <16 x i8> %c
}

In both cases the generated code is convoluted where individual vector elements
are extracted using pextrb instructions, shifted using sarb instructions, and
reinserted using pinsrb instructions.

This was tested using r143475 from trunk.

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list