Make MaskedValueIsZero a bit more aggressive
authorChris Lattner <sabre@nondot.org>
Sun, 9 Oct 2005 22:08:50 +0000 (22:08 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 9 Oct 2005 22:08:50 +0000 (22:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23677 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 7f74db50ca1911a387d20262871310ff9e6e2559..cf4af7916916f2694417d862cf1da337a8a3af84 100644 (file)
@@ -404,11 +404,17 @@ static bool MaskedValueIsZero(Value *V, ConstantIntegral *Mask) {
     switch (I->getOpcode()) {
     case Instruction::And:
       // (X & C1) & C2 == 0   iff   C1 & C2 == 0.
-      if (ConstantIntegral *CI = dyn_cast<ConstantIntegral>(I->getOperand(1)))
-        if (ConstantExpr::getAnd(CI, Mask)->isNullValue())
+      if (ConstantIntegral *CI = dyn_cast<ConstantIntegral>(I->getOperand(1))) {
+        ConstantIntegral *C1C2 = 
+          cast<ConstantIntegral>(ConstantExpr::getAnd(CI, Mask));
+        if (MaskedValueIsZero(I->getOperand(0), C1C2))
           return true;
-      break;
+      }
+      // If either the LHS or the RHS are MaskedValueIsZero, the result is zero.
+      return MaskedValueIsZero(I->getOperand(1), Mask) ||
+             MaskedValueIsZero(I->getOperand(0), Mask);
     case Instruction::Or:
+    case Instruction::Xor:
       // If the LHS and the RHS are MaskedValueIsZero, the result is also zero.
       return MaskedValueIsZero(I->getOperand(1), Mask) &&
              MaskedValueIsZero(I->getOperand(0), Mask);