Mark strto* as readonly when the endptr is null.
authorNick Lewycky <nicholas@mxc.ca>
Fri, 13 Feb 2009 17:08:33 +0000 (17:08 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Fri, 13 Feb 2009 17:08:33 +0000 (17:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64460 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/SimplifyLibCalls.cpp
test/Transforms/SimplifyLibCalls/2009-02-12-StrTo.ll

index fed239eae3690a53490ee45fdcc85296ff2a56e9..c199f301a99eefd229dcbdb8a5352dfb261672b4 100644 (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;
   }
index 3d51d78ecea28531ea8bbbfa4b65972c0890256c..4aeff1c048d85c2600d0363b57827ccac805e000 100644 (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
 }