Skip to content

Slow and memory-intensive compilation with debug symbols #141297

Open
@speshuric

Description

@speshuric

Here is code:

// NOTE: this fn is executed 2^N times
fn f00(i: i64) -> i64 {i + i}

// we need to go deeper!
fn f01(i: i64) -> i64 {f00(i) + f00(i)}
fn f02(i: i64) -> i64 {f01(i) + f01(i)}
fn f03(i: i64) -> i64 {f02(i) + f02(i)}
fn f04(i: i64) -> i64 {f03(i) + f03(i)}
fn f05(i: i64) -> i64 {f04(i) + f04(i)}
fn f06(i: i64) -> i64 {f05(i) + f05(i)}
fn f07(i: i64) -> i64 {f06(i) + f06(i)}
fn f08(i: i64) -> i64 {f07(i) + f07(i)}
fn f09(i: i64) -> i64 {f08(i) + f08(i)}
fn f10(i: i64) -> i64 {f09(i) + f09(i)}

// deeper
fn f11(i: i64) -> i64 {f10(i) + f10(i)}
fn f12(i: i64) -> i64 {f11(i) + f11(i)}
fn f13(i: i64) -> i64 {f12(i) + f12(i)}
fn f14(i: i64) -> i64 {f13(i) + f13(i)}
fn f15(i: i64) -> i64 {f14(i) + f14(i)}
fn f16(i: i64) -> i64 {f15(i) + f15(i)}
fn f17(i: i64) -> i64 {f16(i) + f16(i)}
fn f18(i: i64) -> i64 {f17(i) + f17(i)}
fn f19(i: i64) -> i64 {f18(i) + f18(i)}
fn f20(i: i64) -> i64 {f19(i) + f19(i)}

// ... and deeper
/*fn f21(i: i64) -> i64 {f20(i) + f20(i)}
fn f22(i: i64) -> i64 {f21(i) + f21(i)}
fn f23(i: i64) -> i64 {f22(i) + f22(i)}
fn f24(i: i64) -> i64 {f23(i) + f23(i)}
fn f25(i: i64) -> i64 {f24(i) + f24(i)}
fn f26(i: i64) -> i64 {f25(i) + f25(i)}
fn f27(i: i64) -> i64 {f26(i) + f26(i)}
fn f28(i: i64) -> i64 {f27(i) + f27(i)}
fn f29(i: i64) -> i64 {f28(i) + f28(i)}
fn f30(i: i64) -> i64 {f29(i) + f29(i)}

// ... and deeper
fn f31(i: i64) -> i64 {f30(i) + f30(i)}
fn f32(i: i64) -> i64 {f31(i) + f31(i)}
fn f33(i: i64) -> i64 {f32(i) + f32(i)}
fn f34(i: i64) -> i64 {f33(i) + f33(i)}
fn f35(i: i64) -> i64 {f34(i) + f34(i)}
fn f36(i: i64) -> i64 {f35(i) + f35(i)}
fn f37(i: i64) -> i64 {f36(i) + f36(i)}
fn f38(i: i64) -> i64 {f37(i) + f37(i)}
fn f39(i: i64) -> i64 {f38(i) + f38(i)}
fn f40(i: i64) -> i64 {f39(i) + f39(i)}

// ... and deeper
fn f41(i: i64) -> i64 {f40(i) + f40(i)}
fn f42(i: i64) -> i64 {f41(i) + f41(i)}
fn f43(i: i64) -> i64 {f42(i) + f42(i)}
fn f44(i: i64) -> i64 {f43(i) + f43(i)}
fn f45(i: i64) -> i64 {f44(i) + f44(i)}
fn f46(i: i64) -> i64 {f45(i) + f45(i)}
fn f47(i: i64) -> i64 {f46(i) + f46(i)}
fn f48(i: i64) -> i64 {f47(i) + f47(i)}
fn f49(i: i64) -> i64 {f48(i) + f48(i)}
fn f50(i: i64) -> i64 {f49(i) + f49(i)}*/

fn main() {
    let mut i:i64 = 0;
    i = f20(i); // point here the last fNN
    println!("{i}");
}

Change commented area and see how the code is compiled with different opt-level and debuginfo:

rustc -C opt-level=...l -C debuginfo=... ./c20.rs

Expected: code compilation time does not exceed something about 10 s and memory usage does not exceed 1 GiB

Actual:

debuginfo: 0 0 0 0 1 1 1 1 2 2 2 2
opt-level: 0 1 2 3 0 1 2 3 0 1 2 3
c10.rs 0.00 0.09 0.09 0.09 0.09 0.09 0.09 0.10 0.09 0.09 0.22 0.22
c15.rs 0.09 0.09 0.10 0.10 0.09 0.09 0.15 0.14 0.09 0.09 127.23 124.11
c20.rs 0.09 0.09 0.37 0.40 0.09 0.09 1.65 1.63 0.09 0.09 >10000 >10000
c30.rs 0.09 0.10 5.88 5.80 0.09 0.09 31.11 31.77 0.09 0.09 -- --
c40.rs 0.09 0.09 5.79 5.58 0.09 0.09 30.55 31.43 0.09 0.09 -- --
c50.rs 0.09 0.09 5.67 6.14 0.09 0.09 30.83 31.30 0.09 0.09 -- --

And memory usage is high with debuginfo=2.
cNN.rs is file with fNN the last function uncommented and invoked.

Meta

rustc --version --verbose:

rustc 1.88.0-nightly (b8c54d635 2025-04-20)
binary: rustc
commit-hash: b8c54d6358926028ac2fab1ec2b8665c70edb1c0
commit-date: 2025-04-20
host: x86_64-unknown-linux-gnu
release: 1.88.0-nightly
LLVM version: 20.1.2

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.I-slowIssue: Problems and improvements with respect to performance of generated code.needs-triageThis issue may need triage. Remove it if it has been sufficiently triaged.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions