Index: lib/Transforms/Utils/SimplifyLibCalls.cpp =================================================================== --- lib/Transforms/Utils/SimplifyLibCalls.cpp +++ lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -178,11 +178,25 @@ return true; } +template +static bool isPositiveSize(T *I, unsigned ArgNo) { + Value *Arg = I->getArgOperand(ArgNo); + return isa(Arg) && !cast(Arg)->isZero(); +} + +static CallInst *setNonNullParam(CallInst *CI, unsigned ArgNo) { + if (!CI->paramHasAttr(ArgNo, Attribute::NonNull)) + CI->addParamAttr(ArgNo, Attribute::NonNull); + return nullptr; +} + //===----------------------------------------------------------------------===// // String and Memory Library Call Optimizations //===----------------------------------------------------------------------===// Value *LibCallSimplifier::optimizeStrCat(CallInst *CI, IRBuilder<> &B) { + setNonNullParam(CI, 0); + setNonNullParam(CI, 1); // Extract some information from the instruction Value *Dst = CI->getArgOperand(0); Value *Src = CI->getArgOperand(1); @@ -221,6 +235,10 @@ } Value *LibCallSimplifier::optimizeStrNCat(CallInst *CI, IRBuilder<> &B) { + if (isPositiveSize(CI, 2)) { + setNonNullParam(CI, 0); + setNonNullParam(CI, 1); + } // Extract some information from the instruction. Value *Dst = CI->getArgOperand(0); Value *Src = CI->getArgOperand(1);