From: Chris Lattner Date: Mon, 23 Feb 2004 07:16:20 +0000 (+0000) Subject: Implement cast.ll::test14/15 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c5943fb186fabacd8f1ab0d135a103caa0a226ef;p=oota-llvm.git Implement cast.ll::test14/15 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11742 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 8886364df37..105f2ae5020 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -1378,6 +1378,43 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) { default: break; } } + } else { // Not a SetEQ/SetNE + // If the LHS is a cast from an integral value of the same size, + if (CastInst *Cast = dyn_cast(Op0)) { + Value *CastOp = Cast->getOperand(0); + const Type *SrcTy = CastOp->getType(); + unsigned SrcTySize = SrcTy->getPrimitiveSize(); + if (SrcTy != Cast->getType() && SrcTy->isInteger() && + SrcTySize == Cast->getType()->getPrimitiveSize()) { + assert((SrcTy->isSigned() ^ Cast->getType()->isSigned()) && + "Source and destination signednesses should differ!"); + if (Cast->getType()->isSigned()) { + // If this is a signed comparison, check for comparisons in the + // vicinity of zero. + if (I.getOpcode() == Instruction::SetLT && CI->isNullValue()) + // X < 0 => x > 127 + return BinaryOperator::create(Instruction::SetGT, CastOp, + ConstantUInt::get(SrcTy, (1ULL << (SrcTySize*8-1))-1)); + else if (I.getOpcode() == Instruction::SetGT && + cast(CI)->getValue() == -1) + // X > -1 => x < 128 + return BinaryOperator::create(Instruction::SetGT, CastOp, + ConstantUInt::get(SrcTy, 1ULL << (SrcTySize*8-1))); + } else { + ConstantUInt *CUI = cast(CI); + if (I.getOpcode() == Instruction::SetLT && + CUI->getValue() == 1ULL << (SrcTySize*8-1)) + // X < 128 => X > -1 + return BinaryOperator::create(Instruction::SetGT, CastOp, + ConstantSInt::get(SrcTy, -1)); + else if (I.getOpcode() == Instruction::SetGT && + CUI->getValue() == (1ULL << (SrcTySize*8-1))-1) + // X > 127 => X < 0 + return BinaryOperator::create(Instruction::SetLT, CastOp, + Constant::getNullValue(SrcTy)); + } + } + } } // Check to see if we are comparing against the minimum or maximum value...