Fix sext(setcc) -> select_cc using wrong type for setcc.
Also update the comment, since it actually produces a select (setcc) instead of select_cc. It was checking and using the setcc result type for the type of the sext, instead of the type of the compared items. In my problem case, the sext was to i32 and was used as the setcc type, but the expected type was i64. No test since I haven't been able to hit the problem with this on any in-tree targets. llvm-svn: 200249
This commit is contained in:
parent
b76f55f74a
commit
5f2a92a26c
|
@ -4901,7 +4901,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
|||
}
|
||||
}
|
||||
|
||||
// sext(setcc x, y, cc) -> (select_cc x, y, -1, 0, cc)
|
||||
// sext(setcc x, y, cc) -> (select (setcc x, y, cc), -1, 0)
|
||||
unsigned ElementWidth = VT.getScalarType().getSizeInBits();
|
||||
SDValue NegOne =
|
||||
DAG.getConstant(APInt::getAllOnesValue(ElementWidth), VT);
|
||||
|
@ -4910,15 +4910,21 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
|||
NegOne, DAG.getConstant(0, VT),
|
||||
cast<CondCodeSDNode>(N0.getOperand(2))->get(), true);
|
||||
if (SCC.getNode()) return SCC;
|
||||
if (!VT.isVector() &&
|
||||
(!LegalOperations ||
|
||||
TLI.isOperationLegal(ISD::SETCC, getSetCCResultType(VT)))) {
|
||||
return DAG.getSelect(SDLoc(N), VT,
|
||||
DAG.getSetCC(SDLoc(N),
|
||||
getSetCCResultType(VT),
|
||||
N0.getOperand(0), N0.getOperand(1),
|
||||
cast<CondCodeSDNode>(N0.getOperand(2))->get()),
|
||||
NegOne, DAG.getConstant(0, VT));
|
||||
|
||||
if (!VT.isVector()) {
|
||||
EVT SetCCVT = getSetCCResultType(N0.getOperand(0).getValueType());
|
||||
if (!LegalOperations || TLI.isOperationLegal(ISD::SETCC, SetCCVT)) {
|
||||
SDLoc DL(N);
|
||||
ISD::CondCode CC = cast<CondCodeSDNode>(N0.getOperand(2))->get();
|
||||
SDValue SetCC = DAG.getSetCC(DL,
|
||||
SetCCVT,
|
||||
N0.getOperand(0), N0.getOperand(1), CC);
|
||||
EVT SelectVT = getSetCCResultType(VT);
|
||||
return DAG.getSelect(DL, VT,
|
||||
DAG.getSExtOrTrunc(SetCC, DL, SelectVT),
|
||||
NegOne, DAG.getConstant(0, VT));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue