Do not recompute liveness for DestinationPropagation.
This commit is contained in:
parent
c4b1054525
commit
da235ce92d
2 changed files with 102 additions and 45 deletions
|
@ -1,6 +1,9 @@
|
|||
use crate::framework::{visit_results, ResultsVisitable, ResultsVisitor};
|
||||
use rustc_index::bit_set::ChunkedBitSet;
|
||||
use rustc_index::interval::SparseIntervalMatrix;
|
||||
use rustc_index::Idx;
|
||||
use rustc_index::IndexVec;
|
||||
use rustc_middle::mir::{BasicBlock, Body, Location};
|
||||
use rustc_middle::mir::{self, BasicBlock, Body, Location};
|
||||
|
||||
/// Maps between a `Location` and a `PointIndex` (and vice versa).
|
||||
pub struct DenseLocationMap {
|
||||
|
@ -92,3 +95,64 @@ rustc_index::newtype_index! {
|
|||
#[debug_format = "PointIndex({})"]
|
||||
pub struct PointIndex {}
|
||||
}
|
||||
|
||||
/// Add points depending on the result of the given dataflow analysis.
|
||||
pub fn save_as_intervals<'tcx, N, R>(
|
||||
elements: &DenseLocationMap,
|
||||
body: &mir::Body<'tcx>,
|
||||
mut results: R,
|
||||
) -> SparseIntervalMatrix<N, PointIndex>
|
||||
where
|
||||
N: Idx,
|
||||
R: ResultsVisitable<'tcx, FlowState = ChunkedBitSet<N>>,
|
||||
{
|
||||
let values = SparseIntervalMatrix::new(elements.num_points());
|
||||
let mut visitor = Visitor { elements, values };
|
||||
visit_results(
|
||||
body,
|
||||
body.basic_blocks.reverse_postorder().iter().copied(),
|
||||
&mut results,
|
||||
&mut visitor,
|
||||
);
|
||||
visitor.values
|
||||
}
|
||||
|
||||
struct Visitor<'a, N: Idx> {
|
||||
elements: &'a DenseLocationMap,
|
||||
values: SparseIntervalMatrix<N, PointIndex>,
|
||||
}
|
||||
|
||||
impl<'mir, 'tcx, R, N> ResultsVisitor<'mir, 'tcx, R> for Visitor<'_, N>
|
||||
where
|
||||
N: Idx,
|
||||
{
|
||||
type FlowState = ChunkedBitSet<N>;
|
||||
|
||||
fn visit_statement_after_primary_effect(
|
||||
&mut self,
|
||||
_results: &mut R,
|
||||
state: &Self::FlowState,
|
||||
_statement: &'mir mir::Statement<'tcx>,
|
||||
location: Location,
|
||||
) {
|
||||
let point = self.elements.point_from_location(location);
|
||||
// Use internal iterator manually as it is much more efficient.
|
||||
state.iter().fold((), |(), node| {
|
||||
self.values.insert(node, point);
|
||||
});
|
||||
}
|
||||
|
||||
fn visit_terminator_after_primary_effect(
|
||||
&mut self,
|
||||
_results: &mut R,
|
||||
state: &Self::FlowState,
|
||||
_terminator: &'mir mir::Terminator<'tcx>,
|
||||
location: Location,
|
||||
) {
|
||||
let point = self.elements.point_from_location(location);
|
||||
// Use internal iterator manually as it is much more efficient.
|
||||
state.iter().fold((), |(), node| {
|
||||
self.values.insert(node, point);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue