[llvm] r188489 - Fixing a corner-case bug in strchr and strrchr lib call optimizations where
Yunzhong Gao
Yunzhong_Gao at playstation.sony.com
Thu Aug 15 13:58:59 PDT 2013
Author: ygao
Date: Thu Aug 15 15:58:59 2013
New Revision: 188489
URL: http://llvm.org/viewvc/llvm-project?rev=188489&view=rev
Log:
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
Modified:
llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
llvm/trunk/test/Transforms/InstCombine/strchr-1.ll
llvm/trunk/test/Transforms/InstCombine/strrchr-1.ll
Modified: llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp?rev=188489&r1=188488&r2=188489&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp Thu Aug 15 15:58:59 2013
@@ -477,7 +477,7 @@ struct StrChrOpt : public LibCallOptimiz
// 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 LibCallOptimi
}
// 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());
Modified: llvm/trunk/test/Transforms/InstCombine/strchr-1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/strchr-1.ll?rev=188489&r1=188488&r2=188489&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/strchr-1.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/strchr-1.ll Thu Aug 15 15:58:59 2013
@@ -52,3 +52,14 @@ define void @test_simplify4(i32 %chr) {
store i8* %dst, i8** @chp
ret void
}
+
+define void @test_simplify5() {
+; CHECK: store i8* getelementptr inbounds ([14 x i8]* @hello, i32 0, i32 13)
+; CHECK-NOT: call i8* @strchr
+; CHECK: ret void
+
+ %src = getelementptr [14 x i8]* @hello, i32 0, i32 0
+ %dst = call i8* @strchr(i8* %src, i32 65280)
+ store i8* %dst, i8** @chp
+ ret void
+}
Modified: llvm/trunk/test/Transforms/InstCombine/strrchr-1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/strrchr-1.ll?rev=188489&r1=188488&r2=188489&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/strrchr-1.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/strrchr-1.ll Thu Aug 15 15:58:59 2013
@@ -42,6 +42,17 @@ define void @test_simplify3() {
ret void
}
+define void @test_simplify4() {
+; CHECK: store i8* getelementptr inbounds ([14 x i8]* @hello, i32 0, i32 13)
+; CHECK-NOT: call i8* @strrchr
+; CHECK: ret void
+
+ %src = getelementptr [14 x i8]* @hello, i32 0, i32 0
+ %dst = call i8* @strrchr(i8* %src, i32 65280)
+ store i8* %dst, i8** @chp
+ ret void
+}
+
define void @test_nosimplify1(i32 %chr) {
; CHECK-LABEL: @test_nosimplify1(
; CHECK: call i8* @strrchr
More information about the llvm-commits
mailing list