diff --git a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index e950e072bc7..8916e082066 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -787,7 +787,17 @@ void DAGTypeLegalizer::SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo, break; } case TargetLowering::TypePromoteInteger: { - SDValue InOp = GetPromotedInteger(N->getOperand(0)); + SDValue InOp; + if (N->getOpcode() == ISD::SIGN_EXTEND || + N->getOpcode() == ISD::SINT_TO_FP) { + InOp = SExtPromotedInteger(N->getOperand(0)); + } else if ( + N->getOpcode() == ISD::ZERO_EXTEND || + N->getOpcode() == ISD::UINT_TO_FP) { + InOp = ZExtPromotedInteger(N->getOperand(0)); + } else { + InOp = GetPromotedInteger(N->getOperand(0)); + } EVT InNVT = EVT::getVectorVT(*DAG.getContext(), InOp.getValueType().getVectorElementType(), LoVT.getVectorNumElements()); @@ -2189,8 +2199,7 @@ SDValue DAGTypeLegalizer::WidenVecOp_SETCC(SDNode *N) { SDValue CC = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, ResVT, WideSETCC, DAG.getIntPtrConstant(0)); - // Convert the result mask to the correct kind. - return DAG.getAnyExtOrTrunc(CC, dl, N->getValueType(0)); + return PromoteTargetBoolean(CC, N->getValueType(0)); } diff --git a/test/CodeGen/X86/2011-20-21-zext-ui2fp.ll b/test/CodeGen/X86/2011-20-21-zext-ui2fp.ll new file mode 100644 index 00000000000..75efcf5ac47 --- /dev/null +++ b/test/CodeGen/X86/2011-20-21-zext-ui2fp.ll @@ -0,0 +1,19 @@ +; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s +target triple = "x86_64-unknown-linux-gnu" + +; Check that the booleans are converted using zext and not via sext. +; 0x1 means that we only look at the first bit. + +;CHECK: 0x1 +;CHECK: ui_to_fp_conv +;CHECK: ret +define void @ui_to_fp_conv(<8 x float> * nocapture %aFOO, <8 x float>* nocapture %RET) nounwind { +allocas: + %bincmp = fcmp olt <8 x float> , + %bool2float = uitofp <8 x i1> %bincmp to <8 x float> + store <8 x float> %bool2float, <8 x float>* %RET, align 4 + ret void +} + + +