<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/58825>58825</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            SmallVector performance downgrade when small type on X86_64 
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          firedtoad
      </td>
    </tr>
</table>

<pre>
    Here is the test program
```
#include <benchmark/benchmark.h>
#include <llvm/ADT/SmallVector.h>
#include <vector>

template <typename V> static void BenchReserve(benchmark::State &state)
{
    auto sz = state.range(0);
    for (auto _ : state)
    {
        V v{};
        v.reserve(sz);
        for (auto i = 0; i < sz; i++)
        {
            v.emplace_back(i);
        }
        benchmark::DoNotOptimize(v);
    }
}

template <typename V> static void BenchReserveSmall(benchmark::State &state)
{
    auto sz = state.range(0);

    for (auto _ : state)
    {
        V v{};
        v.reserve(sz);
        for (auto i = 0; i < sz; i++)
        {
            v.emplace_back(i);
        }
        benchmark::DoNotOptimize(v);
    }
}
BENCHMARK_TEMPLATE(BenchReserve, std::vector<uint32_t>)->Range(65536, 65536);
BENCHMARK_TEMPLATE(BenchReserveSmall, llvm::SmallVector<uint32_t , 65536>)->Range(65536, 65536);
BENCHMARK_TEMPLATE(BenchReserve, std::vector<uint64_t>)->Range(65536, 65536);
BENCHMARK_TEMPLATE(BenchReserveSmall, llvm::SmallVector<uint64_t , 65536>)->Range(65536, 65536);

int main(int argc, char **argv)
{
    benchmark::Initialize(&argc, argv);
    benchmark::RunSpecifiedBenchmarks();
    return 0;
}
```
compile options
clang++-12  -fno-omit-frame-pointer -Wall -pedantic -Wextra -march=native  -fno-limit-debug-info -O2 -g -DNDEBUG -std=gnu++17 -MD -MT  -I/usr/lib/llvm-11/include 
Run output result
Run on (16 X 2593.91 MHz CPU s)
CPU Caches:
  L1 Data 48 KiB (x16)
  L1 Instruction 32 KiB (x16)
  L2 Unified 1280 KiB (x16)
  L3 Unified 43008 KiB (x16)
Load Average: 0.09, 0.03, 0.01
-------------------------------------------------------------------------------------------------------
Benchmark                                                             Time             CPU   Iterations
-------------------------------------------------------------------------------------------------------
BenchReserve<std::vector<uint32_t>>/65536                                     48142 ns         48135 ns        14538
BenchReserveSmall<llvm::SmallVector<uint32_t , 65536>>/65536     144439 ns       144411 ns       4846
BenchReserve<std::vector<uint64_t>>/65536                                      50970 ns        50961 ns        13730
BenchReserveSmall<llvm::SmallVector<uint64_t , 65536>>/65536      51382 ns        51373 ns        13628

we can see that ,when use uint32_t as type, performance downgrade so much
after reading the assembly code generated,i found the following line cause  the problem

```
template <class T>
using SmallVectorSizeType =
    typename std::conditional<sizeof(T) < 4 && sizeof(void *) >= 8, uint64_t,
                              uint32_t>::type;
```
when modify to this

```
using SmallVectorSizeType =
    typename std::conditional<sizeof(T) < 8 && sizeof(void *) >= 8, uint64_t,
                              uint32_t>::type;
```
problem gone.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztF9tymzj0a-yXM3gQAgwPfvAl2WbatDuJe3nLyCBs7YLkQcJp8vV7JGOMnaTby7a7D6vBWEjnpnPXSuUPk1e85iA0mA0Hw7WBba3WNasG_mLgTwex3z77z4AKmZVNzmFA5ysus03F6j8HwWU3H20G9OI56LLcVQg4XSzxfVuxsvzAM6PqFxF2bvu46d6GV9uSGQdgHrZcsorDBwQCbZgRGeyUyGFmpbnhmtc7PgiSo6B0is-tcQSC2KLgftoyGM_2E8DBGqNAPyKbhaPMRzWTa0vMtwi0B1qoGoklDuMOEaZwStfCnNC24wPs7Np4cULKjt2o7gTXj-fMzhkKJ6GPMG46R5ndfBDM3JOeoj6RY8_RKTXjdyuWoTET8RxXK-vJwplWF-qtMu-2RlTi0cq-OyfSEThOvtOkznt-ql3_t-6PW3d28Xb-6np68_pueXH9-5vp8gLxTiMTD2TyPYNDtM8bIQ0N7owN_CD18O-mtVAcRTS2SO3kKMDfsmo9Zg4uC-295ZiCelzhSP-f5P_yUePw3ziq5fp9R92_kQRUTEjrTjhl9Tqz0NmGWefFRD7Fpd3zIXjmWVdSGMHKvVth8B5oHQjQl1FvGnm75ZkoBM9nhy3tyJzi1dw0tXSBdJ6CTgtcpqqtKDko9HQldbtYolb2IeeRAMArpPJUJYxXYKHk3lahDngN3kdUM3hbnjNp85b3kX82NQMPxcqwyi0kprMdbwmUwlLI-apZe0IWCrx3AXhr8BZvFxez97-B5xxmsZbNnjcZg3e9wN8SKVxhEW10je9SrOwbje0RgrOugjrZUUWgGrNtDCpBN6XpLUubZ0gMnyCIUjpKCVy_eoT57-9Bd5azX3OWbbi2Km8V-obAghkGYQKvxcxS-UziXjbC_SupTd1kVotAgxfAAngvnfGAYP59AYh2QCH1_Wc5vlEsBwyrmqHzYob2R35qXQj_aftP9pDerxltqB5cEn5kLAWWw_6wJgG4Qo9jPSf99Sc7pDY6_3ISt8nl0uWRrzpvmJAwAKn7CzTqLZAwoslTOfZ5r-0zvzrDnwlHwjCk6ZGZ_Sbk-B0mYfwNKjgk929UAUR-OvZ7R8bvmPRVQMfU_z4VPM3858JFhCZ9A0SW2wnzOEj6xeCeQ8YkaI43iA1z1O83XEKjOXRaZ3jFwObOct7yGpucismMQ67uJV43MF9pBVWDadKRZIVNqDVnuZBrdzdhWvNqVT5AphB4zaV1f54jPYEtUyNzB1WoslT3FqcU0oplZXA7eK1Zlbzqy32W-_t9KKZ8rWHZXT4abWn2tHmL9WqJ57EN2rHOdO1r5w6ZkrmwYcqsYTRiqQKzF96BUtfQhbZfxQe6LdftuhpqIS5sA5hYrXX-FMyfNnlPx0kEWkmc9rv6d3p0Z65K5aJ4AGw7zUboLyjqpykj-U8oo_UUWCvJR0M-IXE8jgkNxnSYT2ie0pQNjTAln_RU8IJTO8VqC-bUYWvupyS-i0MYNnU52RizdYU1uMRnLcymWY2wB2kL-qGuo0R_IBdb3LVusBQHl1GSBNFwM0n5ijCaFwELi2BcFDzPSZSnJOQRjVJOhiVb8VJPBhG2EIHk9-BI4HwQLYZiEvhBQIgf-SQKKR0xyuOIJfgR0ZQm2SD0OfZ55cjKMVL1elhPnEjYtWjcLIU2-riJQSPWknPHDunjJWaj6kkhap4bLNJDx3zihP8LxRV5CQ">