From 689d24b6ed709ea2dbeee5741c0b9ac8c658d92e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 4 Nov 2003 23:37:10 +0000 Subject: [PATCH] Implement InstCombine/xor.ll:test(15|16) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9708 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/InstructionCombining.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 27801895402..88026c30d55 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -1002,7 +1002,14 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) { SCI->getOperand(0), SCI->getOperand(1)); if (ConstantInt *Op0CI = dyn_cast(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);