mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-25 04:39:51 +00:00
Be careful not to optimize a SELECT_CC into a SETCC post-legalization if the SETCC node would be illegal.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167344 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
11a45c214c
commit
efcc1aec64
@ -9412,34 +9412,38 @@ SDValue DAGCombiner::SimplifySelectCC(DebugLoc DL, SDValue N0, SDValue N1,
|
||||
return SDValue();
|
||||
|
||||
// Get a SetCC of the condition
|
||||
// FIXME: Should probably make sure that setcc is legal if we ever have a
|
||||
// target where it isn't.
|
||||
SDValue Temp, SCC;
|
||||
// cast from setcc result type to select result type
|
||||
if (LegalTypes) {
|
||||
SCC = DAG.getSetCC(DL, TLI.getSetCCResultType(N0.getValueType()),
|
||||
N0, N1, CC);
|
||||
if (N2.getValueType().bitsLT(SCC.getValueType()))
|
||||
Temp = DAG.getZeroExtendInReg(SCC, N2.getDebugLoc(), N2.getValueType());
|
||||
else
|
||||
// NOTE: Don't create a SETCC if it's not legal on this target.
|
||||
if (!LegalOperations ||
|
||||
TLI.isOperationLegal(ISD::SETCC,
|
||||
LegalTypes ? TLI.getSetCCResultType(N0.getValueType()) : MVT::i1)) {
|
||||
SDValue Temp, SCC;
|
||||
// cast from setcc result type to select result type
|
||||
if (LegalTypes) {
|
||||
SCC = DAG.getSetCC(DL, TLI.getSetCCResultType(N0.getValueType()),
|
||||
N0, N1, CC);
|
||||
if (N2.getValueType().bitsLT(SCC.getValueType()))
|
||||
Temp = DAG.getZeroExtendInReg(SCC, N2.getDebugLoc(),
|
||||
N2.getValueType());
|
||||
else
|
||||
Temp = DAG.getNode(ISD::ZERO_EXTEND, N2.getDebugLoc(),
|
||||
N2.getValueType(), SCC);
|
||||
} else {
|
||||
SCC = DAG.getSetCC(N0.getDebugLoc(), MVT::i1, N0, N1, CC);
|
||||
Temp = DAG.getNode(ISD::ZERO_EXTEND, N2.getDebugLoc(),
|
||||
N2.getValueType(), SCC);
|
||||
} else {
|
||||
SCC = DAG.getSetCC(N0.getDebugLoc(), MVT::i1, N0, N1, CC);
|
||||
Temp = DAG.getNode(ISD::ZERO_EXTEND, N2.getDebugLoc(),
|
||||
N2.getValueType(), SCC);
|
||||
}
|
||||
|
||||
AddToWorkList(SCC.getNode());
|
||||
AddToWorkList(Temp.getNode());
|
||||
|
||||
if (N2C->getAPIntValue() == 1)
|
||||
return Temp;
|
||||
|
||||
// shl setcc result by log2 n2c
|
||||
return DAG.getNode(ISD::SHL, DL, N2.getValueType(), Temp,
|
||||
DAG.getConstant(N2C->getAPIntValue().logBase2(),
|
||||
getShiftAmountTy(Temp.getValueType())));
|
||||
}
|
||||
|
||||
AddToWorkList(SCC.getNode());
|
||||
AddToWorkList(Temp.getNode());
|
||||
|
||||
if (N2C->getAPIntValue() == 1)
|
||||
return Temp;
|
||||
|
||||
// shl setcc result by log2 n2c
|
||||
return DAG.getNode(ISD::SHL, DL, N2.getValueType(), Temp,
|
||||
DAG.getConstant(N2C->getAPIntValue().logBase2(),
|
||||
getShiftAmountTy(Temp.getValueType())));
|
||||
}
|
||||
|
||||
// Check to see if this is the equivalent of setcc
|
||||
|
Loading…
Reference in New Issue
Block a user