summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2010-05-25 22:53:43 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2010-05-25 22:53:43 +0000
commit9439084cea7452256832f137cc9eaf79a1c7e45b (patch)
tree73714f15bd2c4819ed98fc8fd9543d5f4527db2d /llvm/lib/Transforms
parent388f6385113b6d25cfd5c5950f6c2176526a4e3b (diff)
downloadbcm5719-llvm-9439084cea7452256832f137cc9eaf79a1c7e45b.tar.gz
bcm5719-llvm-9439084cea7452256832f137cc9eaf79a1c7e45b.zip
Properly promote operands when optimizing a single-character memcmp.
llvm-svn: 104648
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp
index b053cfc3b46..0f3ab7d8b53 100644
--- a/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp
@@ -558,9 +558,12 @@ struct MemCmpOpt : public LibCallOptimization {
if (Len == 0) // memcmp(s1,s2,0) -> 0
return Constant::getNullValue(CI->getType());
- if (Len == 1) { // memcmp(S1,S2,1) -> *LHS - *RHS
- Value *LHSV = B.CreateLoad(CastToCStr(LHS, B), "lhsv");
- Value *RHSV = B.CreateLoad(CastToCStr(RHS, B), "rhsv");
+ // memcmp(S1,S2,1) -> *(unsigned char*)LHS - *(unsigned char*)RHS
+ if (Len == 1) {
+ Value *LHSV = B.CreateZExt(B.CreateLoad(CastToCStr(LHS, B), "lhsc"),
+ CI->getType(), "lhsv");
+ Value *RHSV = B.CreateZExt(B.CreateLoad(CastToCStr(RHS, B), "rhsc"),
+ CI->getType(), "rhsv");
return B.CreateSExt(B.CreateSub(LHSV, RHSV, "chardiff"), CI->getType());
}
OpenPOWER on IntegriCloud