From 39f60a230243d8da02f5e17be3f8918f689ec72b Mon Sep 17 00:00:00 2001 From: Nate Begeman Date: Thu, 1 Sep 2005 23:25:49 +0000 Subject: [PATCH] Fix some code in the current node combining code, spotted when it was moved over to DAGCombiner.cpp 1. Don't assume that SetCC returns i1 when folding (xor (setcc) constant) 2. Don't duplicate code in folding AND with AssertZext that is handled by MaskedValueIsZero git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23196 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 3ff1f77ff01..e22d723547f 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -1394,14 +1394,6 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, // we know the result of the AND will be the AND mask itself. return N2; } - } else if (N1.getOpcode() == ISD::AssertZext) { - // If we are masking out the part of our input that was already masked - // out, just return the input directly. - unsigned ExtendBits = - MVT::getSizeInBits(cast(N1.getOperand(1))->getVT()); - uint64_t ExtendMask = (1ULL << ExtendBits) - 1; - if (ExtendMask == C2) - return N1.getOperand(0); } break; case ISD::OR: @@ -1411,8 +1403,7 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, break; case ISD::XOR: if (!C2) return N1; // X xor 0 -> X - if (N2C->isAllOnesValue()) { - if (N1.Val->getOpcode() == ISD::SETCC){ + if (N2C->getValue() == 1 && N1.Val->getOpcode() == ISD::SETCC) { SDNode *SetCC = N1.Val; // !(X op Y) -> (X !op Y) bool isInteger = MVT::isInteger(SetCC->getOperand(0).getValueType()); @@ -1420,7 +1411,8 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, return getSetCC(SetCC->getValueType(0), SetCC->getOperand(0), SetCC->getOperand(1), ISD::getSetCCInverse(CC, isInteger)); - } else if (N1.getOpcode() == ISD::AND || N1.getOpcode() == ISD::OR) { + } else if (N2C->isAllOnesValue()) { + if (N1.getOpcode() == ISD::AND || N1.getOpcode() == ISD::OR) { SDNode *Op = N1.Val; // !(X or Y) -> (!X and !Y) iff X or Y are freely invertible // !(X and Y) -> (!X or !Y) iff X or Y are freely invertible