From a054bcb4cf26f9710bf6b7b256ba7313260a7335 Mon Sep 17 00:00:00 2001 From: Nadav Rotem Date: Fri, 21 Oct 2011 17:35:19 +0000 Subject: 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 --- lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'lib/CodeGen') diff --git a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index e950e072bc..8916e08206 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)); } -- cgit v1.2.3