Author: Fraser Cormack
Date: 2025-08-21T09:32:03+01:00
New Revision: 5c411b3c0bd6b5ba9546a09919f977fe6bc6ad4c

URL: 
https://github.com/llvm/llvm-project/commit/5c411b3c0bd6b5ba9546a09919f977fe6bc6ad4c
DIFF: 
https://github.com/llvm/llvm-project/commit/5c411b3c0bd6b5ba9546a09919f977fe6bc6ad4c.diff

LOG: [libclc] Use elementwise ctlz/cttz builtins for CLC clz/ctz (#154535)

Using the elementwise builtin optimizes the vector case; instead of
scalarizing we can compile directly to the vector intrinsics.

Added: 
    libclc/clc/lib/generic/integer/clc_clz.inc
    libclc/clc/lib/generic/integer/clc_ctz.inc

Modified: 
    libclc/clc/lib/generic/integer/clc_clz.cl
    libclc/clc/lib/generic/integer/clc_ctz.cl

Removed: 
    


################################################################################
diff  --git a/libclc/clc/lib/generic/integer/clc_clz.cl 
b/libclc/clc/lib/generic/integer/clc_clz.cl
index 0d0c80b7cd1ff..37ba4dbfd8094 100644
--- a/libclc/clc/lib/generic/integer/clc_clz.cl
+++ b/libclc/clc/lib/generic/integer/clc_clz.cl
@@ -10,38 +10,5 @@
 #include <clc/integer/clc_clz.h>
 #include <clc/internal/clc.h>
 
-_CLC_OVERLOAD _CLC_DEF char __clc_clz(char x) {
-  return __clc_clz((ushort)(uchar)x) - 8;
-}
-
-_CLC_OVERLOAD _CLC_DEF uchar __clc_clz(uchar x) {
-  return __clc_clz((ushort)x) - 8;
-}
-
-_CLC_OVERLOAD _CLC_DEF short __clc_clz(short x) {
-  return x ? __builtin_clzs(x) : 16;
-}
-
-_CLC_OVERLOAD _CLC_DEF ushort __clc_clz(ushort x) {
-  return x ? __builtin_clzs(x) : 16;
-}
-
-_CLC_OVERLOAD _CLC_DEF int __clc_clz(int x) {
-  return x ? __builtin_clz(x) : 32;
-}
-
-_CLC_OVERLOAD _CLC_DEF uint __clc_clz(uint x) {
-  return x ? __builtin_clz(x) : 32;
-}
-
-_CLC_OVERLOAD _CLC_DEF long __clc_clz(long x) {
-  return x ? __builtin_clzl(x) : 64;
-}
-
-_CLC_OVERLOAD _CLC_DEF ulong __clc_clz(ulong x) {
-  return x ? __builtin_clzl(x) : 64;
-}
-
-#define __CLC_FUNCTION __clc_clz
-#define __CLC_BODY <clc/shared/unary_def_scalarize.inc>
+#define __CLC_BODY <clc_clz.inc>
 #include <clc/integer/gentype.inc>

diff  --git a/libclc/clc/lib/generic/integer/clc_clz.inc 
b/libclc/clc/lib/generic/integer/clc_clz.inc
new file mode 100644
index 0000000000000..ba7eb77d50036
--- /dev/null
+++ b/libclc/clc/lib/generic/integer/clc_clz.inc
@@ -0,0 +1,11 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_clz(__CLC_GENTYPE x) {
+  return __builtin_elementwise_ctlz(x, (__CLC_GENTYPE)__CLC_GENSIZE);
+}

diff  --git a/libclc/clc/lib/generic/integer/clc_ctz.cl 
b/libclc/clc/lib/generic/integer/clc_ctz.cl
index 8dbebb3f345a5..5cf4c19811db2 100644
--- a/libclc/clc/lib/generic/integer/clc_ctz.cl
+++ b/libclc/clc/lib/generic/integer/clc_ctz.cl
@@ -10,34 +10,5 @@
 #include <clc/integer/clc_ctz.h>
 #include <clc/internal/clc.h>
 
-_CLC_OVERLOAD _CLC_DEF char __clc_ctz(char x) {
-  return __clc_ctz(__clc_as_uchar(x));
-}
-
-_CLC_OVERLOAD _CLC_DEF uchar __clc_ctz(uchar x) { return __builtin_ctzg(x, 8); 
}
-
-_CLC_OVERLOAD _CLC_DEF short __clc_ctz(short x) {
-  return __clc_ctz(__clc_as_ushort(x));
-}
-
-_CLC_OVERLOAD _CLC_DEF ushort __clc_ctz(ushort x) {
-  return __builtin_ctzg(x, 16);
-}
-
-_CLC_OVERLOAD _CLC_DEF int __clc_ctz(int x) {
-  return __clc_ctz(__clc_as_uint(x));
-}
-
-_CLC_OVERLOAD _CLC_DEF uint __clc_ctz(uint x) { return __builtin_ctzg(x, 32); }
-
-_CLC_OVERLOAD _CLC_DEF long __clc_ctz(long x) {
-  return __clc_ctz(__clc_as_ulong(x));
-}
-
-_CLC_OVERLOAD _CLC_DEF ulong __clc_ctz(ulong x) {
-  return __builtin_ctzg(x, 64);
-}
-
-#define __CLC_FUNCTION __clc_ctz
-#define __CLC_BODY <clc/shared/unary_def_scalarize.inc>
+#define __CLC_BODY <clc_ctz.inc>
 #include <clc/integer/gentype.inc>

diff  --git a/libclc/clc/lib/generic/integer/clc_ctz.inc 
b/libclc/clc/lib/generic/integer/clc_ctz.inc
new file mode 100644
index 0000000000000..cebd392542be9
--- /dev/null
+++ b/libclc/clc/lib/generic/integer/clc_ctz.inc
@@ -0,0 +1,11 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_ctz(__CLC_GENTYPE x) {
+  return __builtin_elementwise_cttz(x, (__CLC_GENTYPE)__CLC_GENSIZE);
+}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to