fold setcc of a setcc.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30953 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2006-10-14 01:02:29 +00:00
parent 51dabfb283
commit 8ac9d0ebde

View File

@@ -3685,30 +3685,46 @@ SDOperand DAGCombiner::SimplifySetCC(MVT::ValueType VT, SDOperand N0,
ExtDstTy), ExtDstTy),
Cond); Cond);
} else if ((N1C->getValue() == 0 || N1C->getValue() == 1) && } else if ((N1C->getValue() == 0 || N1C->getValue() == 1) &&
(Cond == ISD::SETEQ || Cond == ISD::SETNE) && (Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
(N0.getOpcode() == ISD::XOR ||
(N0.getOpcode() == ISD::AND && // SETCC (SETCC), [0|1], [EQ|NE] -> SETCC
N0.getOperand(0).getOpcode() == ISD::XOR && if (N0.getOpcode() == ISD::SETCC) {
N0.getOperand(1) == N0.getOperand(0).getOperand(1))) && bool TrueWhenTrue = (Cond == ISD::SETEQ) ^ (N1C->getValue() != 1);
isa<ConstantSDNode>(N0.getOperand(1)) && if (TrueWhenTrue)
cast<ConstantSDNode>(N0.getOperand(1))->getValue() == 1) { return N0;
// If this is (X^1) == 0/1, swap the RHS and eliminate the xor. We can
// only do this if the top bits are known zero. // Invert the condition.
if (TLI.MaskedValueIsZero(N1, ISD::CondCode CC = cast<CondCodeSDNode>(N0.getOperand(2))->get();
MVT::getIntVTBitMask(N0.getValueType())-1)) { CC = ISD::getSetCCInverse(CC,
// Okay, get the un-inverted input value. MVT::isInteger(N0.getOperand(0).getValueType()));
SDOperand Val; return DAG.getSetCC(VT, N0.getOperand(0), N0.getOperand(1), CC);
if (N0.getOpcode() == ISD::XOR) }
Val = N0.getOperand(0);
else { if ((N0.getOpcode() == ISD::XOR ||
assert(N0.getOpcode() == ISD::AND && (N0.getOpcode() == ISD::AND &&
N0.getOperand(0).getOpcode() == ISD::XOR); N0.getOperand(0).getOpcode() == ISD::XOR &&
// ((X^1)&1)^1 -> X & 1 N0.getOperand(1) == N0.getOperand(0).getOperand(1))) &&
Val = DAG.getNode(ISD::AND, N0.getValueType(), isa<ConstantSDNode>(N0.getOperand(1)) &&
N0.getOperand(0).getOperand(0), N0.getOperand(1)); cast<ConstantSDNode>(N0.getOperand(1))->getValue() == 1) {
// If this is (X^1) == 0/1, swap the RHS and eliminate the xor. We
// can only do this if the top bits are known zero.
if (TLI.MaskedValueIsZero(N1,
MVT::getIntVTBitMask(N0.getValueType())-1)){
// Okay, get the un-inverted input value.
SDOperand Val;
if (N0.getOpcode() == ISD::XOR)
Val = N0.getOperand(0);
else {
assert(N0.getOpcode() == ISD::AND &&
N0.getOperand(0).getOpcode() == ISD::XOR);
// ((X^1)&1)^1 -> X & 1
Val = DAG.getNode(ISD::AND, N0.getValueType(),
N0.getOperand(0).getOperand(0),
N0.getOperand(1));
}
return DAG.getSetCC(VT, Val, N1,
Cond == ISD::SETEQ ? ISD::SETNE : ISD::SETEQ);
} }
return DAG.getSetCC(VT, Val, N1,
Cond == ISD::SETEQ ? ISD::SETNE : ISD::SETEQ);
} }
} }
@@ -3804,7 +3820,7 @@ SDOperand DAGCombiner::SimplifySetCC(MVT::ValueType VT, SDOperand N0,
} }
if (N0 == N1) { if (N0 == N1) {
// We can always fold X == Y for integer setcc's. // We can always fold X == X for integer setcc's.
if (MVT::isInteger(N0.getValueType())) if (MVT::isInteger(N0.getValueType()))
return DAG.getConstant(ISD::isTrueWhenEqual(Cond), VT); return DAG.getConstant(ISD::isTrueWhenEqual(Cond), VT);
unsigned UOF = ISD::getUnorderedFlavor(Cond); unsigned UOF = ISD::getUnorderedFlavor(Cond);