================
@@ -66,13 +65,11 @@ bool __attribute__((noinline)) 
__clc_runtime_has_hw_fma32(void);
 #define LOG_MAGIC_NUM_SP32 (1 + NUMEXPBITS_SP32 - EXPBIAS_SP32)
 
 _CLC_OVERLOAD _CLC_INLINE float __clc_flush_denormal_if_not_supported(float x) 
{
-  int ix = __clc_as_int(x);
-  if (!__clc_fp32_subnormals_supported() && ((ix & EXPBITS_SP32) == 0) &&
-      ((ix & MANTBITS_SP32) != 0)) {
-    ix &= SIGNBIT_SP32;
-    x = __clc_as_float(ix);
-  }
-  return x;
+  // Avoid calling __clc_fp32_subnormals_supported here: it uses
+  // llvm.canonicalize, which quiets sNaN.
+  return __builtin_fabsf(x) < 0x1p-149f
+             ? __builtin_elementwise_copysign(0.0f, x)
+             : x;
----------------
arsenm wrote:

The name is now right, but the usage is not. You do not want to unconditionally 
force a denormal flush, pretty much anywhere. 

I also believe most of the explicit flushes / canonicalizes in the math 
function implementations can be deleted with some shuffling around. I removed 
most of these in the rocm-device-libs implementations a few years ago. A few 
more remain but I believe they can also be avoided 

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

Reply via email to