Skip to content

Commit b9ce069

Browse files
authored
Merge pull request rust-lang#1721 from Kobzol/codegen-diff-ext
Improve output of codegen diff
2 parents de4dc96 + e79767e commit b9ce069

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

collector/src/bin/collector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,7 @@ fn main_result() -> anyhow::Result<i32> {
732732

733733
let mut benchmark_groups =
734734
get_runtime_benchmark_groups(&runtime_benchmark_dir, Some(group))?;
735-
let group = benchmark_groups.pop().unwrap();
735+
let group = benchmark_groups.pop().expect("Benchmark group not found");
736736
assert!(benchmark_groups.is_empty());
737737

738738
codegen_diff(codegen_type, toolchain1, toolchain2, group)?;

collector/src/codegen.rs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::collections::HashMap;
2-
use std::io::IsTerminal;
2+
use std::io::{IsTerminal, Write};
33
use std::path::Path;
44
use std::process::Command;
55

@@ -58,8 +58,9 @@ pub fn codegen_diff(
5858
.context("Cannot generate codegen using compiler 1")?;
5959
let codegen2 =
6060
get_codegen(&toolchain2, &group.path, codegen_type, *toolchain2_index)
61-
.context("Cannot generate codegen using compiler 1")?;
61+
.context("Cannot generate codegen using compiler 2")?;
6262
if codegen1.trim() != codegen2.trim() {
63+
log::debug!("Analysed function {}", function.name);
6364
return Ok(Some(CodegenDiff::new(function, codegen1, codegen2)));
6465
}
6566
}
@@ -98,6 +99,7 @@ pub fn codegen_diff(
9899

99100
let mut output = std::io::stdout().lock();
100101
let use_color = output.is_terminal();
102+
write_stats(&mut output, &diffs).context("Cannot write stats")?;
101103
for diff in diffs {
102104
write_diff(&mut output, use_color, &diff).context("Cannot write diff")?;
103105
}
@@ -157,11 +159,30 @@ impl<'a> CodegenDiff<'a> {
157159
}
158160
}
159161

160-
fn write_diff<W: std::io::Write>(
161-
writer: &mut W,
162-
use_color: bool,
163-
diff: &CodegenDiff,
164-
) -> anyhow::Result<()> {
162+
fn write_stats<W: Write>(writer: &mut W, diffs: &[CodegenDiff]) -> anyhow::Result<()> {
163+
writeln!(writer, "Function size stats:")?;
164+
for diff in diffs {
165+
let size_before = diff.codegen1.len();
166+
let size_after = diff.codegen2.len();
167+
if size_before == size_after {
168+
continue;
169+
}
170+
let percent = (size_after as f64 / size_before as f64) - 1.0;
171+
let percent = percent * 100.0;
172+
writeln!(
173+
writer,
174+
"{}: {size_before} -> {size_after} ({}{:.2}%)",
175+
diff.function.name,
176+
if percent.is_sign_positive() { "+" } else { "-" },
177+
percent.abs()
178+
)?;
179+
}
180+
writer.write_all(b"\n")?;
181+
182+
Ok(())
183+
}
184+
185+
fn write_diff<W: Write>(writer: &mut W, use_color: bool, diff: &CodegenDiff) -> anyhow::Result<()> {
165186
use console::Style;
166187

167188
let text_diff = TextDiff::from_lines(&diff.codegen1, &diff.codegen2);

0 commit comments

Comments
 (0)