timshen created this revision.
timshen added a reviewer: mclow.lists.
Herald added subscribers: christof, sanjoy.
Herald added a reviewer: EricWF.

https://reviews.llvm.org/D44660

Files:
  libcxx/include/experimental/simd


Index: libcxx/include/experimental/simd
===================================================================
--- libcxx/include/experimental/simd
+++ libcxx/include/experimental/simd
@@ -611,6 +611,13 @@
 #pragma GCC system_header
 #endif
 
+#if !defined(_LIBCPP_COMPILER_CLANG)
+#define _LIBCPP_UNROLL
+#else
+// See LLVM PR/36359 for context of this workaround.
+#define _LIBCPP_UNROLL _Pragma("unroll")
+#endif
+
 _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_SIMD
 
 enum class _StorageKind {
@@ -2109,20 +2116,22 @@
 
 // algorithms [simd.alg]
 template <class _Tp, class _Abi>
-simd<_Tp, _Abi> min(const simd<_Tp, _Abi>& __a,
-                    const simd<_Tp, _Abi>& __b) noexcept {
+// Add `inline` keyword until LLVM PR/36495 is fixed
+inline simd<_Tp, _Abi> min(const simd<_Tp, _Abi>& __a,
+                           const simd<_Tp, _Abi>& __b) noexcept {
   simd<_Tp, _Abi> __v;
-  for (size_t __i = 0; __i < __v.size(); __i++) {
+  _LIBCPP_UNROLL for (size_t __i = 0; __i < __v.size(); __i++) {
     __v[__i] = std::min(__a[__i], __b[__i]);
   }
   return __v;
 }
 
 template <class _Tp, class _Abi>
-simd<_Tp, _Abi> max(const simd<_Tp, _Abi>& __a,
-                    const simd<_Tp, _Abi>& __b) noexcept {
+// Add `inline` keyword until LLVM PR/36495 is fixed
+inline simd<_Tp, _Abi> max(const simd<_Tp, _Abi>& __a,
+                           const simd<_Tp, _Abi>& __b) noexcept {
   simd<_Tp, _Abi> __v;
-  for (size_t __i = 0; __i < __v.size(); __i++) {
+  _LIBCPP_UNROLL for (size_t __i = 0; __i < __v.size(); __i++) {
     __v[__i] = std::max(__a[__i], __b[__i]);
   }
   return __v;
@@ -3060,4 +3069,6 @@
 
 _LIBCPP_END_NAMESPACE_EXPERIMENTAL_SIMD
 
+#undef _LIBCPP_UNROLL
+
 #endif /* _LIBCPP_EXPERIMENTAL_SIMD */


Index: libcxx/include/experimental/simd
===================================================================
--- libcxx/include/experimental/simd
+++ libcxx/include/experimental/simd
@@ -611,6 +611,13 @@
 #pragma GCC system_header
 #endif
 
+#if !defined(_LIBCPP_COMPILER_CLANG)
+#define _LIBCPP_UNROLL
+#else
+// See LLVM PR/36359 for context of this workaround.
+#define _LIBCPP_UNROLL _Pragma("unroll")
+#endif
+
 _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_SIMD
 
 enum class _StorageKind {
@@ -2109,20 +2116,22 @@
 
 // algorithms [simd.alg]
 template <class _Tp, class _Abi>
-simd<_Tp, _Abi> min(const simd<_Tp, _Abi>& __a,
-                    const simd<_Tp, _Abi>& __b) noexcept {
+// Add `inline` keyword until LLVM PR/36495 is fixed
+inline simd<_Tp, _Abi> min(const simd<_Tp, _Abi>& __a,
+                           const simd<_Tp, _Abi>& __b) noexcept {
   simd<_Tp, _Abi> __v;
-  for (size_t __i = 0; __i < __v.size(); __i++) {
+  _LIBCPP_UNROLL for (size_t __i = 0; __i < __v.size(); __i++) {
     __v[__i] = std::min(__a[__i], __b[__i]);
   }
   return __v;
 }
 
 template <class _Tp, class _Abi>
-simd<_Tp, _Abi> max(const simd<_Tp, _Abi>& __a,
-                    const simd<_Tp, _Abi>& __b) noexcept {
+// Add `inline` keyword until LLVM PR/36495 is fixed
+inline simd<_Tp, _Abi> max(const simd<_Tp, _Abi>& __a,
+                           const simd<_Tp, _Abi>& __b) noexcept {
   simd<_Tp, _Abi> __v;
-  for (size_t __i = 0; __i < __v.size(); __i++) {
+  _LIBCPP_UNROLL for (size_t __i = 0; __i < __v.size(); __i++) {
     __v[__i] = std::max(__a[__i], __b[__i]);
   }
   return __v;
@@ -3060,4 +3069,6 @@
 
 _LIBCPP_END_NAMESPACE_EXPERIMENTAL_SIMD
 
+#undef _LIBCPP_UNROLL
+
 #endif /* _LIBCPP_EXPERIMENTAL_SIMD */
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to