diff --git a/lib/Transforms/InstCombine/InstCombineCasts.cpp b/lib/Transforms/InstCombine/InstCombineCasts.cpp index df2abb5cef2..88ee1453faf 100644 --- a/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -1019,25 +1019,25 @@ Instruction *InstCombiner::visitSExt(SExtInst &CI) { } } } - - // vector (x ashr x, 31 -> all ones if signed - if (const VectorType *VTy = dyn_cast(DestTy)) { - ICmpInst::Predicate Pred; Value *CmpLHS; - if (match(Src, m_ICmp(Pred, m_Value(CmpLHS), m_Zero()))) { - if (Pred == ICmpInst::ICMP_SLT && CmpLHS->getType() == DestTy) { - const Type *EltTy = VTy->getElementType(); - // splat the shift constant to a cosntant vector - Constant *Sh = ConstantInt::get(EltTy, EltTy->getScalarSizeInBits()-1); - std::vector Elts(VTy->getNumElements(), Sh); - Constant *VSh = ConstantVector::get(Elts); - - Value *In = Builder->CreateAShr(CmpLHS, VSh, CmpLHS->getName()+".lobit"); - return ReplaceInstUsesWith(CI, In); + // vector (x ashr x, 31 -> all ones if signed. + if (const VectorType *VTy = dyn_cast(DestTy)) { + ICmpInst::Predicate Pred; Value *CmpLHS; + if (match(Src, m_ICmp(Pred, m_Value(CmpLHS), m_Zero()))) { + if (Pred == ICmpInst::ICMP_SLT && CmpLHS->getType() == DestTy) { + const Type *EltTy = VTy->getElementType(); + + // splat the shift constant to a cosntant vector + Constant *Sh = ConstantInt::get(EltTy, EltTy->getScalarSizeInBits()-1); + std::vector Elts(VTy->getNumElements(), Sh); + Constant *VSh = ConstantVector::get(Elts); + + Value *In = Builder->CreateAShr(CmpLHS, VSh,CmpLHS->getName()+".lobit"); + return ReplaceInstUsesWith(CI, In); + } } } - } - + // If the input is a shl/ashr pair of a same constant, then this is a sign // extension from a smaller value. If we could trust arbitrary bitwidth // integers, we could turn this into a truncate to the smaller bit and then