From: Nadav Rotem Date: Fri, 21 Oct 2011 17:35:19 +0000 (+0000) Subject: Fix pr11194. When promoting and splitting integers we need to use X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a054bcb4cf26f9710bf6b7b256ba7313260a7335;p=oota-llvm.git Fix pr11194. When promoting and splitting integers we need to use ZExtPromotedInteger and SExtPromotedInteger based on the operation we legalize. SetCC return type needs to be legalized via PromoteTargetBoolean. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142660 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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 +} + + +