remove the ins set altogether

This commit is contained in:
Niko Matsakis 2018-06-29 06:47:12 -04:00
parent be0e77837a
commit 865320f6a4
3 changed files with 20 additions and 30 deletions

View File

@ -261,13 +261,6 @@ fn dump_mir_results<'a, 'gcx, 'tcx>(
}
}
// Before each basic block, dump out the values
// that are live on entry to the basic block.
PassWhere::BeforeBlock(bb) => {
let s = live_variable_set(&liveness.regular.ins[bb], &liveness.drop.ins[bb]);
writeln!(out, " | Live variables on entry to {:?}: {}", bb, s)?;
}
PassWhere::BeforeLocation(location) => {
let s = live_variable_set(
&regular_liveness_per_location[&location],
@ -283,7 +276,14 @@ fn dump_mir_results<'a, 'gcx, 'tcx>(
)?;
}
PassWhere::AfterLocation(_) | PassWhere::AfterCFG => {}
// After each basic block, dump out the values
// that are live on exit from the basic block.
PassWhere::AfterTerminator(bb) => {
let s = live_variable_set(&liveness.regular.outs[bb], &liveness.drop.outs[bb]);
writeln!(out, " | Live variables on entry to {:?}: {}", bb, s)?;
}
PassWhere::BeforeBlock(_) | PassWhere::AfterLocation(_) | PassWhere::AfterCFG => {}
}
Ok(())
},

View File

@ -56,9 +56,6 @@ pub struct LivenessResult {
/// Liveness mode in use when these results were computed.
pub mode: LivenessMode,
/// Live variables on entry to each basic block.
pub ins: IndexVec<BasicBlock, LocalSet>,
/// Live variables on exit to each basic block. This is equal to
/// the union of the `ins` for each successor.
pub outs: IndexVec<BasicBlock, LocalSet>,
@ -125,11 +122,10 @@ pub fn liveness_of_locals<'tcx>(mir: &Mir<'tcx>, mode: LivenessMode) -> Liveness
.map(|b| block(mode, b, locals))
.collect();
let mut ins: IndexVec<_, _> = mir.basic_blocks()
let mut outs: IndexVec<_, _> = mir.basic_blocks()
.indices()
.map(|_| LocalSet::new_empty(locals))
.collect();
let mut outs = ins.clone();
let mut bits = LocalSet::new_empty(locals);
@ -140,28 +136,21 @@ pub fn liveness_of_locals<'tcx>(mir: &Mir<'tcx>, mode: LivenessMode) -> Liveness
let predecessors = mir.predecessors();
while let Some(bb) = dirty_queue.pop() {
// outs[b] = {ins of successors}
bits.clear();
for &successor in mir[bb].terminator().successors() {
bits.union(&ins[successor]);
}
outs[bb].overwrite(&bits);
// bits = use (bits - def)
bits.overwrite(&outs[bb]);
def_use[bb].apply(&mut bits);
// update bits on entry and, if they have changed, enqueue all
// of our predecessors, since their inputs have now changed
if ins[bb] != bits {
ins[bb].overwrite(&bits);
for &pred_bb in &predecessors[bb] {
// add `bits` to the out set for each predecessor; if those
// bits were not already present, then enqueue the predecessor
// as dirty.
for &pred_bb in &predecessors[bb] {
if outs[pred_bb].union(&bits) {
dirty_queue.insert(pred_bb);
}
}
}
LivenessResult { mode, ins, outs }
LivenessResult { mode, outs }
}
impl LivenessResult {
@ -202,8 +191,6 @@ impl LivenessResult {
statement_defs_uses.apply(&mut bits);
callback(statement_location, &bits);
}
assert_eq!(bits, self.ins[block]);
}
fn defs_uses<'tcx, V>(&self, mir: &Mir<'tcx>, location: Location, thing: &V) -> DefsUses
@ -445,7 +432,6 @@ pub fn write_mir_fn<'a, 'tcx>(
.collect();
writeln!(w, "{} {{{}}}", prefix, live.join(", "))
};
print(w, " ", &result.ins)?;
write_basic_block(tcx, block, mir, &mut |_, _| Ok(()), w)?;
print(w, " ", &result.outs)?;
if block.index() + 1 != mir.basic_blocks().len() {

View File

@ -44,6 +44,9 @@ pub enum PassWhere {
/// We just dumped the given statement or terminator.
AfterLocation(Location),
/// We just dumped the terminator for a block but not the closing `}`.
AfterTerminator(BasicBlock),
}
/// If the session is properly configured, dumps a human-readable
@ -351,6 +354,7 @@ where
})?;
extra_data(PassWhere::AfterLocation(current_location), w)?;
extra_data(PassWhere::AfterTerminator(block), w)?;
writeln!(w, "{}}}", INDENT)
}