1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include <array>
10#include <benchmark/benchmark.h>
11#include <cstring>
12#include <numeric>
13#include <random>
14
15template <class T>
16static std::array<T, 1000> generate(std::uniform_int_distribution<T> distribution = std::uniform_int_distribution<T>{
17 std::numeric_limits<T>::min() + 1, std::numeric_limits<T>::max()}) {
18 std::mt19937 generator;
19 std::array<T, 1000> result;
20 std::generate_n(result.begin(), result.size(), [&] { return distribution(generator); });
21 return result;
22}
23
24static void bm_gcd_random(benchmark::State& state) {
25 std::array data = generate<int>();
26 while (state.KeepRunningBatch(data.size()))
27 for (auto v0 : data)
28 for (auto v1 : data)
29 benchmark::DoNotOptimize(std::gcd(v0, v1));
30}
31BENCHMARK(bm_gcd_random);
32
33static void bm_gcd_trivial(benchmark::State& state) {
34 int lhs = ~static_cast<int>(0), rhs = 1;
35 for (auto _ : state) {
36 benchmark::DoNotOptimize(lhs);
37 benchmark::DoNotOptimize(rhs);
38 benchmark::DoNotOptimize(std::gcd(lhs, rhs));
39 }
40}
41BENCHMARK(bm_gcd_trivial);
42
43static void bm_gcd_complex(benchmark::State& state) {
44 int lhs = 2971215073, rhs = 1836311903;
45 for (auto _ : state) {
46 benchmark::DoNotOptimize(lhs);
47 benchmark::DoNotOptimize(rhs);
48 benchmark::DoNotOptimize(std::gcd(lhs, rhs));
49 }
50}
51BENCHMARK(bm_gcd_complex);
52
53BENCHMARK_MAIN();
54