]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Simplify chrono::duration::_S_gcd
authorJonathan Wakely <jwakely@redhat.com>
Mon, 7 Sep 2020 19:09:17 +0000 (20:09 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Mon, 7 Sep 2020 19:09:17 +0000 (20:09 +0100)
We can simplify this constexpr function further because we know that
period::num >= 1 and period::den >= 1 so only the remainder can ever be
zero.

libstdc++-v3/ChangeLog:

* include/std/chrono (duration::_S_gcd): Use invariant that
neither value is zero initially.

libstdc++-v3/include/std/chrono

index 0e2efb2522b74bc0611261190bcac31bad4f6ea3..afee7859c6ddbeb0eb54f68322aaca527750ebff 100644 (file)
@@ -430,17 +430,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          // Duration only allows positive periods so we don't need to
          // handle negative values here (unlike __static_gcd and std::gcd).
 #if __cplusplus >= 201402L
-         while (__m != 0 && __n != 0)
+         do
            {
              intmax_t __rem = __m % __n;
              __m = __n;
              __n = __rem;
            }
-         return __m + __n;
+         while (__n != 0);
+         return __m;
 #else
          // C++11 doesn't allow loops in constexpr functions, but this
          // recursive version can be more expensive to evaluate.
-         return (__m == 0) ? __n : (__n == 0) ? __m : _S_gcd(__n, __m % __n);
+         return (__n == 0) ? __m : _S_gcd(__n, __m % __n);
 #endif
        }