Fix CodeGen/Generic/2006-03-01-dagcombineinfloop.ll, an infinite loop

in the dag combiner on 176.gcc on x86.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26459 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2006-03-01 21:47:21 +00:00
parent 358d5afcbd
commit 1ec05d1bb4

View File

@ -1018,14 +1018,19 @@ SDOperand DAGCombiner::visitAND(SDNode *N) {
return N1;
// fold (and (any_ext V), c) -> (zero_ext V) if 'and' only clears top bits.
if (N1C && N0.getOpcode() == ISD::ANY_EXTEND) {
unsigned InBits = MVT::getSizeInBits(N0.getOperand(0).getValueType());
unsigned InMask = MVT::getIntVTBitMask(N0.getOperand(0).getValueType());
if (TLI.MaskedValueIsZero(N0.getOperand(0),
~N1C->getValue() & ((1ULL << InBits)-1))) {
~N1C->getValue() & InMask)) {
SDOperand Zext = DAG.getNode(ISD::ZERO_EXTEND, N0.getValueType(),
N0.getOperand(0));
// Replace uses of the AND with uses of the Zero extend node.
CombineTo(N, Zext);
// We actually want to replace all uses of the any_extend with the
// zero_extend, to avoid duplicating things. This will later cause this
// AND to be folded.
CombineTo(N0.Val, DAG.getNode(ISD::ZERO_EXTEND, N0.getValueType(),
N0.getOperand(0)));
CombineTo(N0.Val, Zext);
return SDOperand();
}
}