diff options
author | Chris Lattner <sabre@nondot.org> | 2003-10-02 15:11:26 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-10-02 15:11:26 +0000 |
commit | b9cde76e608c9e7bfbaeb42986f81cc56d83b125 (patch) | |
tree | 6a78a5868c5cee46f741d3ac8e49f3fefc425a6c /llvm/lib/Transforms/Scalar/InstructionCombining.cpp | |
parent | d15f2735125bb173db36240a0757b989f087d6f9 (diff) | |
download | bcm5719-llvm-b9cde76e608c9e7bfbaeb42986f81cc56d83b125.tar.gz bcm5719-llvm-b9cde76e608c9e7bfbaeb42986f81cc56d83b125.zip |
Implement InstCombine/add.ll:test17 & 18
llvm-svn: 8817
Diffstat (limited to 'llvm/lib/Transforms/Scalar/InstructionCombining.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index e69db1d463d..465954aa134 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -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; } |