From ad1944c89634e870ab1cae4ba3903d3609702bb2 Mon Sep 17 00:00:00 2001
From: David Majnemer <david.majnemer@gmail.com>
Date: Mon, 13 Jun 2016 17:26:16 +0000
Subject: [PATCH] [immintrin] Reimplement _bit_scan_{forward,reverse}

There is no need to use a target-specific intrinsic to implement
_bit_scan_forward or _bit_scan_reverse, reimplementing them using
generic intrinsics makes it more likely that the middle end will
understand what's going on.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@272564 91177308-0d34-0410-b5e6-96231b3b80d8
---
 lib/Headers/immintrin.h         | 4 ++--
 test/CodeGen/bitscan-builtins.c | 8 +++++---
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/lib/Headers/immintrin.h b/lib/Headers/immintrin.h
index 7ed2035761d..15c8d750b2f 100644
--- a/lib/Headers/immintrin.h
+++ b/lib/Headers/immintrin.h
@@ -172,13 +172,13 @@ _rdrand32_step(unsigned int *__p)
 /* __bit_scan_forward */
 static __inline__ int __attribute__((__always_inline__, __nodebug__))
 _bit_scan_forward(int __A) {
- return __builtin_ia32_bit_scan_forward(__A);
+  return __builtin_ctz(__A);
 }
 
 /* __bit_scan_reverse */
 static __inline__ int __attribute__((__always_inline__, __nodebug__))
 _bit_scan_reverse(int __A) {
- return __builtin_ia32_bit_scan_reverse(__A);
+  return 31 - __builtin_clz(__A);
 }
 
 #ifdef __x86_64__
diff --git a/test/CodeGen/bitscan-builtins.c b/test/CodeGen/bitscan-builtins.c
index 85a75426342..451e8f4570c 100644
--- a/test/CodeGen/bitscan-builtins.c
+++ b/test/CodeGen/bitscan-builtins.c
@@ -7,11 +7,13 @@
 int test_bit_scan_forward(int a) {
   return _bit_scan_forward(a);
 // CHECK: @test_bit_scan_forward
-// CHECK: call i32 @llvm.x86.bit.scan.forward
+// CHECK: %[[call:.*]] = call i32 @llvm.cttz.i32(
+// CHECK: ret i32 %[[call]]
 }
 
 int test_bit_scan_reverse(int a) {
   return _bit_scan_reverse(a);
-// CHECK: @test_bit_scan_reverse
-// CHECK: call i32 @llvm.x86.bit.scan.reverse
+// CHECK:  %[[call:.*]] = call i32 @llvm.ctlz.i32(
+// CHECK:  %[[sub:.*]] = sub nsw i32 31, %2
+// CHECK: ret i32 %[[sub]]
 }
-- 
GitLab