diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -7454,8 +7454,15 @@ Type *Ty = CDS->getType(); Mask = APInt::getZero(Ty->getPrimitiveSizeInBits()); unsigned EltBits = CDS->getElementType()->getPrimitiveSizeInBits(); - for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I) - Mask.insertBits(CDS->getElementAsAPInt(I), I * EltBits); + if (isa(CDS->getElementType())) { + for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I) + Mask.insertBits(CDS->getElementAsAPInt(I), I * EltBits); + } else { + // Assume floating points + for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I) + Mask.insertBits(CDS->getElementAsAPFloat(I).bitcastToAPInt(), + I * EltBits); + } return true; } return false;