forked from OSchip/llvm-project
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. llvm-svn: 142660
This commit is contained in:
parent
e6d88c9a51
commit
5e00bb5feb
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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> <float 1.000000e+00, float 1.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00> , <float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00>
|
||||
%bool2float = uitofp <8 x i1> %bincmp to <8 x float>
|
||||
store <8 x float> %bool2float, <8 x float>* %RET, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue