diff --git a/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/lib/Transforms/Scalar/SimplifyLibCalls.cpp index fed239eae36..c199f301a99 100644 --- a/lib/Transforms/Scalar/SimplifyLibCalls.cpp +++ b/lib/Transforms/Scalar/SimplifyLibCalls.cpp @@ -733,8 +733,10 @@ struct VISIBILITY_HIDDEN StrToOpt : public LibCallOptimization { return 0; Value *EndPtr = CI->getOperand(2); - if (isa(EndPtr)) + if (isa(EndPtr)) { + CI->setOnlyReadsMemory(); CI->addAttribute(1, Attribute::NoCapture); + } return 0; } diff --git a/test/Transforms/SimplifyLibCalls/2009-02-12-StrTo.ll b/test/Transforms/SimplifyLibCalls/2009-02-12-StrTo.ll index 3d51d78ecea..4aeff1c048d 100644 --- a/test/Transforms/SimplifyLibCalls/2009-02-12-StrTo.ll +++ b/test/Transforms/SimplifyLibCalls/2009-02-12-StrTo.ll @@ -1,13 +1,14 @@ ; RUN: llvm-as < %s | opt -simplify-libcalls | llvm-dis > %t ; RUN: grep nocapture %t | count 2 ; RUN: grep null %t | grep nocapture | count 1 +; RUN: grep null %t | grep call | grep readonly | count 1 -; Test that we do add nocapture to the declaration, and to the second call only. +; Test that we add nocapture to the declaration, and to the second call only. -declare float @strtof(i8* %s, i8** %endptr, i32 %base) +declare float @strtol(i8* %s, i8** %endptr, i32 %base) define void @foo(i8* %x, i8** %endptr) { - call float @strtof(i8* %x, i8** %endptr, i32 0) - call float @strtof(i8* %x, i8** null, i32 0) + call float @strtol(i8* %x, i8** %endptr, i32 10) + call float @strtol(i8* %x, i8** null, i32 10) ret void }