diff options
author | Yunzhong Gao <Yunzhong_Gao@playstation.sony.com> | 2013-08-15 20:58:59 +0000 |
---|---|---|
committer | Yunzhong Gao <Yunzhong_Gao@playstation.sony.com> | 2013-08-15 20:58:59 +0000 |
commit | c0c2b1693237bd5c8ab93ab70ffd2214c0b9ef28 (patch) | |
tree | 338918211da8dadd527ae8e30485ed46b5351817 /llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | |
parent | 3d510b3db842c40a0dba4ad4c6efda045bcc303a (diff) | |
download | bcm5719-llvm-c0c2b1693237bd5c8ab93ab70ffd2214c0b9ef28.tar.gz bcm5719-llvm-c0c2b1693237bd5c8ab93ab70ffd2214c0b9ef28.zip |
Fixing a corner-case bug in strchr and strrchr lib call optimizations where
the input character is not converted to char before comparing with zero.
The patch was discussed in this thread:
http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20130812/184069.html
llvm-svn: 188489
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp index 094c20154af..93720be683e 100644 --- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -477,7 +477,7 @@ struct StrChrOpt : public LibCallOptimization { // Compute the offset, make sure to handle the case when we're searching for // zero (a weird way to spell strlen). - size_t I = CharC->getSExtValue() == 0 ? + size_t I = (255 & CharC->getSExtValue()) == 0 ? Str.size() : Str.find(CharC->getSExtValue()); if (I == StringRef::npos) // Didn't find the char. strchr returns null. return Constant::getNullValue(CI->getType()); @@ -513,7 +513,7 @@ struct StrRChrOpt : public LibCallOptimization { } // Compute the offset. - size_t I = CharC->getSExtValue() == 0 ? + size_t I = (255 & CharC->getSExtValue()) == 0 ? Str.size() : Str.rfind(CharC->getSExtValue()); if (I == StringRef::npos) // Didn't find the char. Return null. return Constant::getNullValue(CI->getType()); |