implement constant folding of ==/!= on constant packed, simplify some code.
authorChris Lattner <sabre@nondot.org>
Wed, 4 Jan 2006 02:20:54 +0000 (02:20 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 4 Jan 2006 02:20:54 +0000 (02:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25074 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/ConstantFold.cpp

index e6a27155b4461cdf074b7db0aa0bda204b54b509..4ac5292190ce49a015d3351094a4293a06f54c45 100644 (file)
@@ -385,6 +385,14 @@ struct ConstantPackedRules
     return 0;
   }
   static Constant *EqualTo(const ConstantPacked *V1, const ConstantPacked *V2) {
+    for (unsigned i = 0, e = V1->getNumOperands(); i != e; ++i) {
+      Constant *C = 
+        ConstantExpr::getSetEQ(const_cast<Constant*>(V1->getOperand(i)),
+                               const_cast<Constant*>(V2->getOperand(i)));
+      if (ConstantBool *CB = dyn_cast<ConstantBool>(C))
+        return CB;
+    }
+    // Otherwise, could not decide from any element pairs.
     return 0;
   }
 };
@@ -951,15 +959,15 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
   case Instruction::SetGT:   C = ConstRules::get(V1, V2).lessthan(V2, V1);break;
   case Instruction::SetNE:   // V1 != V2  ===  !(V1 == V2)
     C = ConstRules::get(V1, V2).equalto(V1, V2);
-    if (C) return ConstantExpr::get(Instruction::Xor, C, ConstantBool::True);
+    if (C) return ConstantExpr::getNot(C);
     break;
   case Instruction::SetLE:   // V1 <= V2  ===  !(V2 < V1)
     C = ConstRules::get(V1, V2).lessthan(V2, V1);
-    if (C) return ConstantExpr::get(Instruction::Xor, C, ConstantBool::True);
+    if (C) return ConstantExpr::getNot(C);
     break;
   case Instruction::SetGE:   // V1 >= V2  ===  !(V1 < V2)
     C = ConstRules::get(V1, V2).lessthan(V1, V2);
-    if (C) return ConstantExpr::get(Instruction::Xor, C, ConstantBool::True);
+    if (C) return ConstantExpr::getNot(C);
     break;
   }