Mark strto* as readonly when the endptr is null.

llvm-svn: 64460
This commit is contained in:
Nick Lewycky 2009-02-13 17:08:33 +00:00
parent 7ec551cfad
commit 0a8e13fd8b
2 changed files with 8 additions and 5 deletions

View File

@ -733,8 +733,10 @@ struct VISIBILITY_HIDDEN StrToOpt : public LibCallOptimization {
return 0;
Value *EndPtr = CI->getOperand(2);
if (isa<ConstantPointerNull>(EndPtr))
if (isa<ConstantPointerNull>(EndPtr)) {
CI->setOnlyReadsMemory();
CI->addAttribute(1, Attribute::NoCapture);
}
return 0;
}

View File

@ -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
}