From 1023b8726e79bc3c53185dfe053d5961d13f2a60 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 27 Sep 2004 16:18:50 +0000 Subject: [PATCH] Fold: (setcc (shr X, ShAmt), CI), where 'cc' is eq or ne. This xform triggers often, for example: 6x in povray, 1x in gzip, 279x in gcc, 1x in crafty, 8x in eon, 11x in perlbmk, 362x in gap, 4x in vortex, 14 in m88ksim, 211x in 126.gcc, 1x in compress, 11x in ijpeg, and 4x in 147.vortex. llvm-svn: 16521 --- .../Scalar/InstructionCombining.cpp | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index e579cf1a7bcc..cdfdc34555b6 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -1545,6 +1545,51 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) { } } break; + case Instruction::Shr: // shr: (setcc (shr X, ShAmt), CI) + if (ConstantUInt *ShAmt = dyn_cast(LHSI->getOperand(1))) { + unsigned ShAmtVal = ShAmt->getValue(); + + switch (I.getOpcode()) { + default: break; + case Instruction::SetEQ: + case Instruction::SetNE: { + // If we are comparing against bits always shifted out, the + // comparison cannot succeed. + Constant *Comp = + ConstantExpr::getShr(ConstantExpr::getShl(CI, ShAmt), ShAmt); + + if (Comp != CI) {// Comparing against a bit that we know is zero. + bool IsSetNE = I.getOpcode() == Instruction::SetNE; + Constant *Cst = ConstantBool::get(IsSetNE); + return ReplaceInstUsesWith(I, Cst); + } + + if (LHSI->hasOneUse() || CI->isNullValue()) { + // Otherwise strength reduce the shift into an and. + uint64_t Val = ~0ULL; // All ones. + Val <<= ShAmtVal; // Shift over to the right spot. + + Constant *Mask; + if (CI->getType()->isUnsigned()) { + unsigned TypeBits = CI->getType()->getPrimitiveSize()*8; + Val &= (1ULL << TypeBits)-1; + Mask = ConstantUInt::get(CI->getType(), Val); + } else { + Mask = ConstantSInt::get(CI->getType(), Val); + } + + Instruction *AndI = + BinaryOperator::createAnd(LHSI->getOperand(0), + Mask, LHSI->getName()+".mask"); + Value *And = InsertNewInstBefore(AndI, I); + return new SetCondInst(I.getOpcode(), And, + ConstantExpr::getShl(CI, ShAmt)); + } + break; + } + } + } + break; case Instruction::Div: if (0 && isa(LHSI->getOperand(1))) { -- GitLab