aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-01-05 06:29:13 +0000
committerChris Lattner <sabre@nondot.org>2010-01-05 06:29:13 +0000
commit32c0cf5af933031f4e842bf44d08e96d76a70386 (patch)
tree356762667c21ca69c138bdde906758b8d9b38e7d /lib/Transforms
parentd0db8e8bad3060d5c016483ecfc62d822bc84fb7 (diff)
downloadexternal_llvm-32c0cf5af933031f4e842bf44d08e96d76a70386.tar.gz
external_llvm-32c0cf5af933031f4e842bf44d08e96d76a70386.tar.bz2
external_llvm-32c0cf5af933031f4e842bf44d08e96d76a70386.zip
inline the 'AddRHS' transformation, simplifying things significantly.
Eliminate the 'AddMaskingAnd' transformation, it is redundant with this more general code right below it: // A+B --> A|B iff A and B have no bits set in common. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92693 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/InstCombine/InstructionCombining.cpp43
1 files changed, 4 insertions, 39 deletions
diff --git a/lib/Transforms/InstCombine/InstructionCombining.cpp b/lib/Transforms/InstCombine/InstructionCombining.cpp
index a9a55584c8..236ab9c206 100644
--- a/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -305,36 +305,6 @@ static Instruction *AssociativeOpt(BinaryOperator &Root, const Functor &F) {
return 0;
}
-namespace {
-
-// AddRHS - Implements: X + X --> X << 1
-struct AddRHS {
- Value *RHS;
- explicit AddRHS(Value *rhs) : RHS(rhs) {}
- bool shouldApply(Value *LHS) const { return LHS == RHS; }
- Instruction *apply(BinaryOperator &Add) const {
- return BinaryOperator::CreateShl(Add.getOperand(0),
- ConstantInt::get(Add.getType(), 1));
- }
-};
-
-// AddMaskingAnd - Implements (A & C1)+(B & C2) --> (A & C1)|(B & C2)
-// iff C1&C2 == 0
-struct AddMaskingAnd {
- Constant *C2;
- explicit AddMaskingAnd(Constant *c) : C2(c) {}
- bool shouldApply(Value *LHS) const {
- ConstantInt *C1;
- return match(LHS, m_And(m_Value(), m_ConstantInt(C1))) &&
- ConstantExpr::getAnd(C1, C2)->isNullValue();
- }
- Instruction *apply(BinaryOperator &Add) const {
- return BinaryOperator::CreateOr(Add.getOperand(0), Add.getOperand(1));
- }
-};
-
-}
-
static Value *FoldOperationIntoSelectOperand(Instruction &I, Value *SO,
InstCombiner *IC) {
if (CastInst *CI = dyn_cast<CastInst>(&I))
@@ -622,10 +592,10 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
if (I.getType() == Type::getInt1Ty(I.getContext()))
return BinaryOperator::CreateXor(LHS, RHS);
- // X + X --> X << 1
if (I.getType()->isInteger()) {
- if (Instruction *Result = AssociativeOpt(I, AddRHS(RHS)))
- return Result;
+ // X + X --> X << 1
+ if (LHS == RHS)
+ return BinaryOperator::CreateShl(LHS, ConstantInt::get(I.getType(), 1));
if (Instruction *RHSI = dyn_cast<Instruction>(RHS)) {
if (RHSI->getOpcode() == Instruction::Sub)
@@ -679,11 +649,6 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
return ReplaceInstUsesWith(I, Constant::getAllOnesValue(I.getType()));
- // (A & C1)+(B & C2) --> (A & C1)|(B & C2) iff C1&C2 == 0
- if (match(RHS, m_And(m_Value(), m_ConstantInt(C2))))
- if (Instruction *R = AssociativeOpt(I, AddMaskingAnd(C2)))
- return R;
-
// A+B --> A|B iff A and B have no bits set in common.
if (const IntegerType *IT = dyn_cast<IntegerType>(I.getType())) {
APInt Mask = APInt::getAllOnesValue(IT->getBitWidth());
@@ -736,7 +701,7 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
if (Anded == CRHS) {
// See if all bits from the first bit set in the Add RHS up are included
// in the mask. First, get the rightmost bit.
- const APInt& AddRHSV = CRHS->getValue();
+ const APInt &AddRHSV = CRHS->getValue();
// Form a mask of all bits from the lowest bit added through the top.
APInt AddRHSHighBits(~((AddRHSV & -AddRHSV)-1));