Fix CodeGen/Generic/2006-03-01-dagcombineinfloop.ll, an infinite loop
authorChris Lattner <sabre@nondot.org>
Wed, 1 Mar 2006 21:47:21 +0000 (21:47 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 1 Mar 2006 21:47:21 +0000 (21:47 +0000)
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

lib/CodeGen/SelectionDAG/DAGCombiner.cpp

index e235a7b2e4c96c9c60cf02236dbcca287788ded9..280c7081f157e7fe2e5ce54987dc39e2ae3df4a0 100644 (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();
     }
   }