summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2012-10-19 20:43:44 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2012-10-19 20:43:44 +0000
commit317d6c621de053db9ef24f53e9bb8c11a297668b (patch)
tree5826bf78671aac4f84de21ef6c576600fe52451b
parent14e0bb54a5bb33185b25152568aa6f361b85a2fb (diff)
downloadbcm5719-llvm-317d6c621de053db9ef24f53e9bb8c11a297668b.tar.gz
bcm5719-llvm-317d6c621de053db9ef24f53e9bb8c11a297668b.zip
SimplifyLibcalls: The return value of ffsll is always i32, even when the input is zero.
Fixes PR13028. llvm-svn: 166313
-rw-r--r--llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp4
-rw-r--r--llvm/test/Transforms/SimplifyLibCalls/FFS.ll15
2 files changed, 14 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp
index 90efa8ae0e0..c82a00fc2c8 100644
--- a/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Scalar/SimplifyLibCalls.cpp
@@ -772,8 +772,8 @@ struct FFSOpt : public LibCallOptimization {
// Constant fold.
if (ConstantInt *CI = dyn_cast<ConstantInt>(Op)) {
- if (CI->getValue() == 0) // ffs(0) -> 0.
- return Constant::getNullValue(CI->getType());
+ if (CI->isZero()) // ffs(0) -> 0.
+ return B.getInt32(0);
// ffs(c) -> cttz(c)+1
return B.getInt32(CI->getValue().countTrailingZeros() + 1);
}
diff --git a/llvm/test/Transforms/SimplifyLibCalls/FFS.ll b/llvm/test/Transforms/SimplifyLibCalls/FFS.ll
index e38d78349d4..6aecbeacd7e 100644
--- a/llvm/test/Transforms/SimplifyLibCalls/FFS.ll
+++ b/llvm/test/Transforms/SimplifyLibCalls/FFS.ll
@@ -1,6 +1,7 @@
-; Test that the ToAsciiOptimizer works correctly
-; RUN: opt < %s -simplify-libcalls -S | \
-; RUN: not grep "call.*@ffs"
+; Test that FFSOpt works correctly
+; RUN: opt < %s -simplify-libcalls -S | FileCheck %s
+
+; CHECK-NOT: call{{.*}}@ffs
@non_const = external global i32 ; <i32*> [#uses=1]
@@ -34,3 +35,11 @@ define i32 @a(i64) nounwind {
%2 = call i32 @ffsll(i64 %0) ; <i32> [#uses=1]
ret i32 %2
}
+
+; PR13028
+define i32 @b() nounwind {
+ %ffs = call i32 @ffsll(i64 0)
+ ret i32 %ffs
+; CHECK: @b
+; CHECK-NEXT: ret i32 0
+}
OpenPOWER on IntegriCloud