Skip to content

Exponential compile time after update to LLVM 22 #152713

@Barfussmann

Description

@Barfussmann

Code

I tried this code:

fn main() {
    for _ in 0..1 {
        for _ in 0..1 {
            SolveDirect::<SIZE>::solve_direct(&(), 0);
        }
    }
}

trait SolveDirect<const N: usize> {
    fn solve_direct(&self, total_sum: u32);
}

macro_rules! impl_solve_direct {
    ($size:literal) => {
        impl SolveDirect<$size> for () {
            fn solve_direct(&self, total_sum: u32) {
                SolveDirect::<{ $size - 1 }>::solve_direct(self, total_sum);
                let changed_total = std::hint::black_box(total_sum);
                SolveDirect::<{ $size - 1 }>::solve_direct(self, changed_total);
            }
        }
    };
}
impl SolveDirect<1> for () {
    fn solve_direct(&self, total_sum: u32) {
        std::hint::black_box(total_sum);
    }
}

const SIZE: usize = 15;

impl_solve_direct!(2);
impl_solve_direct!(3);
impl_solve_direct!(4);
impl_solve_direct!(5);
impl_solve_direct!(6);
impl_solve_direct!(7);
impl_solve_direct!(8);
impl_solve_direct!(9);
impl_solve_direct!(10);
impl_solve_direct!(11);
impl_solve_direct!(12);
impl_solve_direct!(13);
impl_solve_direct!(14);
impl_solve_direct!(15);

I expected to see this happen:
Code compiles quickly

Instead, this happened:

The code compiles really slowly and produces huge assembly.
The assembly size increases with "recursion" depth like 2^N.
The compile time increases with "recursion" depth like 4^N.
It also should introduce function calls to reduce the assembly size of the main function.

cargo asm --simplify: (same compile time for cargo build --release))

N = 13: 
cargo asm --simplify
    Finished `release` profile [optimized] target(s) in 2.52s
Try one of those by name or a sequence number
0 "<std::rt::lang_start<()>::{closure#0} as core::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}" [20]
1 "main" [18]
2 "qubo_test::main" [53254]
3 "std::rt::lang_start::<()>" [28]
4 "std::rt::lang_start::<()>::{closure#0}" [19]
5 "std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>" [22]

N = 14: 
cargo asm --simplify
    Finished `release` profile [optimized] target(s) in 9.98s
Try one of those by name or a sequence number
0 "<std::rt::lang_start<()>::{closure#0} as core::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}" [20]
1 "main" [18]
2 "qubo_test::main" [106502]
3 "std::rt::lang_start::<()>" [28]
4 "std::rt::lang_start::<()>::{closure#0}" [19]
5 "std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>" [22]

N = 15: 

    Finished `release` profile [optimized] target(s) in 40.06s
Try one of those by name or a sequence number
0 "<std::rt::lang_start<()>::{closure#0} as core::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}" [20]
1 "main" [18]
2 "qubo_test::main" [212999]
3 "std::rt::lang_start::<()>" [28]
4 "std::rt::lang_start::<()>::{closure#0}" [19]
5 "std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>" [22]

On stable:

cargo asm --simplify:

    Compiling qubo_test v0.1.0
    Finished `release` profile [optimized] target(s) in 0.06s
0 "<() as qubo_test::SolveDirect<11_usize>>::solve_direct" [101]
1 "<() as qubo_test::SolveDirect<14_usize>>::solve_direct" [101]
2 "<() as qubo_test::SolveDirect<5_usize>>::solve_direct" [210]
3 "<() as qubo_test::SolveDirect<8_usize>>::solve_direct" [101]
4 "core::ops::function::FnOnce::call_once{{vtable.shim}}" [20]
5 "main" [18]
6 "qubo_test::main" [26]
7 "std::rt::lang_start" [28]
8 "std::rt::lang_start::{{closure}}" [19]
9 "std::sys::backtrace::__rust_begin_short_backtrace" [22]

Version it worked on

Used bisect-rustc to find offending commit.
It's the update to LLVM 22

********************************************************************************
Regression in 466ea4e6c39f8a43727edcc726ca86b499e14d83
********************************************************************************

Attempting to search unrolled perf builds
ERROR: couldn't find perf build comment
==================================================================================
= Please file this regression report on the rust-lang/rust GitHub repository     =
=        New issue: https://github.com/rust-lang/rust/issues/new                 =
=     Known issues: https://github.com/rust-lang/rust/issues                     =
= Copy and paste the text below into the issue report thread.  Thanks!           =
==================================================================================

searched nightlies: from nightly-2025-06-01 to nightly-2026-02-16
regressed nightly: nightly-2026-01-29
searched commit range: https://github.com/rust-lang/rust/compare/e96bb7e44fbcc23c1e6009e8d0ee8ab208668fb4...de6d33c033441c5880b863f94d7a3ec8cad141bd
regressed commit: https://github.com/rust-lang/rust/commit/466ea4e6c39f8a43727edcc726ca86b499e14d83

<details>
<summary>bisected with <a href='https://github.com/rust-lang/cargo-bisect-rustc'>cargo-bisect-rustc</a> v0.6.11</summary>


Host triple: x86_64-unknown-linux-gnu
Reproduce with:
```bash
cargo bisect-rustc --start=2025-06-01 --end=2026-2-16 --timeout 1 -- build --release
```

-->

Version with regression

rustc --version --verbose:

rustc 1.95.0-nightly (873b4beb0 2026-02-15)
binary: rustc
commit-hash: 873b4beb0cc726493b94c8ef21f68795c04fbbc1
commit-date: 2026-02-15
host: x86_64-unknown-linux-gnu
release: 1.95.0-nightly
LLVM version: 22.1.0

@rustbot modify labels: +regression-from-stable-to-nightly -regression-untriaged

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.C-bugCategory: This is a bug.P-mediumMedium priorityneeds-triageThis issue may need triage. Remove it if it has been sufficiently triaged.regression-from-stable-to-nightlyPerformance or correctness regression from stable to nightly.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions