Changes in directory llvm/lib/Transforms/Scalar:
InstructionCombining.cpp updated: 1.543 -> 1.544 --- Log message: implement InstCombine/shift-simplify.ll by transforming: (X >> Z) op (Y >> Z) -> (X op Y) >> Z for all shifts and all ops={and/or/xor}. --- Diffs of the changes: (+46 -3) InstructionCombining.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 46 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.543 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.544 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.543 Tue Nov 14 00:06:06 2006 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Tue Nov 14 01:46:50 2006 @@ -3310,9 +3310,9 @@ } // fold (and (cast A), (cast B)) -> (cast (and A, B)) - if (CastInst *Op0C = dyn_cast<CastInst>(Op0)) { - const Type *SrcTy = Op0C->getOperand(0)->getType(); - if (CastInst *Op1C = dyn_cast<CastInst>(Op1)) + if (CastInst *Op1C = dyn_cast<CastInst>(Op1)) { + if (CastInst *Op0C = dyn_cast<CastInst>(Op0)) { + const Type *SrcTy = Op0C->getOperand(0)->getType(); if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() && // Only do this if the casts both really cause code to be generated. ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) && @@ -3323,6 +3323,21 @@ InsertNewInstBefore(NewOp, I); return new CastInst(NewOp, I.getType()); } + } + } + + // (X >> Z) & (Y >> Z) -> (X&Y) >> Z for all shifts. + if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) { + if (ShiftInst *SI0 = dyn_cast<ShiftInst>(Op0)) + if (SI0->getOpcode() == SI1->getOpcode() && + SI0->getOperand(1) == SI1->getOperand(1) && + (SI0->hasOneUse() || SI1->hasOneUse())) { + Instruction *NewOp = + InsertNewInstBefore(BinaryOperator::createAnd(SI0->getOperand(0), + SI1->getOperand(0), + SI0->getName()), I); + return new ShiftInst(SI1->getOpcode(), NewOp, SI1->getOperand(1)); + } } return Changed ? &I : 0; @@ -3567,6 +3582,20 @@ } } } + + // (X >> Z) | (Y >> Z) -> (X|Y) >> Z for all shifts. + if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) { + if (ShiftInst *SI0 = dyn_cast<ShiftInst>(Op0)) + if (SI0->getOpcode() == SI1->getOpcode() && + SI0->getOperand(1) == SI1->getOperand(1) && + (SI0->hasOneUse() || SI1->hasOneUse())) { + Instruction *NewOp = + InsertNewInstBefore(BinaryOperator::createOr(SI0->getOperand(0), + SI1->getOperand(0), + SI0->getName()), I); + return new ShiftInst(SI1->getOpcode(), NewOp, SI1->getOperand(1)); + } + } if (match(Op0, m_Not(m_Value(A)))) { // ~A | Op1 if (A == Op1) // ~A | A == -1 @@ -3879,6 +3908,20 @@ return new CastInst(NewOp, I.getType()); } } + + // (X >> Z) ^ (Y >> Z) -> (X^Y) >> Z for all shifts. + if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) { + if (ShiftInst *SI0 = dyn_cast<ShiftInst>(Op0)) + if (SI0->getOpcode() == SI1->getOpcode() && + SI0->getOperand(1) == SI1->getOperand(1) && + (SI0->hasOneUse() || SI1->hasOneUse())) { + Instruction *NewOp = + InsertNewInstBefore(BinaryOperator::createXor(SI0->getOperand(0), + SI1->getOperand(0), + SI0->getName()), I); + return new ShiftInst(SI1->getOpcode(), NewOp, SI1->getOperand(1)); + } + } return Changed ? &I : 0; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits