SimplifyLibcalls: The return value of ffsll is always i32, even when the input is...
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 19 Oct 2012 20:43:44 +0000 (20:43 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 19 Oct 2012 20:43:44 +0000 (20:43 +0000)
Fixes PR13028.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166313 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/SimplifyLibCalls.cpp
test/Transforms/SimplifyLibCalls/FFS.ll

index 90efa8ae0e0ef34af8d2ffd4b3a8faeb2fedec70..c82a00fc2c836f19e46d089e06daca5eb8a0cf4e 100644 (file)
@@ -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);
     }
index e38d78349d43b603e08921e69b2a74cbda210050..6aecbeacd7e6b7e013335ec81fb67ea6e4cda12f 100644 (file)
@@ -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
+}