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

    <tr>
        <th>Summary</th>
        <td>
            [consteval] The mixed use of 'consteval' and 'constexpr' takes longer time to compile
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            c++20,
            consteval
      </td>
    </tr>

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

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

<pre>
    The reproducer:

```
// Fib.cpp
namespace Fibonacci
{
        constexpr unsigned long Recursive(unsigned long n)
        {
                if (n == 0)
                        return 0;
                if (n == 1)
                        return 1;
                return Recursive(n - 2) + Recursive(n - 1);
        }

        template<unsigned long N>
        struct Number{};

        struct DefaultStrategy
        {
                constexpr unsigned long operator()(unsigned long n, auto... other) const
                {
                        return (n + ... + other);
                }
        };

        template<unsigned long N, typename Strategy = DefaultStrategy>
        constexpr unsigned long Cache = Compute(Number<N>{}, Strategy{});
}

namespace Fibonacci
{
        constexpr unsigned long Compute(Number<30ul>, auto strategy)
        {
                return strategy(Recursive(30ul));
        }

        template constexpr unsigned long Cache<30ul>;
}
```

Let's run:

```
time clang++ -std=c++20 -fconstexpr-steps=4294967295 -c  Fib.cpp
```

in my computer it shows:

```
real    0m8.070s
user    0m7.968s
sys     0m0.011s
```

But if I change `Recursive` into consteval, the result will be:

```
$time clang++ -std=c++20 -fconstexpr-steps=4294967295 -c Fib.cpp

real    0m16.145s
user    0m15.948s
sys     0m0.012s
```

it shows now it takes double times to compile the source.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyslUuPgzYQxz-NcxkFGfM-cGhCI1Wq9tD20KtjJsEtYOrH7ubbV3ZesJuklVoJgRg8w39-fz-4MfI4ItYk25CsWXFnO6Xrbef4-Jf83VWrvWpP9W8dgsZJq9YJ1CT5gdCG0Os9p5fr_Mp2hO1gJ_eRmKZzbOQDmokL9GE1ciHkZXCxuZaqhBqNxc9JgxuDqhZ6NR7hFxROG_mOhJXLLyNh1S19XorQSh6AsHIEkjQkaYAuhoZLo3V6BEqSV4nx08T4S-IlPJc7whoYYRUQtvn2IVSelyiaBVZaWRymnlskyXbZ-BtJfryNMlY7YeHNDXvUnkLRzMouBzV44K63v1rNLR5Pz-A9s0JNqLlVmrDSi3_gxxa4syqKIlC2Q-17D8UWCJc_u6M7c2cb8Pn-ea3xhfSMVPWw2xfg2BbsaUI_I-GKwXv9Dc2M8DMcWy46DMlbNUzOemcvNiTb4NHZDba9_eoambW0tP0_LZUHMhLqeq_k4gyYq5DnS-fixn1kOZ-6oaA3_19OXnhJb6bwO5AvG0u4_4yWsMKAduPrfcjKAUH0fDwStvGTaW1sS5JGnF8ZhfXhJm1tLE6GJE3KqrTKC1ZlsBaw3MUe6pEjDCcQZ_AapAXTqQ_zWptG3hNa0aGMaEHNOegM6hAsoiovL0FzMiFGIxrH5oWOjbMgD_ATiI6PRwSS07trOQU5WnWx4p33YRmETd243sKH7HvY4z9t7On_wXSJdIkjzqM4zb7yiLOoSh8BYa-AXJ2AUX14Wyz_Ew20yu17BN-IgUBkmKQPdAhGOS0wOqev2jppq6TiK6zjvMxoUcYpW3V1XIpDkRV5IYQQed4e2kOOLavyPI6TOOcrWTPKEpqxnGZxlrJoL4Qo0zSNy5QxFAVJKQ5c9lHfvw-R0seVNMZhnbMqLVY932NvwoHM2A0sYYywrY_cLWT-xNa1r7Leu6MhKe2lseZe10rbh7P9npU14E_zQX5iC84gKH_eFbOyBfCxvcc-J-1jZ3x-4aIO-Gb0Vk73dWftFKZ9OP-P0nZuHwk1ELbzei6P9aTVHygsYbvQtCFsF_r-OwAA___QSnQE">