https://github.com/wenju-he created 
https://github.com/llvm/llvm-project/pull/172599

Replace __clc_max/min with __clc_fmax/fmin in __clc_clamp. FP 
__clc_min/max/clamp now lowers to @llvm.minimumnum/@llvm.maximumnum, and 
integer clamp lowers to @llvm.umin/@llvm.umax. This reduce fcmp+select chains 
and improving codegen. Example change to amdgcn--amdhsa.bc:
```
in function _Z5clamphhh:
    >   %4 = icmp ugt i8 %0, %2
        %4 = tail call noundef i8 @llvm.umax.i8(i8 %0, i8 %1)
    >   %6 = select i1 %4, i8 %2, i8 %5
    >   ret i8 %6
    <   %5 = tail call noundef i8 @llvm.umin.i8(i8 %2, i8 %4)
    <   ret i8 %5
in function _Z5clampddd:
  in block %3 / %3:
    >   %4 = fcmp ogt double %0, %2
    >   %5 = fcmp olt double %0, %1
    >   %6 = select i1 %5, double %1, double %0
    >   %7 = select i1 %4, double %2, double %6
    >   ret double %7
    <   %4 = tail call noundef double @llvm.maximumnum.f64(double %0, double %1)
    <   %5 = tail call noundef double @llvm.minimumnum.f64(double %4, double %2)
    <   ret double %5
```

>From b69c963c2638b4d3b522ad797992c52dcce2f2b8 Mon Sep 17 00:00:00 2001
From: Wenju He <[email protected]>
Date: Wed, 17 Dec 2025 06:43:31 +0100
Subject: [PATCH] [libclc] Improve __clc_min/max/clamp implementation

Replace __clc_max/min with __clc_fmax/fmin in __clc_clamp.
FP __clc_min/max/clamp now lowers to @llvm.minimumnum/@llvm.maximumnum,
and integer clamp lowers to @llvm.umin/@llvm.umax. This reduce
fcmp+select chains and improving codegen. Example change to amdgcn--amdhsa.bc:
```
in function _Z5clamphhh:
    >   %4 = icmp ugt i8 %0, %2
        %4 = tail call noundef i8 @llvm.umax.i8(i8 %0, i8 %1)
    >   %6 = select i1 %4, i8 %2, i8 %5
    >   ret i8 %6
    <   %5 = tail call noundef i8 @llvm.umin.i8(i8 %2, i8 %4)
    <   ret i8 %5
in function _Z5clampddd:
  in block %3 / %3:
    >   %4 = fcmp ogt double %0, %2
    >   %5 = fcmp olt double %0, %1
    >   %6 = select i1 %5, double %1, double %0
    >   %7 = select i1 %4, double %2, double %6
    >   ret double %7
    <   %4 = tail call noundef double @llvm.maximumnum.f64(double %0, double %1)
    <   %5 = tail call noundef double @llvm.minimumnum.f64(double %4, double %2)
    <   ret double %5
```
---
 libclc/clc/lib/generic/shared/clc_clamp.cl  |  2 ++
 libclc/clc/lib/generic/shared/clc_clamp.inc |  5 ++---
 libclc/clc/lib/generic/shared/clc_max.cl    |  1 +
 libclc/clc/lib/generic/shared/clc_max.inc   | 20 +++++++++++++++++++-
 libclc/clc/lib/generic/shared/clc_min.cl    |  1 +
 libclc/clc/lib/generic/shared/clc_min.inc   | 19 ++++++++++++++++++-
 6 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/libclc/clc/lib/generic/shared/clc_clamp.cl 
b/libclc/clc/lib/generic/shared/clc_clamp.cl
index 4d83a08e44c3b..1e81405f74197 100644
--- a/libclc/clc/lib/generic/shared/clc_clamp.cl
+++ b/libclc/clc/lib/generic/shared/clc_clamp.cl
@@ -7,6 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include <clc/internal/clc.h>
+#include <clc/shared/clc_max.h>
+#include <clc/shared/clc_min.h>
 
 #define __CLC_BODY <clc_clamp.inc>
 #include <clc/integer/gentype.inc>
