Strength reduce SAR into SHR if there is no way sign bits could be shifted

in.  This tends to get cases like this:

  X = cast ubyte to int
  Y = shr int X, ...

Tested by: shift.ll:test24

llvm-svn: 21775
This commit is contained in:
Chris Lattner 2005-05-08 17:34:56 +00:00
parent 5140c15f08
commit b18dbbfff5
1 changed files with 10 additions and 0 deletions

View File

@ -3136,6 +3136,16 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) {
if (Instruction *R = FoldOpIntoSelect(I, SI, this))
return R;
// See if we can turn a signed shr into an unsigned shr.
if (!isLeftShift && I.getType()->isSigned()) {
if (MaskedValueIsZero(Op0, ConstantInt::getMinValue(I.getType()))) {
Value *V = InsertCastBefore(Op0, I.getType()->getUnsignedVersion(), I);
V = InsertNewInstBefore(new ShiftInst(Instruction::Shr, V, Op1,
I.getName()), I);
return new CastInst(V, I.getType());
}
}
if (ConstantUInt *CUI = dyn_cast<ConstantUInt>(Op1)) {
// shl uint X, 32 = 0 and shr ubyte Y, 9 = 0, ... just don't eliminate shr
// of a signed value.