Implement InstCombine/xor.ll:test(15|16)
authorChris Lattner <sabre@nondot.org>
Tue, 4 Nov 2003 23:37:10 +0000 (23:37 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 4 Nov 2003 23:37:10 +0000 (23:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9708 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 2780189540282d09947e8cea6a40bdcc0f106154..88026c30d5506e5c42ba5df50a816d069bd53886 100644 (file)
@@ -1002,7 +1002,14 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
                                  SCI->getOperand(0), SCI->getOperand(1));
           
       if (ConstantInt *Op0CI = dyn_cast<ConstantInt>(Op0I->getOperand(1)))
-        if (Op0I->getOpcode() == Instruction::And) {
+        if (Op0I->getOpcode() == Instruction::Add) {
+          // ~(X-c) --> (-c-1)-X
+          if (RHS->isAllOnesValue()) 
+            return BinaryOperator::create(Instruction::Sub,
+                                          *-*Op0CI -
+                                              *ConstantInt::get(I.getType(), 1),
+                                          Op0I->getOperand(0));
+        } else if (Op0I->getOpcode() == Instruction::And) {
           // (X & C1) ^ C2 --> (X & C1) | C2 iff (C1&C2) == 0
           if ((*RHS & *Op0CI)->isNullValue())
             return BinaryOperator::create(Instruction::Or, Op0, RHS);