Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Preliminary work for incremental ThinLTO. #52266

Merged
merged 7 commits into from Jul 14, 2018

Conversation

michaelwoerister
Copy link
Member

Since implementing incremental ThinLTO is a bit more involved than I initially thought, I'm splitting out some of the things that already work. This PR (1) adds a way accessing some ThinLTO information in rustc and (2) does some cleanup around CGU/object file naming (which makes things quite a bit nicer).

This is probably best reviewed one commit at a time.

@rust-highfive
Copy link
Collaborator

r? @pnkfelix

(rust_highfive has picked a reviewer for you, use r? to override)

@rust-highfive rust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Jul 11, 2018
@rust-highfive

This comment has been minimized.

@michaelwoerister
Copy link
Member Author

Looks like something went wrong during rebasing...

@rust-highfive

This comment has been minimized.

@rust-highfive

This comment has been minimized.

@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-llvm-5.0 of your PR failed on Travis (raw log). Through arcane magic we have determined that the following fragments from the build log may contain information about the problem.

Click to expand the log.
travis_time:start:test_run-make-fulldeps
Check compiletest suite=run-make-fulldeps mode=run-make (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
[01:17:07] 
[01:17:07] running 187 tests
[01:17:37] ....................F........................F......................................................
[01:18:30] ......................................................................................test [run-make] run-make-fulldeps/long-linker-command-lines has been running for over 60 seconds
 'staticlib' failed
[01:19:12] make[1]: Leaving directory '/checkout/src/test/run-make-fulldeps/cross-lang-lto'
[01:19:12] ------------------------------------------
[01:19:12] stderr:
[01:19:12] ------------------------------------------
[01:19:12] ------------------------------------------
[01:19:12] warning: ignoring --out-dir flag due to -o flag
[01:19:12] 
[01:19:12] ReportError reading '/checkout/obj/build/x86_64-unknown-linux-gnu/test/run-make-fulldeps/cross-lang-lto/cross-lang-lto/liblib.lib0.rcgu.o': No such file or directory
[01:19:12] make[1]: *** [staticlib] Error 1
[01:19:12] ------------------------------------------
[01:19:12] 
[01:19:12] 
[01:19:12] thread '[run-make] run-make-fulldeps/cross-lang-lto' panicked at 'explicit panic', tools/compiletest/src/runtest.rs:3163:9
[01:19:12] 
[01:19:12] ---- [run-make] run-make-fulldeps/extra-filename-with-temp-outputs stdout ----
[01:19:12] 
[01:19:12] error: make failed
[01:19:12] error: make failed
[01:19:12] status: exit code: 2
[01:19:12] command: "make"
[01:19:12] stdout:
[01:19:12] ------------------------------------------
[01:19:12] make[1]: Entering directory '/checkout/src/test/run-make-fulldeps/extra-filename-with-temp-outputs'
[01:19:12] LD_LIBRARY_PATH="/checkout/obj/build/x86_64-unknown-linux-gnu/test/run-make-fulldeps/extra-filename-with-temp-outputs/extra-filename-with-temp-outputs:/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib:/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-bootstrap-tools/x86_64-unknown-linux-gnu/release/deps:/checkout/obj/build/x86_64-unknown-linux-gnu/stage0/lib:" '/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/bin/rustc' --out-dir /checkout/obj/build/x86_64-unknown-linux-gnu/test/run-make-fulldeps/extra-filename-with-temp-outputs/extra-filename-with-temp-outputs -L /checkout/obj/build/x86_64-unknown-linux-gnu/test/run-make-fulldeps/extra-filename-with-temp-outputs/extra-filename-with-temp-outputs  -C extra-filename=bar foo.rs -C save-temps
[01:19:12] rm /checkout/obj/build/x86_64-unknown-linux-gnu/test/run-make-fulldeps/extra-filename-with-temp-outputs/extra-filename-with-temp-outputs/foobar.foo0.rcgu.o
[01:19:12] Makefile:4: recipe for target 'all' failed
[01:19:12] make[1]: Leaving directory '/checkout/src/test/run-make-fulldeps/extra-filename-with-temp-outputs'
[01:19:12] ------------------------------------------
[01:19:12] stderr:
[01:19:12] ------------------------------------------
[01:19:12] warning: `-C save-temps` might not produce all requested temporary products when incremental compilation is enabled.
[01:19:12] warning: `-C save-temps` might not produce all requested temporary products when incremental compilation is enabled.
[01:19:12] 
[01:19:12] rm: cannot remove '/checkout/obj/build/x86_64-unknown-linux-gnu/test/run-make-fulldeps/extra-filename-with-temp-outputs/extra-filename-with-temp-outputs/foobar.foo0.rcgu.o': No such file or directory
[01:19:12] make[1]: *** [all] Error 1
[01:19:12] ------------------------------------------
[01:19:12] 
[01:19:12] thread '[run-make] run-make-fulldeps/extra-filename-with-temp-outputs' panicked at 'explicit panic', tools/compiletest/src/runtest.rs:3163:9
[01:19:12] 
---
[01:19:12] test result: FAILED. 185 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out
[01:19:12] 
[01:19:12] 
[01:19:12] 
[01:19:12] command did not execute successfully: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-tools-bin/compiletest" "--compile-lib-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib" "--run-lib-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-unknown-linux-gnu/lib" "--rustc-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/bin/rustc" "--rustdoc-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/bin/rustdoc" "--src-base" "/checkout/src/test/run-make-fulldeps" "--build-base" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/run-make-fulldeps" "--stage-id" "stage2-x86_64-unknown-linux-gnu" "--mode" "run-make" "--target" "x86_64-unknown-linux-gnu" "--host" "x86_64-unknown-linux-gnu" "--llvm-filecheck" "/usr/lib/llvm-5.0/bin/FileCheck" "--host-rustcflags" "-Crpath -O -Zunstable-options " "--target-rustcflags" "-Crpath -O -Zunstable-options  -Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--docck-python" "/usr/bin/python2.7" "--lldb-python" "/usr/bin/python2.7" "--gdb" "/usr/bin/gdb" "--quiet" "--llvm-version" "5.0.0\n" "--system-llvm" "--cc" "cc" "--cxx" "c++" "--cflags" "-ffunction-sections -fdata-sections -fPIC -m64" "--llvm-components" "aarch64 aarch64asmparser aarch64asmprinter aarch64codegen aarch64desc aarch64disassembler aarch64info aarch64utils all all-targets amdgpu amdgpuasmparser amdgpuasmprinter amdgpucodegen amdgpudesc amdgpudisassembler amdgpuinfo amdgpuutils analysis arm armasmparser armasmprinter armcodegen armdesc armdisassembler arminfo asmparser asmprinter binaryformat bitreader bitwriter bpf bpfasmprinter bpfcodegen bpfdesc bpfdisassembler bpfinfo codegen core coroutines coverage debuginfocodeview debuginfodwarf debuginfomsf debuginfopdb demangle dlltooldriver engine executionengine globalisel hexagon hexagonasmparser hexagoncodegen hexagondesc hexagondisassembler hexagoninfo instcombine instrumentation interpreter ipo irreader lanai lanaiasmparser lanaiasmprinter lanaicodegen lanaidesc lanaidisassembler lanaiinfo libdriver lineeditor linker lto mc mcdisassembler mcjit mcparser mips mipsasmparser mipsasmprinter mipscodegen mipsdesc mipsdisassembler mipsinfo mirparser msp430 msp430asmprinter msp430codegen msp430desc msp430info native nativecodegen nvptx nvptxasmprinter nvptxcodegen nvptxdesc nvptxinfo objcarcopts object objectyaml option orcjit passes powerpc powerpcasmparser powerpcasmprinter powerpccodegen powerpcdesc powerpcdisassembler powerpcinfo profiledata runtimedyld scalaropts selectiondag sparc sparcasmparser sparcasmprinter sparccodegen sparcdesc sparcdisassembler sparcinfo support symbolize systemz systemzasmparser systemzasmprinter systemzcodegen systemzdesc systemzdisassembler systemzinfo tablegen target transformutils vectorize x86 x86asmparser x86asmprinter x86codegen x86desc x86disassembler x86info x86utils xcore xcoreasmprinter xcorecodegen xcoredesc xcoredisassembler xcoreinfo" "--llvm-cxxflags" "-I/usr/lib/llvm-5.0/include -std=c++0x -fuse-ld=gold -Wl,--no-keep-files-mapped -Wl,--no-map-whole-files -fPIC -fvisibility-inlines-hidden -Werror=date-time -std=c++11 -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -ffunction-sections -fdata-sections -O2 -DNDEBUG -g1  -fno-exceptions -DLLVM_BUILD_GLOBAL_ISEL -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS" "--ar" "ar" "--adb-path" "adb" "--adb-test-dir" "/data/tmp/work" "--android-cross-path" "" "--color" "always"
[01:19:12] 
[01:19:12] 
[01:19:12] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
[01:19:12] Build completed unsuccessfully in 0:33:30
[01:19:12] Build completed unsuccessfully in 0:33:30
[01:19:12] Makefile:58: recipe for target 'check' failed
[01:19:12] make: *** [check] Error 1

The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:2d25a078
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)

