mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-08 13:26:19 +00:00
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
84910c53e6
commit
0719e41557
@ -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…
x
Reference in New Issue
Block a user