move some ashr-specific code out of commonShiftTransforms into visitAShr.

llvm-svn: 44650
This commit is contained in:
Chris Lattner 2007-12-06 01:59:46 +00:00
parent 05bbbda78a
commit 0ccb663cca
1 changed files with 16 additions and 15 deletions

View File

@ -5872,7 +5872,22 @@ Instruction *InstCombiner::visitLShr(BinaryOperator &I) {
} }
Instruction *InstCombiner::visitAShr(BinaryOperator &I) { Instruction *InstCombiner::visitAShr(BinaryOperator &I) {
return commonShiftTransforms(I); if (Instruction *R = commonShiftTransforms(I))
return R;
Value *Op0 = I.getOperand(0);
// ashr int -1, X = -1 (for any arithmetic shift rights of ~0)
if (ConstantInt *CSI = dyn_cast<ConstantInt>(Op0))
if (CSI->isAllOnesValue())
return ReplaceInstUsesWith(I, CSI);
// See if we can turn a signed shr into an unsigned shr.
if (MaskedValueIsZero(Op0,
APInt::getSignBit(I.getType()->getPrimitiveSizeInBits())))
return BinaryOperator::createLShr(Op0, I.getOperand(1));
return 0;
} }
Instruction *InstCombiner::commonShiftTransforms(BinaryOperator &I) { Instruction *InstCombiner::commonShiftTransforms(BinaryOperator &I) {
@ -5898,26 +5913,12 @@ Instruction *InstCombiner::commonShiftTransforms(BinaryOperator &I) {
return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType())); return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType()));
} }
// ashr int -1, X = -1 (for any arithmetic shift rights of ~0)
if (I.getOpcode() == Instruction::AShr)
if (ConstantInt *CSI = dyn_cast<ConstantInt>(Op0))
if (CSI->isAllOnesValue())
return ReplaceInstUsesWith(I, CSI);
// Try to fold constant and into select arguments. // Try to fold constant and into select arguments.
if (isa<Constant>(Op0)) if (isa<Constant>(Op0))
if (SelectInst *SI = dyn_cast<SelectInst>(Op1)) if (SelectInst *SI = dyn_cast<SelectInst>(Op1))
if (Instruction *R = FoldOpIntoSelect(I, SI, this)) if (Instruction *R = FoldOpIntoSelect(I, SI, this))
return R; return R;
// See if we can turn a signed shr into an unsigned shr.
if (I.isArithmeticShift()) {
if (MaskedValueIsZero(Op0,
APInt::getSignBit(I.getType()->getPrimitiveSizeInBits()))) {
return BinaryOperator::createLShr(Op0, Op1, I.getName());
}
}
if (ConstantInt *CUI = dyn_cast<ConstantInt>(Op1)) if (ConstantInt *CUI = dyn_cast<ConstantInt>(Op1))
if (Instruction *Res = FoldShiftByConstant(Op0, CUI, I)) if (Instruction *Res = FoldShiftByConstant(Op0, CUI, I))
return Res; return Res;