diff --git a/libclc/clc/lib/generic/shared/clc_clamp.inc 
b/libclc/clc/lib/generic/shared/clc_clamp.inc
index 571f6470e5703..bb72e8ac5bd3c 100644
--- a/libclc/clc/lib/generic/shared/clc_clamp.inc
+++ b/libclc/clc/lib/generic/shared/clc_clamp.inc
@@ -9,14 +9,13 @@
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_clamp(__CLC_GENTYPE x,
                                                  __CLC_GENTYPE y,
                                                  __CLC_GENTYPE z) {
-  return (x > z ? z : (x < y ? y : x));
+  return __clc_min(__clc_max(x, y), z);
 }
 
 #ifndef __CLC_SCALAR
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_clamp(__CLC_GENTYPE x,
                                                  __CLC_SCALAR_GENTYPE y,
                                                  __CLC_SCALAR_GENTYPE z) {
-  return (x > (__CLC_GENTYPE)z ? (__CLC_GENTYPE)z
-                               : (x < (__CLC_GENTYPE)y ? (__CLC_GENTYPE)y : 
x));
+  return __clc_min(__clc_max(x, (__CLC_GENTYPE)y), (__CLC_GENTYPE)z);
 }
 #endif
diff --git a/libclc/clc/lib/generic/shared/clc_max.cl 
b/libclc/clc/lib/generic/shared/clc_max.cl
index 092ce33b38331..a6e831d1eac0c 100644
--- a/libclc/clc/lib/generic/shared/clc_max.cl
+++ b/libclc/clc/lib/generic/shared/clc_max.cl
@@ -7,6 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include <clc/internal/clc.h>
+#include <clc/math/clc_fmax.h>
 
 #define __CLC_BODY <clc_max.inc>
 #include <clc/integer/gentype.inc>
diff --git a/libclc/clc/lib/generic/shared/clc_max.inc 
b/libclc/clc/lib/generic/shared/clc_max.inc
index 882f29ce30d94..98e2a50cb2857 100644
--- a/libclc/clc/lib/generic/shared/clc_max.inc
+++ b/libclc/clc/lib/generic/shared/clc_max.inc
@@ -6,6 +6,22 @@
 //
 
//===----------------------------------------------------------------------===//
 
+#ifdef __CLC_FPSIZE
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_max(__CLC_GENTYPE a,
+                                               __CLC_GENTYPE b) {
+  return __clc_fmax(a, b);
+}
+
+#ifndef __CLC_SCALAR
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_max(__CLC_GENTYPE a,
+                                               __CLC_SCALAR_GENTYPE b) {
+  return __clc_fmax(a, b);
+}
+#endif // __CLC_SCALAR
+
+#else // __CLC_FPSIZE
+
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_max(__CLC_GENTYPE a,
                                                __CLC_GENTYPE b) {
   return (a > b ? a : b);
@@ -16,4 +32,6 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_max(__CLC_GENTYPE 
a,
                                                __CLC_SCALAR_GENTYPE b) {
   return (a > (__CLC_GENTYPE)b ? a : (__CLC_GENTYPE)b);
 }
-#endif
+#endif // __CLC_SCALAR
+
+#endif // __CLC_FPSIZE
diff --git a/libclc/clc/lib/generic/shared/clc_min.cl 
b/libclc/clc/lib/generic/shared/clc_min.cl
index d34a606839f21..f345e55c33be7 100644
--- a/libclc/clc/lib/generic/shared/clc_min.cl
+++ b/libclc/clc/lib/generic/shared/clc_min.cl
@@ -7,6 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include <clc/internal/clc.h>
+#include <clc/math/clc_fmin.h>
 
 #define __CLC_BODY <clc_min.inc>
 #include <clc/integer/gentype.inc>
diff --git a/libclc/clc/lib/generic/shared/clc_min.inc 
b/libclc/clc/lib/generic/shared/clc_min.inc
index d8a51291dbc27..90877d1ab9b17 100644
--- a/libclc/clc/lib/generic/shared/clc_min.inc
+++ b/libclc/clc/lib/generic/shared/clc_min.inc
@@ -6,6 +6,21 @@
 //
 
//===----------------------------------------------------------------------===//
 
+#ifdef __CLC_FPSIZE
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_min(__CLC_GENTYPE a,
+                                               __CLC_GENTYPE b) {
+  return __clc_fmin(a, b);
+}
+
+#ifndef __CLC_SCALAR
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_min(__CLC_GENTYPE a,
+                                               __CLC_SCALAR_GENTYPE b) {
+  return __clc_fmin(a, b);
+}
+#endif // __CLC_SCALAR
+
+#else // __CLC_FPSIZE
+
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_min(__CLC_GENTYPE a,
                                                __CLC_GENTYPE b) {
   return (b < a ? b : a);
@@ -16,4 +31,6 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_min(__CLC_GENTYPE 
a,
                                                __CLC_SCALAR_GENTYPE b) {
   return (b < (__CLC_GENTYPE)a ? (__CLC_GENTYPE)b : a);
 }
-#endif
+#endif // __CLC_SCALAR
+
+#endif // __CLC_FPSIZE

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to