summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_mir_dataflow/src/framework/graphviz.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_mir_dataflow/src/framework/graphviz.rs')
-rw-r--r--compiler/rustc_mir_dataflow/src/framework/graphviz.rs28
1 files changed, 18 insertions, 10 deletions
diff --git a/compiler/rustc_mir_dataflow/src/framework/graphviz.rs b/compiler/rustc_mir_dataflow/src/framework/graphviz.rs
index 96c42894b..707729f8f 100644
--- a/compiler/rustc_mir_dataflow/src/framework/graphviz.rs
+++ b/compiler/rustc_mir_dataflow/src/framework/graphviz.rs
@@ -6,6 +6,7 @@ use std::{io, ops, str};
use regex::Regex;
use rustc_graphviz as dot;
+use rustc_index::bit_set::BitSet;
use rustc_middle::mir::graphviz_safe_def_name;
use rustc_middle::mir::{self, BasicBlock, Body, Location};
@@ -34,6 +35,7 @@ where
body: &'a Body<'tcx>,
results: &'a Results<'tcx, A>,
style: OutputStyle,
+ reachable: BitSet<BasicBlock>,
}
impl<'a, 'tcx, A> Formatter<'a, 'tcx, A>
@@ -41,7 +43,8 @@ where
A: Analysis<'tcx>,
{
pub fn new(body: &'a Body<'tcx>, results: &'a Results<'tcx, A>, style: OutputStyle) -> Self {
- Formatter { body, results, style }
+ let reachable = mir::traversal::reachable_as_bitset(body);
+ Formatter { body, results, style, reachable }
}
}
@@ -108,7 +111,12 @@ where
type Edge = CfgEdge;
fn nodes(&self) -> dot::Nodes<'_, Self::Node> {
- self.body.basic_blocks.indices().collect::<Vec<_>>().into()
+ self.body
+ .basic_blocks
+ .indices()
+ .filter(|&idx| self.reachable.contains(idx))
+ .collect::<Vec<_>>()
+ .into()
}
fn edges(&self) -> dot::Edges<'_, Self::Edge> {
@@ -386,8 +394,8 @@ where
) -> io::Result<()> {
let diffs = StateDiffCollector::run(body, block, self.results.results(), self.style);
- let mut befores = diffs.before.map(|v| v.into_iter());
- let mut afters = diffs.after.into_iter();
+ let mut diffs_before = diffs.before.map(|v| v.into_iter());
+ let mut diffs_after = diffs.after.into_iter();
let next_in_dataflow_order = |it: &mut std::vec::IntoIter<_>| {
if A::Direction::IS_FORWARD { it.next().unwrap() } else { it.next_back().unwrap() }
@@ -397,8 +405,8 @@ where
let statement_str = format!("{statement:?}");
let index_str = format!("{i}");
- let after = next_in_dataflow_order(&mut afters);
- let before = befores.as_mut().map(next_in_dataflow_order);
+ let after = next_in_dataflow_order(&mut diffs_after);
+ let before = diffs_before.as_mut().map(next_in_dataflow_order);
self.write_row(w, &index_str, &statement_str, |_this, w, fmt| {
if let Some(before) = before {
@@ -409,11 +417,11 @@ where
})?;
}
- let after = next_in_dataflow_order(&mut afters);
- let before = befores.as_mut().map(next_in_dataflow_order);
+ let after = next_in_dataflow_order(&mut diffs_after);
+ let before = diffs_before.as_mut().map(next_in_dataflow_order);
- assert!(afters.is_empty());
- assert!(befores.as_ref().map_or(true, ExactSizeIterator::is_empty));
+ assert!(diffs_after.is_empty());
+ assert!(diffs_before.as_ref().map_or(true, ExactSizeIterator::is_empty));
let terminator = body[block].terminator();
let mut terminator_str = String::new();