forked from OSchip/llvm-project
Fix using wrong result type for setcc.
When reducing the bitwidth of a comparison against a constant, the original setcc's result type was used, which was incorrect. No test since I don't think any other in tree targets change the bitwidth of the setcc type depending on the bitwidth of the compared type. llvm-svn: 208236
This commit is contained in:
parent
4b4401de83
commit
5f2fd4b22a
|
@ -557,6 +557,11 @@ public:
|
|||
/// value assuming it was the smaller SrcTy value.
|
||||
SDValue getZeroExtendInReg(SDValue Op, SDLoc DL, EVT SrcTy);
|
||||
|
||||
/// getBoolExtOrTrunc - Convert Op, which must be of integer type, to the
|
||||
/// integer type VT, by using an extension appropriate for the target's
|
||||
/// BooleanContent or truncating it.
|
||||
SDValue getBoolExtOrTrunc(SDValue Op, SDLoc SL, EVT VT);
|
||||
|
||||
/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
|
||||
SDValue getNOT(SDLoc DL, SDValue Val, EVT VT);
|
||||
|
||||
|
|
|
@ -963,6 +963,14 @@ SDValue SelectionDAG::getZExtOrTrunc(SDValue Op, SDLoc DL, EVT VT) {
|
|||
getNode(ISD::TRUNCATE, DL, VT, Op);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getBoolExtOrTrunc(SDValue Op, SDLoc SL, EVT VT) {
|
||||
if (VT.bitsLE(Op.getValueType()))
|
||||
return getNode(ISD::TRUNCATE, SL, VT, Op);
|
||||
|
||||
TargetLowering::BooleanContent BType = TLI->getBooleanContents(VT.isVector());
|
||||
return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getZeroExtendInReg(SDValue Op, SDLoc DL, EVT VT) {
|
||||
assert(!VT.isVector() &&
|
||||
"getZeroExtendInReg should use the vector element type instead of "
|
||||
|
|
|
@ -1382,10 +1382,14 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
|||
EVT newVT = N0.getOperand(0).getValueType();
|
||||
if (DCI.isBeforeLegalizeOps() ||
|
||||
(isOperationLegal(ISD::SETCC, newVT) &&
|
||||
getCondCodeAction(Cond, newVT.getSimpleVT())==Legal))
|
||||
return DAG.getSetCC(dl, VT, N0.getOperand(0),
|
||||
DAG.getConstant(C1.trunc(InSize), newVT),
|
||||
Cond);
|
||||
getCondCodeAction(Cond, newVT.getSimpleVT()) == Legal)) {
|
||||
EVT NewSetCCVT = getSetCCResultType(*DAG.getContext(), newVT);
|
||||
SDValue NewConst = DAG.getConstant(C1.trunc(InSize), newVT);
|
||||
|
||||
SDValue NewSetCC = DAG.getSetCC(dl, NewSetCCVT, N0.getOperand(0),
|
||||
NewConst, Cond);
|
||||
return DAG.getBoolExtOrTrunc(NewSetCC, dl, VT);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
Loading…
Reference in New Issue