libstdc++: Ensure __builtin_constant_p isn't lost on the way
authorMatthias Kretz <m.kretz@gsi.de>
Fri, 13 Jan 2023 15:20:36 +0000 (16:20 +0100)
committerMatthias Kretz <m.kretz@gsi.de>
Thu, 16 Feb 2023 14:58:33 +0000 (15:58 +0100)
The more expensive code path should only be taken if it can be optimized
away.

Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:

* include/experimental/bits/simd.h
(_SimdWrapper::_M_is_constprop_none_of)
(_SimdWrapper::_M_is_constprop_all_of): Return false unless the
computed result still satisfies __builtin_constant_p.

libstdc++-v3/include/experimental/bits/simd.h

index e76f4781fa6c229cdb7cd1c888dd5f479be1bb5b..3de966bbf2295b624061ddaa9cfbfa54beedf202 100644 (file)
@@ -2673,7 +2673,8 @@ template <typename _Tp, size_t _Width>
          else
            __execute_n_times<_Width>(
              [&](auto __i) { __r &= _M_data[__i.value] == _Tp(); });
-         return __r;
+         if (__builtin_constant_p(__r))
+           return __r;
        }
       return false;
     }
@@ -2693,7 +2694,8 @@ template <typename _Tp, size_t _Width>
          else
            __execute_n_times<_Width>(
              [&](auto __i) { __r &= _M_data[__i.value] == ~_Tp(); });
-         return __r;
+         if (__builtin_constant_p(__r))
+           return __r;
        }
       return false;
     }