I'm a bot! I can only do what humans tell me to, so if this was not helpful or you have suggestions for improvements, please ping or otherwise contact @TimNN. (Feature Requests)

@michaelwoerister
Copy link
Member Author

r? @alexcrichton might be the best reviewer for this.

/// entry is a pointer that points to a null-termined array of module names. The
/// first entry is always the name of the *importing* module, the following
/// entries are the names of the modules it imports from. Each module name is
/// a regular C string.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe say "regular malloc'ed C string" or something along those lines, just so someone doesn't have to scan the code for those calls to strndup ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also note: In the current version, the allocations here are just leaked. I should probably fix that.

Copy link
Member

@alexcrichton alexcrichton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall looks great! I can definitely see how this cgu naming cleanup feels good :)

}
}

pub fn save_to_file(&self, path: &Path) -> io::Result<()> {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This + load_to_file may be a "job for serde" if we slap a #[derive] on there, although I guess both Serde doesn't work as well as rustc-serialize not being hooked up easily to things like JSON? In that case this is probably fine-enough for now.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there's still a JSON serializer in rustc-serialize but I don't really trust it. Serde would be great.


impl ThinLTOImports {

pub fn new_empty() -> ThinLTOImports {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stylistically this could also be named new like HashMap::new()

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wanted to be as explicit as possible. But I don't mind changing it to just new().

/// Load the ThinLTO import map from ThinLTOData.
unsafe fn from_thin_lto_data(data: *const llvm::ThinLTOData) -> ThinLTOImports {
let raw_data: *const llvm::ThinLTOModuleImports =
llvm::LLVMRustGetThinLTOModuleImports(data);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This feels sort of overly nasty in terms of converting a type from C++ to Rust, but then again I'm not sure of a better way to do this! In any case I do agree though that we'll want to free the raw_data here at the end of this function (probably via a dtor or something like that)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I don't like it either :) Suggestions on how to make this nicer are welcome.

I thought I could keep the complex data structure on the C++ and provide a C interface but that quickly seemed like a lot of infrastructure for just passing a map around.

I'll just implement a free function for the data structure. Or I could make it callback based... that would make it a bit less nasty, memory-management-wise.

@michaelwoerister
Copy link
Member Author

I've updated the code loading the ThinLTO import data into rustc. Should be much nicer now.

@alexcrichton
Copy link
Member

@bors: r+

Nice!

I had originally thought to comment that a callback and/or more structured piece of data could work here, although I thought we also run the risk of these symbol lists being huge so the FFI traffic could be a bit of a perf hit. In any case let's see how it turns out and optimize if necessary

@bors
Copy link
Contributor

bors commented Jul 13, 2018

📌 Commit e045a6c has been approved by alexcrichton

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 13, 2018
@bors
Copy link
Contributor

bors commented Jul 13, 2018

⌛ Testing commit e045a6c with merge a14a361...

bors added a commit that referenced this pull request Jul 13, 2018
…=alexcrichton

Preliminary work for incremental ThinLTO.

Since implementing incremental ThinLTO is a bit more involved than I initially thought, I'm splitting out some of the things that already work. This PR (1) adds a way accessing some ThinLTO information in `rustc` and (2) does some cleanup around CGU/object file naming (which makes things quite a bit nicer).

This is probably best reviewed one commit at a time.
@bors
Copy link
Contributor

bors commented Jul 14, 2018

☀️ Test successful - status-appveyor, status-travis
Approved by: alexcrichton
Pushing a14a361 to master...

@bors bors merged commit e045a6c into rust-lang:master Jul 14, 2018
@nnethercote
Copy link
Contributor

This is a major perf regression:
https://perf.rust-lang.org/compare.html?start=254f8796b729810846e2b97620032ecaf103db33&end=a14a361c2c80fdcd0270766e0bd57104e608988e&stat=instructions:u

Lots of regressions of up to 5% for incremental compilation. Also a 9.6% regression for an nll-check build of html5ever, which is odd, but also a major problem because it is by far the worst benchmark for NLL -- it's now blown out to ~62x slower than non-NLL(!)

@michaelwoerister: Is this expected? Should this be backed out?

@michaelwoerister
Copy link
Member Author

Interesting. No, that's not expected at all. I'm wondering where it comes from. It should mostly be harmless refactorings and new code that isn't called yet. I won't be available next week to investigate, unfortunately. I'm OK with backing it out in the meantime.

@nnethercote
Copy link
Contributor

Backing out seems best, especially given that you won't be around next week.

What's the usual backout procedure for rustc?

@michaelwoerister
Copy link
Member Author

Good question, I never had to back out anything before :)

What do we usually do, @rust-lang/release @rust-lang/compiler @rust-lang/infra?

@pietroalbini
Copy link
Member

You can send a PR reverting this one.

@kennytm
Copy link
Member

kennytm commented Jul 14, 2018

You could just git revert a14a361c2c8 and submit the PR.

module_name_callback(callback_payload,
importing_module_id.c_str(),
imported_module_id.c_str());
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could've also provided an iterator interface, like a bunch other LLVM APIs we support.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you have an example?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Searching for Iterator in src/librustc_llvm and src/rustllvm is enough. One of them is ArchiveIterator:

rust/src/librustc_llvm/ffi.rs

Lines 1687 to 1692 in 7afa0cc

pub fn LLVMRustArchiveIteratorNew(AR: ArchiveRef) -> ArchiveIteratorRef;
pub fn LLVMRustArchiveIteratorNext(AIR: ArchiveIteratorRef) -> ArchiveChildRef;
pub fn LLVMRustArchiveChildName(ACR: ArchiveChildRef, size: *mut size_t) -> *const c_char;
pub fn LLVMRustArchiveChildData(ACR: ArchiveChildRef, size: *mut size_t) -> *const c_char;
pub fn LLVMRustArchiveChildFree(ACR: ArchiveChildRef);
pub fn LLVMRustArchiveIteratorFree(AIR: ArchiveIteratorRef);

} else {
Symbol::intern(&CodegenUnit::mangle_name(FALLBACK_CODEGEN_UNIT)).as_interned_str()
}
CodegenUnit::build_cgu_name(tcx, LOCAL_CRATE, &["fallback"], Some("cgu"))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may now do a bit more work than before. Ideally it would be cached (although I doubt this is the cause of the regression).

@eddyb
Copy link
Member

eddyb commented Jul 14, 2018

The regression here is really weird. For anyone willing to investigate, I'd suggest doing a perf with only f6894eb backed out - it's possible there may be a strange interaction with LLVM, not sure yet.

@michaelwoerister
Copy link
Member Author

OK, I found some time to run the regex-debug / clean incremental case through callgrind before and after the patch and it looks like CrateDisambiguator::display() is the culprit. Callgrind says it accounts for 3% of all instructions and the slowdown of that test case is 3%.

In light of that I don't think reverting the whole PR is necessary. It should not be too hard to just optimize CodegenUnit name generation more.

@nnethercote
Copy link
Contributor

@michaelwoerister: I have a suggestion: back this PR out, do your investigation and improvements, and then re-land the adjusted patches in a new PR.

This will give a much clearer picture of the overall performance impact -- we won't have to manually compare regressions from one commit and improvements from a later commit, with a bunch of unrelated commits in between. It also means that the repo won't be in this performance-degraded state while you are investigating -- which complicates performance analysis that other people are doing -- and you'll feel less rushed about landing a fix. You'll also be able to do perf runs on the full patch stack.

I understand that it's something of a hassle, and will cause you more work. But getting serious about compiler performance requires getting stricter about performance regressions. A willingness to backout problematic code is how we do things in the Firefox repo, and I think it makes sense here.

What do you think?

@michaelwoerister michaelwoerister mentioned this pull request Jul 16, 2018
@michaelwoerister
Copy link
Member Author

@nnethercote I've opened #52422. As I said, I don't have a problem with backing it out. Being able to take more time with a fix is a good thing.

It also means that the repo won't be in this performance-degraded state while you are investigating -- which complicates performance analysis that other people are doing

I don't quite follow the argument here. You always have to pick some stable baseline you're comparing a change against. Whether that baseline includes this PR or not shouldn't really make a difference, right? (unless you are doing something that specifically touches the same code)

bors added a commit that referenced this pull request Jul 16, 2018
Revert #52266

Reverts #52266 until the performance issues with that PR are ironed out.
@nnethercote
Copy link
Contributor

It won't bother most people. But I track performance over time locally, as a kind of sanity check against perf.rust-lang.org, and regressions interfere with that. (E.g. I deliberately waited until this was backed out before doing this week's run.)

In case you're curious, here's what the table currently looks like. These are instruction counts, in billions, measured by Cachegrind, for Clean Debug builds.

             Kind[*] Apr?? May01 May06 May21 May27 Jun04 Jun05 Jun18 Jun25 Jul02 Jul09 Jul18
- cargo            r   ---   ---   ---   --- 191.3 197.3 190.5 190.3 189.9 187.3 187.3 187.1
- clap-rs          r  91.2  87.5  83.9  81.4  81.6  84.6  80.4  78.9  78.0  78.0  78.8  78.3
- coercions        s   9.5   8.1   7.5   7.4   7.4   7.7   7.3   7.4   7.1   6.8   6.7   6.7
- crates.io [ms]   r 138.8 137.7 133.5   --- 132.5 135.9 129.1 129.5 129.5 125.7 125.5 125.1
- deeply-nested    s   0.9   0.9   0.8   0.8   0.8   0.8   0.8   0.8   0.8   0.8   0.8   0.8
- deep-vector      s  13.4  13.4  12.4  12.1  12.3  13.3  12.4  12.5  11.9  11.6  11.5  11.2
- encoding        rs  10.4   9.6   9.0   9.1   9.2   9.5   9.1   9.1   9.0   8.9   8.8   8.8
- futures          r   5.5   5.4   4.8   4.6   4.8   5.0   4.8   4.9   4.9   4.9   5.0   5.0
- helloworld       t   0.3   0.3   0.3   0.3   0.3   0.3   0.3   0.3   0.3   0.3   0.3   0.3
- html5ever        r  19.0  17.1  16.2  15.4  15.7  16.9  15.9  16.0  15.7  15.3  14.0  14.0
- hyper            r  19.6  19.2  18.2  17.9  18.0  18.8  18.1  18.1  18.0  18.0   ---   ---
- inflate          r  23.2  23.2  21.9  20.9  21.0  21.7  21.3  19.9  19.8  19.4  18.9  18.9
- issue-46449      s   1.0   1.0   1.0   0.9   0.9   0.9   0.9   0.9   0.9   0.9   0.9   0.9
- piston-image     r  40.8  40.4  39.1  38.6  38.8  39.9  38.0   ---  38.1  37.7  37.9  37.7
- regex            r  27.3  26.3  25.4  25.1  25.1  25.8  25.4  25.5  25.4  25.3  25.5  25.5
- regression-31157 s   8.3   8.3   8.1   7.9   7.9   8.2   8.0   8.0   8.0   8.0   8.1   8.0
- ripgrep          r   ---   ---   ---   ---  19.2  19.7  18.9  19.0  19.0  18.7  18.8  18.8
- script-servo     r 882.2   ---   --- 831.3   ---   ---   ---   ---   ---   ---   ---   ---
- sentry-cli       r   ---   ---   ---   ---  62.3  64.1  60.5  60.5  60.4  59.2  59.1  59.0
- serde            r  38.5  36.9  34.1  32.3  33.0  35.1  33.0  33.3  33.3  31.5  30.7  30.8
- style-servo [ms] r 360.9 357.6 338.0 328.8 332.1 346.3 330.0 325.9 324.3 321.8 320.5 319.5
- syn              r  14.7  14.6  14.0  13.7  13.9  14.4  13.8  13.7  13.7  13.5  13.5  13.3
- tokio-webpush-s  r  16.7  16.4  15.9  15.6  15.8  16.2  15.4   ---   ---  15.3  15.3  15.2
- tuple-stress     s  27.4  23.8  22.7  22.6  22.8  25.8  23.2  23.5  22.0  20.4  20.1  20.2
- unify-linearly   s   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5
- unused-warnings  s   2.0   1.9   1.7   1.7   1.7   1.9   1.8   1.8   1.8   1.8   1.8   1.9
- webrender        r   ---   ---   ---   --- 107.8 111.2 107.4 107.7 107.3 106.4 106.8 106.5
[*] r=real, s=stress, t=toy

@eddyb
Copy link
Member

eddyb commented Jul 19, 2018

@nnethercote FWIW both clap-rs and inflate are old stress-test versions of real-world crates.

bors added a commit that referenced this pull request Aug 14, 2018
Preliminary work for incremental ThinLTO (CGU name edition)

Bring back the first half of #52266 but hopefully without the performance regression.
bors added a commit that referenced this pull request Aug 17, 2018
Preliminary work for incremental ThinLTO (CGU name edition)

Bring back the first half of #52266 but hopefully without the performance regression.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

9 participants