1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 03:23:01 +02:00

[DAGCombiner] split i1 select-of-constants from non-i1 case; NFCI

I can't find any tests of the non-i1 code path, so it may be unnecessary at this point.

llvm-svn: 295463
This commit is contained in:
Sanjay Patel 2017-02-17 17:13:27 +00:00
parent c7034c8337
commit b3eb9ea6d2

View File

@ -5609,7 +5609,6 @@ static SDValue combineMinNumMaxNum(const SDLoc &DL, EVT VT, SDValue LHS,
} }
} }
// TODO: We should handle other cases of selecting between {-1,0,1} here.
SDValue DAGCombiner::foldSelectOfConstants(SDNode *N) { SDValue DAGCombiner::foldSelectOfConstants(SDNode *N) {
SDValue Cond = N->getOperand(0); SDValue Cond = N->getOperand(0);
SDValue N1 = N->getOperand(1); SDValue N1 = N->getOperand(1);
@ -5618,6 +5617,24 @@ SDValue DAGCombiner::foldSelectOfConstants(SDNode *N) {
EVT CondVT = Cond.getValueType(); EVT CondVT = Cond.getValueType();
SDLoc DL(N); SDLoc DL(N);
if (!VT.isInteger())
return SDValue();
if (!isa<ConstantSDNode>(N1) || !isa<ConstantSDNode>(N2))
return SDValue();
// TODO: We should handle other cases of selecting between {-1,0,1} here.
if (CondVT == MVT::i1) {
if (isNullConstant(N1) && isOneConstant(N2)) {
// select Cond, 0, 1 --> zext (!Cond)
SDValue NotCond = DAG.getNOT(DL, Cond, MVT::i1);
if (VT != MVT::i1)
NotCond = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, NotCond);
return NotCond;
}
return SDValue();
}
// fold (select Cond, 0, 1) -> (xor Cond, 1) // fold (select Cond, 0, 1) -> (xor Cond, 1)
// We can't do this reliably if integer based booleans have different contents // We can't do this reliably if integer based booleans have different contents
// to floating point based booleans. This is because we can't tell whether we // to floating point based booleans. This is because we can't tell whether we
@ -5627,15 +5644,14 @@ SDValue DAGCombiner::foldSelectOfConstants(SDNode *N) {
// undiscoverable (or not reasonably discoverable). For example, it could be // undiscoverable (or not reasonably discoverable). For example, it could be
// in another basic block or it could require searching a complicated // in another basic block or it could require searching a complicated
// expression. // expression.
if (VT.isInteger() && if (CondVT.isInteger() &&
(CondVT == MVT::i1 || (CondVT.isInteger() && TLI.getBooleanContents(false, true) ==
TLI.getBooleanContents(false, true) == TargetLowering::ZeroOrOneBooleanContent &&
TargetLowering::ZeroOrOneBooleanContent && TLI.getBooleanContents(false, false) ==
TLI.getBooleanContents(false, false) == TargetLowering::ZeroOrOneBooleanContent &&
TargetLowering::ZeroOrOneBooleanContent)) &&
isNullConstant(N1) && isOneConstant(N2)) { isNullConstant(N1) && isOneConstant(N2)) {
SDValue NotCond = DAG.getNode(ISD::XOR, DL, CondVT, Cond, SDValue NotCond =
DAG.getConstant(1, DL, CondVT)); DAG.getNode(ISD::XOR, DL, CondVT, Cond, DAG.getConstant(1, DL, CondVT));
if (VT.bitsEq(CondVT)) if (VT.bitsEq(CondVT))
return NotCond; return NotCond;
return DAG.getZExtOrTrunc(NotCond, DL, VT); return DAG.getZExtOrTrunc(NotCond, DL, VT);