Implement InstCombine/add.ll:test17 & 18
authorChris Lattner <sabre@nondot.org>
Thu, 2 Oct 2003 15:11:26 +0000 (15:11 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 2 Oct 2003 15:11:26 +0000 (15:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8817 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index e69db1d463da5c934b933d56d1f15d5fe5127806..465954aa1341ac6bc3f4532aa4378bb59554acfe 100644 (file)
@@ -437,6 +437,22 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
   if (Constant *C2 = dyn_castMaskingAnd(RHS))
     if (Instruction *R = AssociativeOpt(I, AddMaskingAnd(C2))) return R;
 
+  if (ConstantInt *CRHS = dyn_cast<ConstantInt>(RHS)) {
+    if (Instruction *ILHS = dyn_cast<Instruction>(LHS)) {
+      switch (ILHS->getOpcode()) {
+      case Instruction::Xor:
+        // ~X + C --> (C-1) - X
+        if (ConstantInt *XorRHS = dyn_cast<ConstantInt>(ILHS->getOperand(1)))
+          if (XorRHS->isAllOnesValue())
+            return BinaryOperator::create(Instruction::Sub,
+                                     *CRHS - *ConstantInt::get(I.getType(), 1),
+                                          ILHS->getOperand(0));
+        break;
+      default: break;
+      }
+    }
+  }
+
   return Changed ? &I : 0;
 }