forked from OSchip/llvm-project
Fix CodeGen/Generic/2006-03-01-dagcombineinfloop.ll, an infinite loop
in the dag combiner on 176.gcc on x86. llvm-svn: 26459
This commit is contained in:
parent
4a6d29d008
commit
0db2f2c689
|
@ -1018,14 +1018,19 @@ SDOperand DAGCombiner::visitAND(SDNode *N) {
|
||||||
return N1;
|
return N1;
|
||||||
// fold (and (any_ext V), c) -> (zero_ext V) if 'and' only clears top bits.
|
// fold (and (any_ext V), c) -> (zero_ext V) if 'and' only clears top bits.
|
||||||
if (N1C && N0.getOpcode() == ISD::ANY_EXTEND) {
|
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),
|
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
|
// We actually want to replace all uses of the any_extend with the
|
||||||
// zero_extend, to avoid duplicating things. This will later cause this
|
// zero_extend, to avoid duplicating things. This will later cause this
|
||||||
// AND to be folded.
|
// AND to be folded.
|
||||||
CombineTo(N0.Val, DAG.getNode(ISD::ZERO_EXTEND, N0.getValueType(),
|
CombineTo(N0.Val, Zext);
|
||||||
N0.getOperand(0)));
|
|
||||||
return SDOperand();
|
return SDOperand();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue