EricWF accepted this revision.
EricWF added inline comments.
This revision is now accepted and ready to land.


================
Comment at: libcxx/include/bit:240
+    else if constexpr (sizeof(_Tp) <= sizeof(unsigned long))
+        return __clz(static_cast<unsigned long>(__t))
+              - (numeric_limits<unsigned long>::digits - 
numeric_limits<_Tp>::digits);
----------------
Quuxplusone wrote:
> mclow.lists wrote:
> > EricWF wrote:
> > > Do we even need `if constexpr` here?
> > Yes. When instantiated with `_Tp == unsigned long` (say), this should be a 
> > single call to `__clz`, w/o any other code.
> The optimizer should take care of that just fine. But, `if constexpr` also 
> prevents us from unnecessarily trying to instantiate, say, 
> `static_cast<unsigned long long>(__t)`, in the case that `__t` is of a 
> user-defined type where that conversion's definition is ill-formed or 
> explicitly deleted. I'm still extremely skeptical that any user-defined type 
> is ever allowed to reach this code without UB; but if it is, then 
> instantiating just the bare minimum of conversions might be a QoI issue. (The 
> standard doesn't say anything about what this template should do for 
> user-defined types, so keeping the surface area small is a good idea.)
@mclow.lists That's what already happens https://godbolt.org/z/5JX3md

Clang doesn't emit the dead branch at any optimization level. So the `if 
constexpr` isn't needed.
But the extra tokens make it read like it is needed, which as you argued for 
`_VSTD`, is confusing.


================
Comment at: libcxx/include/bit:366
+
+#ifndef _LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED
+    if (!__builtin_is_constant_evaluated ())
----------------
I don't want us to get in the habit of conditionally compiling based on 
`__builtin_is_constant_evaluated()`.

I think the following formulation would be cleaner.
```
// Somewhere in <type_traits>
#if _LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED
constexpr bool __libcpp_is_constant_evaluated() { return false; }
#else
constexpr bool __libcpp_is_constant_evaluated() { return 
__builtin_is_constant_evaluated(); }
#endif

// in ceil2

_LIBCPP_ASSERT(__libcpp_is_constant_evaluated() || <cond>);


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D51262/new/

https://reviews.llvm.org/D51262



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

Reply via email to