[LLVMdev] LLVM error in PMINSD or PMAXSD when combined with LTO

Christopher Kulla ckulla at gmail.com
Thu Jul 3 10:42:50 PDT 2014


Hello all,

I am reporting this here since it is displayed as an LLVM error, but
let me know if it is a clang issue instead. Here is the repro case:

#include <smmintrin.h>

int main() {
    __m128i a = _mm_set1_epi32(2);
    __m128i b = _mm_set1_epi32(1);
    __m128i c = _mm_min_epi32(a, b); // or _mm_max_epi32
    return c[0] == 0; // just so c doesn't opt away
}

And here is the error that occurs when compiling with "clang -flto
-msse4.1 test.c":

LLVM ERROR: Cannot select: 0x1d866d0: v4i32 = X86ISD::SMIN 0x1d85dd0,
0x1d89410 [ORD=1] [ID=16]
  0x1d85dd0: v4i32 = bitcast 0x1d85cd0 [ORD=1] [ID=14]
    0x1d85cd0: v2i64,ch = load 0x1d560f8, 0x1d89310,
0x1d860d0<LD16[ConstantPool]> [ORD=1] [ID=12]
      0x1d89310: i64 = X86ISD::Wrapper 0x1d85fd0 [ID=10]
        0x1d85fd0: i64 = TargetConstantPool<<4 x i32> <i32 2, i32 2,
i32 2, i32 2>> 0 [ID=6]
      0x1d860d0: i64 = undef [ID=5]
  0x1d89410: v4i32 = bitcast 0x1d85ed0 [ORD=1] [ID=15]
    0x1d85ed0: v2i64,ch = load 0x1d560f8, 0x1d89510,
0x1d860d0<LD16[ConstantPool]> [ORD=1] [ID=13]
      0x1d89510: i64 = X86ISD::Wrapper 0x1d862d0 [ID=11]
        0x1d862d0: i64 = TargetConstantPool<<4 x i32> <i32 1, i32 1,
i32 1, i32 1>> 0 [ID=7]
      0x1d860d0: i64 = undef [ID=5]

However everything works as expected without "-flto".

I've reproduced this in LLVM 3.4.2 as well as the trunk (built a few
days ago) on Linux and OS X.

Thanks for your help!

-Chris



More information about the llvm-dev mailing list