Index: lib/Transforms/Utils/SimplifyLibCalls.cpp =================================================================== --- lib/Transforms/Utils/SimplifyLibCalls.cpp +++ lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -178,11 +178,30 @@ return true; } +template +static bool isPositiveSize(T *I, unsigned ArgNo) { + Value *Arg = I->getArgOperand(ArgNo); + return isa(Arg) && !cast(Arg)->isZero(); +} + +static bool setNonNullParam(CallInst *CI, unsigned ArgNo) { + if (!CI->paramHasAttr(ArgNo, Attribute::NonNull)) { + CI->addParamAttr(ArgNo, Attribute::NonNull); + return true; + } + return false; +} + //===----------------------------------------------------------------------===// // String and Memory Library Call Optimizations //===----------------------------------------------------------------------===// Value *LibCallSimplifier::optimizeStrCat(CallInst *CI, IRBuilder<> &B) { + bool AttrChanged = false; + AttrChanged |= setNonNullParam(CI, 0); + AttrChanged |= setNonNullParam(CI, 1); + if (AttrChanged) + return CI; // Extract some information from the instruction Value *Dst = CI->getArgOperand(0); Value *Src = CI->getArgOperand(1); @@ -244,6 +263,13 @@ if (SrcLen == 0 || Len == 0) return Dst; + // Non-zero length case + bool AttrChanged = false; + AttrChanged |= setNonNullParam(CI, 0); + AttrChanged |= setNonNullParam(CI, 1); + if (AttrChanged) + return CI; + // We don't optimize this case. if (Len < SrcLen) return nullptr;