Skip to content

A single framework for gen-kill and generic dataflow problems #65672

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

Merged
merged 11 commits into from
Jan 21, 2020
Prev Previous commit
Next Next commit
Use unified dataflow framework in check_consts
  • Loading branch information
ecstatic-morse committed Jan 14, 2020
commit 355cfcdf433c47bfb2365752d33f2a24dfc6e78f
7 changes: 6 additions & 1 deletion src/librustc_mir/transform/check_consts/resolver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ impl<Q> old_dataflow::BottomValue for FlowSensitiveAnalysis<'_, '_, '_, Q> {
const BOTTOM_VALUE: bool = false;
}

impl<Q> dataflow::Analysis<'tcx> for FlowSensitiveAnalysis<'_, '_, 'tcx, Q>
impl<Q> dataflow::AnalysisDomain<'tcx> for FlowSensitiveAnalysis<'_, '_, 'tcx, Q>
where
Q: Qualif,
{
Expand All @@ -173,7 +173,12 @@ where
fn initialize_start_block(&self, _body: &mir::Body<'tcx>, state: &mut BitSet<Self::Idx>) {
self.transfer_function(state).initialize_state();
}
}

impl<Q> dataflow::Analysis<'tcx> for FlowSensitiveAnalysis<'_, '_, 'tcx, Q>
where
Q: Qualif,
{
fn apply_statement_effect(
&self,
state: &mut BitSet<Self::Idx>,
Expand Down
15 changes: 6 additions & 9 deletions src/librustc_mir/transform/check_consts/validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,10 @@ struct QualifCursor<'a, 'mir, 'tcx, Q: Qualif> {
}

impl<Q: Qualif> QualifCursor<'a, 'mir, 'tcx, Q> {
pub fn new(q: Q, item: &'a Item<'mir, 'tcx>, dead_unwinds: &BitSet<BasicBlock>) -> Self {
pub fn new(q: Q, item: &'a Item<'mir, 'tcx>) -> Self {
let analysis = FlowSensitiveAnalysis::new(q, item);
let results =
dataflow::Engine::new(item.tcx, &item.body, item.def_id, dead_unwinds, analysis)
.iterate_to_fixpoint();
let results = dataflow::Engine::new_generic(item.tcx, &item.body, item.def_id, analysis)
.iterate_to_fixpoint();
let cursor = dataflow::ResultsCursor::new(*item.body, results);

let mut in_any_value_of_ty = BitSet::new_empty(item.body.local_decls.len());
Expand Down Expand Up @@ -146,12 +145,10 @@ impl Deref for Validator<'_, 'mir, 'tcx> {

impl Validator<'a, 'mir, 'tcx> {
pub fn new(item: &'a Item<'mir, 'tcx>) -> Self {
let dead_unwinds = BitSet::new_empty(item.body.basic_blocks().len());

let needs_drop = QualifCursor::new(NeedsDrop, item, &dead_unwinds);

let has_mut_interior = QualifCursor::new(HasMutInterior, item, &dead_unwinds);
let needs_drop = QualifCursor::new(NeedsDrop, item);
let has_mut_interior = QualifCursor::new(HasMutInterior, item);

let dead_unwinds = BitSet::new_empty(item.body.basic_blocks().len());
let indirectly_mutable = old_dataflow::do_dataflow(
item.tcx,
&*item.body,
Expand Down