summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-10-02 15:11:26 +0000
committerChris Lattner <sabre@nondot.org>2003-10-02 15:11:26 +0000
commitb9cde76e608c9e7bfbaeb42986f81cc56d83b125 (patch)
tree6a78a5868c5cee46f741d3ac8e49f3fefc425a6c /llvm/lib/Transforms/Scalar/InstructionCombining.cpp
parentd15f2735125bb173db36240a0757b989f087d6f9 (diff)
downloadbcm5719-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.cpp16
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;
}
OpenPOWER on IntegriCloud