Skip to content

Commit

Permalink
Don't print block exit state if unchanged
Browse files Browse the repository at this point in the history
  • Loading branch information
ecstatic-morse committed Feb 14, 2020
1 parent 2ed25f0 commit 5c473a0
Showing 1 changed file with 35 additions and 20 deletions.
55 changes: 35 additions & 20 deletions src/librustc_mir/dataflow/generic/graphviz.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,8 @@ where
// C: Entry state
self.bg = Background::Light;
self.results.seek_to_block_start(block);
let block_entry_state = self.results.get().clone();

self.write_row_with_full_state(w, "", "(on entry)")?;

// D: Statement transfer functions
Expand All @@ -213,29 +215,42 @@ where
self.write_row_for_location(w, "T", &terminator_str, terminator_loc)?;

// F: Exit state

// Write the full dataflow state immediately after the terminator if it differs from the
// state at block entry.
self.results.seek_after(terminator_loc);
if let mir::TerminatorKind::Call { destination: Some(_), .. } = &terminator.kind {
self.write_row_with_full_state(w, "", "(on unwind)")?;

let num_state_columns = self.num_state_columns();
self.write_row(w, "", "(on successful return)", |this, w, fmt| {
write!(
w,
r#"<td balign="left" colspan="{colspan}" {fmt} align="left">"#,
colspan = num_state_columns,
fmt = fmt,
)?;

let state_on_unwind = this.results.get().clone();
this.results.seek_after_assume_call_returns(terminator_loc);
write_diff(w, this.results.analysis(), &state_on_unwind, this.results.get())?;

write!(w, "</td>")
})?;
} else {
self.write_row_with_full_state(w, "", "(on exit)")?;
if self.results.get() != &block_entry_state {
let after_terminator_name = match terminator.kind {
mir::TerminatorKind::Call { destination: Some(_), .. } => "(on unwind)",
_ => "(on exit)",
};

self.write_row_with_full_state(w, "", after_terminator_name)?;
}

// Write any changes caused by terminator-specific effects
match terminator.kind {
mir::TerminatorKind::Call { destination: Some(_), .. } => {
let num_state_columns = self.num_state_columns();
self.write_row(w, "", "(on successful return)", |this, w, fmt| {
write!(
w,
r#"<td balign="left" colspan="{colspan}" {fmt} align="left">"#,
colspan = num_state_columns,
fmt = fmt,
)?;

let state_on_unwind = this.results.get().clone();
this.results.seek_after_assume_call_returns(terminator_loc);
write_diff(w, this.results.analysis(), &state_on_unwind, this.results.get())?;

write!(w, "</td>")
})?;
}

_ => {}
};

write!(w, "</table>")
}

Expand Down

0 comments on commit 5c473a0

Please sign in to comment.