提交 8f504284 编写于 作者: F Felix S. Klock II

Removed the `_frozen` methods from dataflow API.

Calls to methods like `each_bit_on_entry_frozen` and
`each_gen_bit_frozen` now go to the `each_bit_on_entry` and
`each_gen_bit` methods.
上级 fc4f6eda
...@@ -172,7 +172,7 @@ pub fn each_issued_loan(&self, scope_id: ast::NodeId, op: |&Loan| -> bool) ...@@ -172,7 +172,7 @@ pub fn each_issued_loan(&self, scope_id: ast::NodeId, op: |&Loan| -> bool)
//! are issued for future scopes and thus they may have been //! are issued for future scopes and thus they may have been
//! *issued* but not yet be in effect. //! *issued* but not yet be in effect.
self.dfcx_loans.each_bit_on_entry_frozen(scope_id, |loan_index| { self.dfcx_loans.each_bit_on_entry(scope_id, |loan_index| {
let loan = &self.all_loans[loan_index]; let loan = &self.all_loans[loan_index];
op(loan) op(loan)
}) })
...@@ -271,7 +271,7 @@ pub fn loans_generated_by(&self, scope_id: ast::NodeId) -> Vec<uint> { ...@@ -271,7 +271,7 @@ pub fn loans_generated_by(&self, scope_id: ast::NodeId) -> Vec<uint> {
//! we encounter `scope_id`. //! we encounter `scope_id`.
let mut result = Vec::new(); let mut result = Vec::new();
self.dfcx_loans.each_gen_bit_frozen(scope_id, |loan_index| { self.dfcx_loans.each_gen_bit(scope_id, |loan_index| {
result.push(loan_index); result.push(loan_index);
true true
}); });
......
...@@ -576,7 +576,7 @@ pub fn each_path_moved_by(&self, ...@@ -576,7 +576,7 @@ pub fn each_path_moved_by(&self,
* Iterates through each path moved by `id` * Iterates through each path moved by `id`
*/ */
self.dfcx_moves.each_gen_bit_frozen(id, |index| { self.dfcx_moves.each_gen_bit(id, |index| {
let move = self.move_data.moves.borrow(); let move = self.move_data.moves.borrow();
let move = move.get(index); let move = move.get(index);
let moved_path = move.path; let moved_path = move.path;
...@@ -592,7 +592,7 @@ pub fn kind_of_move_of_path(&self, ...@@ -592,7 +592,7 @@ pub fn kind_of_move_of_path(&self,
let mut ret = None; let mut ret = None;
for loan_path_index in self.move_data.path_map.borrow().find(&*loan_path).iter() { for loan_path_index in self.move_data.path_map.borrow().find(&*loan_path).iter() {
self.dfcx_moves.each_gen_bit_frozen(id, |move_index| { self.dfcx_moves.each_gen_bit(id, |move_index| {
let move = self.move_data.moves.borrow(); let move = self.move_data.moves.borrow();
let move = move.get(move_index); let move = move.get(move_index);
if move.path == **loan_path_index { if move.path == **loan_path_index {
...@@ -637,7 +637,7 @@ pub fn each_move_of(&self, ...@@ -637,7 +637,7 @@ pub fn each_move_of(&self,
let mut ret = true; let mut ret = true;
self.dfcx_moves.each_bit_on_entry_frozen(id, |index| { self.dfcx_moves.each_bit_on_entry(id, |index| {
let move = self.move_data.moves.borrow(); let move = self.move_data.moves.borrow();
let move = move.get(index); let move = move.get(index);
let moved_path = move.path; let moved_path = move.path;
...@@ -693,7 +693,7 @@ pub fn each_assignment_of(&self, ...@@ -693,7 +693,7 @@ pub fn each_assignment_of(&self,
} }
}; };
self.dfcx_assign.each_bit_on_entry_frozen(id, |index| { self.dfcx_assign.each_bit_on_entry(id, |index| {
let assignment = self.move_data.var_assignments.borrow(); let assignment = self.move_data.var_assignments.borrow();
let assignment = assignment.get(index); let assignment = assignment.get(index);
if assignment.path == loan_path_index && !f(assignment) { if assignment.path == loan_path_index && !f(assignment) {
......
...@@ -97,15 +97,6 @@ fn has_bitset_for_nodeid(&self, n: ast::NodeId) -> bool { ...@@ -97,15 +97,6 @@ fn has_bitset_for_nodeid(&self, n: ast::NodeId) -> bool {
assert!(n != ast::DUMMY_NODE_ID); assert!(n != ast::DUMMY_NODE_ID);
self.nodeid_to_index.contains_key(&n) self.nodeid_to_index.contains_key(&n)
} }
fn has_bitset_for_cfgidx(&self, _cfgidx: CFGIndex) -> bool {
true
}
fn get_bitset_index(&self, cfgidx: CFGIndex) -> uint {
cfgidx.node_id()
}
fn get_or_create_bitset_index(&mut self, cfgidx: CFGIndex) -> uint {
cfgidx.node_id()
}
} }
impl<'a, O:DataFlowOperator> pprust::PpAnn for DataFlowContext<'a, O> { impl<'a, O:DataFlowOperator> pprust::PpAnn for DataFlowContext<'a, O> {
...@@ -120,8 +111,9 @@ fn pre(&self, ...@@ -120,8 +111,9 @@ fn pre(&self,
}; };
if self.has_bitset_for_nodeid(id) { if self.has_bitset_for_nodeid(id) {
assert!(self.bits_per_id > 0);
let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index); let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index);
let (start, end) = self.compute_id_range_frozen(cfgidx); let (start, end) = self.compute_id_range(cfgidx);
let on_entry = self.on_entry.slice(start, end); let on_entry = self.on_entry.slice(start, end);
let entry_str = bits_to_string(on_entry); let entry_str = bits_to_string(on_entry);
...@@ -232,6 +224,8 @@ pub fn add_gen(&mut self, id: ast::NodeId, bit: uint) { ...@@ -232,6 +224,8 @@ pub fn add_gen(&mut self, id: ast::NodeId, bit: uint) {
debug!("{:s} add_gen(id={:?}, bit={:?})", debug!("{:s} add_gen(id={:?}, bit={:?})",
self.analysis_name, id, bit); self.analysis_name, id, bit);
assert!(self.nodeid_to_index.contains_key(&id)); assert!(self.nodeid_to_index.contains_key(&id));
assert!(self.bits_per_id > 0);
let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index); let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index);
let (start, end) = self.compute_id_range(cfgidx); let (start, end) = self.compute_id_range(cfgidx);
let gens = self.gens.mut_slice(start, end); let gens = self.gens.mut_slice(start, end);
...@@ -243,32 +237,21 @@ pub fn add_kill(&mut self, id: ast::NodeId, bit: uint) { ...@@ -243,32 +237,21 @@ pub fn add_kill(&mut self, id: ast::NodeId, bit: uint) {
debug!("{:s} add_kill(id={:?}, bit={:?})", debug!("{:s} add_kill(id={:?}, bit={:?})",
self.analysis_name, id, bit); self.analysis_name, id, bit);
assert!(self.nodeid_to_index.contains_key(&id)); assert!(self.nodeid_to_index.contains_key(&id));
assert!(self.bits_per_id > 0);
let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index); let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index);
let (start, end) = self.compute_id_range(cfgidx); let (start, end) = self.compute_id_range(cfgidx);
let kills = self.kills.mut_slice(start, end); let kills = self.kills.mut_slice(start, end);
set_bit(kills, bit); set_bit(kills, bit);
} }
fn apply_gen_kill(&mut self, cfgidx: CFGIndex, bits: &mut [uint]) { fn apply_gen_kill(&self, cfgidx: CFGIndex, bits: &mut [uint]) {
//! Applies the gen and kill sets for `cfgidx` to `bits` //! Applies the gen and kill sets for `cfgidx` to `bits`
debug!("{:s} apply_gen_kill(cfgidx={}, bits={}) [before]", debug!("{:s} apply_gen_kill(cfgidx={}, bits={}) [before]",
self.analysis_name, cfgidx, mut_bits_to_string(bits)); self.analysis_name, cfgidx, mut_bits_to_string(bits));
let (start, end) = self.compute_id_range(cfgidx); assert!(self.bits_per_id > 0);
let gens = self.gens.slice(start, end);
bitwise(bits, gens, &Union);
let kills = self.kills.slice(start, end);
bitwise(bits, kills, &Subtract);
debug!("{:s} apply_gen_kill(cfgidx={}, bits={}) [after]",
self.analysis_name, cfgidx, mut_bits_to_string(bits));
}
fn apply_gen_kill_frozen(&self, cfgidx: CFGIndex, bits: &mut [uint]) { let (start, end) = self.compute_id_range(cfgidx);
//! Applies the gen and kill sets for `cfgidx` to `bits`
//! Only useful after `propagate()` has been called.
debug!("{:s} apply_gen_kill(cfgidx={}, bits={}) [before]",
self.analysis_name, cfgidx, mut_bits_to_string(bits));
let (start, end) = self.compute_id_range_frozen(cfgidx);
let gens = self.gens.slice(start, end); let gens = self.gens.slice(start, end);
bitwise(bits, gens, &Union); bitwise(bits, gens, &Union);
let kills = self.kills.slice(start, end); let kills = self.kills.slice(start, end);
...@@ -278,15 +261,8 @@ fn apply_gen_kill_frozen(&self, cfgidx: CFGIndex, bits: &mut [uint]) { ...@@ -278,15 +261,8 @@ fn apply_gen_kill_frozen(&self, cfgidx: CFGIndex, bits: &mut [uint]) {
self.analysis_name, cfgidx, mut_bits_to_string(bits)); self.analysis_name, cfgidx, mut_bits_to_string(bits));
} }
fn compute_id_range_frozen(&self, cfgidx: CFGIndex) -> (uint, uint) { fn compute_id_range(&self, cfgidx: CFGIndex) -> (uint, uint) {
let n = self.get_bitset_index(cfgidx); let n = cfgidx.node_id();
let start = n * self.words_per_id;
let end = start + self.words_per_id;
(start, end)
}
fn compute_id_range(&mut self, cfgidx: CFGIndex) -> (uint, uint) {
let n = self.get_or_create_bitset_index(cfgidx);
let start = n * self.words_per_id; let start = n * self.words_per_id;
let end = start + self.words_per_id; let end = start + self.words_per_id;
...@@ -299,10 +275,10 @@ fn compute_id_range(&mut self, cfgidx: CFGIndex) -> (uint, uint) { ...@@ -299,10 +275,10 @@ fn compute_id_range(&mut self, cfgidx: CFGIndex) -> (uint, uint) {
} }
pub fn each_bit_on_entry_frozen(&self, pub fn each_bit_on_entry(&self,
id: ast::NodeId, id: ast::NodeId,
f: |uint| -> bool) f: |uint| -> bool)
-> bool { -> bool {
//! Iterates through each bit that is set on entry to `id`. //! Iterates through each bit that is set on entry to `id`.
//! Only useful after `propagate()` has been called. //! Only useful after `propagate()` has been called.
if !self.has_bitset_for_nodeid(id) { if !self.has_bitset_for_nodeid(id) {
...@@ -319,17 +295,21 @@ pub fn each_bit_for_node(&self, ...@@ -319,17 +295,21 @@ pub fn each_bit_for_node(&self,
-> bool { -> bool {
//! Iterates through each bit that is set on entry/exit to `cfgidx`. //! Iterates through each bit that is set on entry/exit to `cfgidx`.
//! Only useful after `propagate()` has been called. //! Only useful after `propagate()` has been called.
if !self.has_bitset_for_cfgidx(cfgidx) {
if self.bits_per_id == 0 {
// Skip the surprisingly common degenerate case. (Note
// compute_id_range requires self.words_per_id > 0.)
return true; return true;
} }
let (start, end) = self.compute_id_range_frozen(cfgidx);
let (start, end) = self.compute_id_range(cfgidx);
let on_entry = self.on_entry.slice(start, end); let on_entry = self.on_entry.slice(start, end);
let temp_bits; let temp_bits;
let slice = match e { let slice = match e {
Entry => on_entry, Entry => on_entry,
Exit => { Exit => {
let mut t = on_entry.to_vec(); let mut t = on_entry.to_vec();
self.apply_gen_kill_frozen(cfgidx, t.as_mut_slice()); self.apply_gen_kill(cfgidx, t.as_mut_slice());
temp_bits = t; temp_bits = t;
temp_bits.as_slice() temp_bits.as_slice()
} }
...@@ -339,15 +319,21 @@ pub fn each_bit_for_node(&self, ...@@ -339,15 +319,21 @@ pub fn each_bit_for_node(&self,
self.each_bit(slice, f) self.each_bit(slice, f)
} }
pub fn each_gen_bit_frozen(&self, id: ast::NodeId, f: |uint| -> bool) pub fn each_gen_bit(&self, id: ast::NodeId, f: |uint| -> bool)
-> bool { -> bool {
//! Iterates through each bit in the gen set for `id`. //! Iterates through each bit in the gen set for `id`.
//! Only useful after `propagate()` has been called.
if !self.has_bitset_for_nodeid(id) { if !self.has_bitset_for_nodeid(id) {
return true; return true;
} }
if self.bits_per_id == 0 {
// Skip the surprisingly common degenerate case. (Note
// compute_id_range requires self.words_per_id > 0.)
return true;
}
let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index); let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index);
let (start, end) = self.compute_id_range_frozen(cfgidx); let (start, end) = self.compute_id_range(cfgidx);
let gens = self.gens.slice(start, end); let gens = self.gens.slice(start, end);
debug!("{:s} each_gen_bit(id={:?}, gens={})", debug!("{:s} each_gen_bit(id={:?}, gens={})",
self.analysis_name, id, bits_to_string(gens)); self.analysis_name, id, bits_to_string(gens));
...@@ -356,6 +342,8 @@ pub fn each_gen_bit_frozen(&self, id: ast::NodeId, f: |uint| -> bool) ...@@ -356,6 +342,8 @@ pub fn each_gen_bit_frozen(&self, id: ast::NodeId, f: |uint| -> bool)
fn each_bit(&self, words: &[uint], f: |uint| -> bool) -> bool { fn each_bit(&self, words: &[uint], f: |uint| -> bool) -> bool {
//! Helper for iterating over the bits in a bit set. //! Helper for iterating over the bits in a bit set.
//! Returns false on the first call to `f` that returns false;
//! if all calls to `f` return true, then returns true.
for (word_index, &word) in words.iter().enumerate() { for (word_index, &word) in words.iter().enumerate() {
if word != 0 { if word != 0 {
...@@ -486,6 +474,8 @@ fn walk_cfg(&mut self, ...@@ -486,6 +474,8 @@ fn walk_cfg(&mut self,
in_out: &mut [uint]) { in_out: &mut [uint]) {
debug!("DataFlowContext::walk_cfg(in_out={}) {:s}", debug!("DataFlowContext::walk_cfg(in_out={}) {:s}",
bits_to_string(in_out), self.dfcx.analysis_name); bits_to_string(in_out), self.dfcx.analysis_name);
assert!(self.dfcx.bits_per_id > 0);
cfg.graph.each_node(|node_index, node| { cfg.graph.each_node(|node_index, node| {
debug!("DataFlowContext::walk_cfg idx={} id={} begin in_out={}", debug!("DataFlowContext::walk_cfg idx={} id={} begin in_out={}",
node_index, node.data.id, bits_to_string(in_out)); node_index, node.data.id, bits_to_string(in_out));
...@@ -529,6 +519,8 @@ fn propagate_bits_into_entry_set_for(&mut self, ...@@ -529,6 +519,8 @@ fn propagate_bits_into_entry_set_for(&mut self,
let cfgidx = edge.target(); let cfgidx = edge.target();
debug!("{:s} propagate_bits_into_entry_set_for(pred_bits={}, {} to {})", debug!("{:s} propagate_bits_into_entry_set_for(pred_bits={}, {} to {})",
self.dfcx.analysis_name, bits_to_string(pred_bits), source, cfgidx); self.dfcx.analysis_name, bits_to_string(pred_bits), source, cfgidx);
assert!(self.dfcx.bits_per_id > 0);
let (start, end) = self.dfcx.compute_id_range(cfgidx); let (start, end) = self.dfcx.compute_id_range(cfgidx);
let changed = { let changed = {
// (scoping mutable borrow of self.dfcx.on_entry) // (scoping mutable borrow of self.dfcx.on_entry)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册