[clang] [llvm] [C++23] [CLANG] Adding C++23 constexpr math functions: fmin, fmax and frexp. (PR #88978)

Hubert Tong via cfe-commits cfe-commits at lists.llvm.org
Fri May 17 22:05:31 PDT 2024


================
@@ -0,0 +1,162 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
+// RUN: %clang_cc1 -x c++ -triple x86_64-unknown-unknown -std=c++23 \
+// RUN: -DWIN -emit-llvm -o - %s | FileCheck %s --check-prefixes=WIN
+
+// RUN: %clang_cc1 -x c++ -triple x86_64-unknown-unknown -std=c++23 \
+// RUN: -emit-llvm -o - %s | FileCheck %s --check-prefixes=LNX
+
+#ifdef WIN
+#define INFINITY ((float)(1e+300 * 1e+300))
+#define NAN      (-(float)(INFINITY * 0.0F))
+#else
+#define NAN (__builtin_nanf(""))
+#define INFINITY (__builtin_inff())
+#endif
+
+// WIN-LABEL: define dso_local noundef i32 @_Z4funcv(
+// WIN-SAME: ) #[[ATTR0:[0-9]+]] {
+// WIN-NEXT:  entry:
+// WIN-NEXT:    [[I:%.*]] = alloca i32, align 4
+// WIN-NEXT:    [[MIN1:%.*]] = alloca double, align 8
+// WIN-NEXT:    [[MIN2:%.*]] = alloca double, align 8
+// WIN-NEXT:    [[MIN3:%.*]] = alloca double, align 8
+// WIN-NEXT:    [[MIN4:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[MIN5:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[MIN6:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[MIN7:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[MIN8:%.*]] = alloca x86_fp80, align 16
+// WIN-NEXT:    [[MAX1:%.*]] = alloca double, align 8
+// WIN-NEXT:    [[MAX2:%.*]] = alloca double, align 8
+// WIN-NEXT:    [[MAX3:%.*]] = alloca double, align 8
+// WIN-NEXT:    [[MAX4:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[MAX5:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[MAX6:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[MAX7:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[MAX8:%.*]] = alloca x86_fp80, align 16
+// WIN-NEXT:    [[FREXP1:%.*]] = alloca double, align 8
+// WIN-NEXT:    [[FREXP2:%.*]] = alloca double, align 8
+// WIN-NEXT:    [[FREXP3:%.*]] = alloca double, align 8
+// WIN-NEXT:    [[FREXP4:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[FREXP5:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[FREXP6:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[FREXP7:%.*]] = alloca float, align 4
+// WIN-NEXT:    [[FREXP8:%.*]] = alloca x86_fp80, align 16
+// WIN-NEXT:    store i32 0, ptr [[I]], align 4
+// WIN-NEXT:    store double 1.300000e+00, ptr [[MIN1]], align 8
+// WIN-NEXT:    store double -0.000000e+00, ptr [[MIN2]], align 8
+// WIN-NEXT:    store double -0.000000e+00, ptr [[MIN3]], align 8
+// WIN-NEXT:    store float 0xFFF8000000000000, ptr [[MIN4]], align 4
+// WIN-NEXT:    store float -1.000000e+00, ptr [[MIN5]], align 4
+// WIN-NEXT:    store float 0xFFF0000000000000, ptr [[MIN6]], align 4
+// WIN-NEXT:    store float 0.000000e+00, ptr [[MIN7]], align 4
+// WIN-NEXT:    store x86_fp80 0xK4005F6E978D4FDF3B646, ptr [[MIN8]], align 16
+// WIN-NEXT:    store double 1.524000e+01, ptr [[MAX1]], align 8
+// WIN-NEXT:    store double 0.000000e+00, ptr [[MAX2]], align 8
+// WIN-NEXT:    store double 0.000000e+00, ptr [[MAX3]], align 8
+// WIN-NEXT:    store float -1.000000e+00, ptr [[MAX4]], align 4
+// WIN-NEXT:    store float 0x7FF0000000000000, ptr [[MAX5]], align 4
+// WIN-NEXT:    store float 0.000000e+00, ptr [[MAX6]], align 4
+// WIN-NEXT:    store float 0xFFF8000000000000, ptr [[MAX7]], align 4
+// WIN-NEXT:    store x86_fp80 0xK4008C540C49BA5E353F8, ptr [[MAX8]], align 16
+// WIN-NEXT:    store double 0x3FEEDCCCCCCCCCCD, ptr [[FREXP1]], align 8
+// WIN-NEXT:    store double 0.000000e+00, ptr [[FREXP2]], align 8
+// WIN-NEXT:    store double -0.000000e+00, ptr [[FREXP3]], align 8
+// WIN-NEXT:    store float 0xFFF8000000000000, ptr [[FREXP4]], align 4
+// WIN-NEXT:    store float 0x7FF8000000000000, ptr [[FREXP5]], align 4
+// WIN-NEXT:    store float 0x7FF0000000000000, ptr [[FREXP6]], align 4
+// WIN-NEXT:    store float 0x7FF0000000000000, ptr [[FREXP7]], align 4
+// WIN-NEXT:    store x86_fp80 0xK3FFE81A9FBE76C8B4396, ptr [[FREXP8]], align 16
+// WIN-NEXT:    ret i32 0
+//
+// LNX-LABEL: define dso_local noundef i32 @_Z4funcv(
+// LNX-SAME: ) #[[ATTR0:[0-9]+]] {
+// LNX-NEXT:  entry:
+// LNX-NEXT:    [[I:%.*]] = alloca i32, align 4
+// LNX-NEXT:    [[MIN1:%.*]] = alloca double, align 8
+// LNX-NEXT:    [[MIN2:%.*]] = alloca double, align 8
+// LNX-NEXT:    [[MIN3:%.*]] = alloca double, align 8
+// LNX-NEXT:    [[MIN4:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[MIN5:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[MIN6:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[MIN7:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[MIN8:%.*]] = alloca x86_fp80, align 16
+// LNX-NEXT:    [[MAX1:%.*]] = alloca double, align 8
+// LNX-NEXT:    [[MAX2:%.*]] = alloca double, align 8
+// LNX-NEXT:    [[MAX3:%.*]] = alloca double, align 8
+// LNX-NEXT:    [[MAX4:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[MAX5:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[MAX6:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[MAX7:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[MAX8:%.*]] = alloca x86_fp80, align 16
+// LNX-NEXT:    [[FREXP1:%.*]] = alloca double, align 8
+// LNX-NEXT:    [[FREXP2:%.*]] = alloca double, align 8
+// LNX-NEXT:    [[FREXP3:%.*]] = alloca double, align 8
+// LNX-NEXT:    [[FREXP4:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[FREXP5:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[FREXP6:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[FREXP7:%.*]] = alloca float, align 4
+// LNX-NEXT:    [[FREXP8:%.*]] = alloca x86_fp80, align 16
+// LNX-NEXT:    store i32 0, ptr [[I]], align 4
+// LNX-NEXT:    store double 1.300000e+00, ptr [[MIN1]], align 8
+// LNX-NEXT:    store double -0.000000e+00, ptr [[MIN2]], align 8
+// LNX-NEXT:    store double -0.000000e+00, ptr [[MIN3]], align 8
+// LNX-NEXT:    store float 0x7FF8000000000000, ptr [[MIN4]], align 4
+// LNX-NEXT:    store float -1.000000e+00, ptr [[MIN5]], align 4
+// LNX-NEXT:    store float 0xFFF0000000000000, ptr [[MIN6]], align 4
+// LNX-NEXT:    store float 0.000000e+00, ptr [[MIN7]], align 4
+// LNX-NEXT:    store x86_fp80 0xK4005F6E978D4FDF3B646, ptr [[MIN8]], align 16
+// LNX-NEXT:    store double 1.524000e+01, ptr [[MAX1]], align 8
+// LNX-NEXT:    store double 0.000000e+00, ptr [[MAX2]], align 8
+// LNX-NEXT:    store double 0.000000e+00, ptr [[MAX3]], align 8
+// LNX-NEXT:    store float -1.000000e+00, ptr [[MAX4]], align 4
+// LNX-NEXT:    store float 0x7FF0000000000000, ptr [[MAX5]], align 4
+// LNX-NEXT:    store float 0.000000e+00, ptr [[MAX6]], align 4
+// LNX-NEXT:    store float 0x7FF8000000000000, ptr [[MAX7]], align 4
+// LNX-NEXT:    store x86_fp80 0xK4008C540C49BA5E353F8, ptr [[MAX8]], align 16
+// LNX-NEXT:    store double 0x3FEEDCCCCCCCCCCD, ptr [[FREXP1]], align 8
+// LNX-NEXT:    store double 0.000000e+00, ptr [[FREXP2]], align 8
+// LNX-NEXT:    store double -0.000000e+00, ptr [[FREXP3]], align 8
+// LNX-NEXT:    store float 0x7FF8000000000000, ptr [[FREXP4]], align 4
+// LNX-NEXT:    store float 0xFFF8000000000000, ptr [[FREXP5]], align 4
+// LNX-NEXT:    store float 0x7FF0000000000000, ptr [[FREXP6]], align 4
+// LNX-NEXT:    store float 0x7FF0000000000000, ptr [[FREXP7]], align 4
+// LNX-NEXT:    store x86_fp80 0xK3FFE81A9FBE76C8B4396, ptr [[FREXP8]], align 16
+// LNX-NEXT:    ret i32 0
+//
+int func()
+{
+  int i;
+
+  // fmin
+  constexpr double min1 = __builtin_fmin(15.24, 1.3);
+  constexpr double min2 = __builtin_fmin(-0.0, +0.0);
+  constexpr double min3 = __builtin_fmin(+0.0, -0.0);
+  constexpr float min4 = __builtin_fminf(NAN, NAN);
+  constexpr float min5 = __builtin_fminf(NAN, -1);
+  constexpr float min6 = __builtin_fminf(-INFINITY, 0);
+  constexpr float min7 = __builtin_fminf(INFINITY, 0);
+  constexpr long double min8 = __builtin_fminl(123.456L, 789.012L);
+
+  // fmax
+  constexpr double max1 =  __builtin_fmax(15.24, 1.3);
----------------
hubert-reinterpretcast wrote:

Formatting nit:
```suggestion
  constexpr double max1 = __builtin_fmax(15.24, 1.3);
```

https://github.com/llvm/llvm-project/pull/88978


More information about the cfe-commits mailing list