From bfe492b5c20a843028fb8e1736f81e703f789c1a Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 13 Mar 2004 00:11:49 +0000 Subject: [PATCH] Implement sub.ll:test14 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12355 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Scalar/InstructionCombining.cpp | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 4f9821e6b71..866afb48187 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -549,6 +549,21 @@ static unsigned getTypeSizeInBits(const Type *Ty) { return Ty == Type::BoolTy ? 1 : Ty->getPrimitiveSize()*8; } +/// RemoveNoopCast - Strip off nonconverting casts from the value. +/// +static Value *RemoveNoopCast(Value *V) { + if (CastInst *CI = dyn_cast(V)) { + const Type *CTy = CI->getType(); + const Type *OpTy = CI->getOperand(0)->getType(); + if (CTy->isInteger() && OpTy->isInteger()) { + if (CTy->getPrimitiveSize() == OpTy->getPrimitiveSize()) + return RemoveNoopCast(CI->getOperand(0)); + } else if (isa(CTy) && isa(OpTy)) + return RemoveNoopCast(CI->getOperand(0)); + } + return V; +} + Instruction *InstCombiner::visitSub(BinaryOperator &I) { Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); @@ -572,17 +587,18 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) { ConstantInt::get(I.getType(), 1))); // -((uint)X >> 31) -> ((int)X >> 31) // -((int)X >> 31) -> ((uint)X >> 31) - if (C->isNullValue()) - if (ShiftInst *SI = dyn_cast(Op1)) + if (C->isNullValue()) { + Value *NoopCastedRHS = RemoveNoopCast(Op1); + if (ShiftInst *SI = dyn_cast(NoopCastedRHS)) if (SI->getOpcode() == Instruction::Shr) if (ConstantUInt *CU = dyn_cast(SI->getOperand(1))) { const Type *NewTy; - if (C->getType()->isSigned()) - NewTy = getUnsignedIntegralType(C->getType()); + if (SI->getType()->isSigned()) + NewTy = getUnsignedIntegralType(SI->getType()); else - NewTy = getSignedIntegralType(C->getType()); + NewTy = getSignedIntegralType(SI->getType()); // Check to see if we are shifting out everything but the sign bit. - if (CU->getValue() == C->getType()->getPrimitiveSize()*8-1) { + if (CU->getValue() == SI->getType()->getPrimitiveSize()*8-1) { // Ok, the transformation is safe. Insert a cast of the incoming // value, then the new shift, then the new cast. Instruction *FirstCast = new CastInst(SI->getOperand(0), NewTy, @@ -590,10 +606,15 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) { Value *InV = InsertNewInstBefore(FirstCast, I); Instruction *NewShift = new ShiftInst(Instruction::Shr, FirstCast, CU, SI->getName()); - InV = InsertNewInstBefore(NewShift, I); - return new CastInst(NewShift, I.getType()); + if (NewShift->getType() == I.getType()) + return NewShift; + else { + InV = InsertNewInstBefore(NewShift, I); + return new CastInst(NewShift, I.getType()); + } } } + } } if (BinaryOperator *Op1I = dyn_cast(Op1))