assert!(self.bits_per_id > 0);
let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index);
let (start, end) = self.compute_id_range(cfgidx);
- let on_entry = self.on_entry.slice(start, end);
+ let on_entry = &self.on_entry[start.. end];
let entry_str = bits_to_string(on_entry);
- let gens = self.gens.slice(start, end);
+ let gens = &self.gens[start.. end];
let gens_str = if gens.iter().any(|&u| u != 0) {
format!(" gen: {}", bits_to_string(gens))
} else {
"".to_string()
};
- let kills = self.kills.slice(start, end);
+ let kills = &self.kills[start .. end];
let kills_str = if kills.iter().any(|&u| u != 0) {
format!(" kill: {}", bits_to_string(kills))
} else {
let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index);
let (start, end) = self.compute_id_range(cfgidx);
- let gens = self.gens.slice_mut(start, end);
+ let gens = &mut self.gens[start.. end];
set_bit(gens, bit);
}
let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index);
let (start, end) = self.compute_id_range(cfgidx);
- let kills = self.kills.slice_mut(start, end);
+ let kills = &mut self.kills[start.. end];
set_bit(kills, bit);
}
assert!(self.bits_per_id > 0);
let (start, end) = self.compute_id_range(cfgidx);
- let gens = self.gens.slice(start, end);
+ let gens = &self.gens[start.. end];
bitwise(bits, gens, &Union);
- let kills = self.kills.slice(start, end);
+ let kills = &self.kills[start.. end];
bitwise(bits, kills, &Subtract);
debug!("{} apply_gen_kill(cfgidx={:?}, bits={}) [after]",
}
let (start, end) = self.compute_id_range(cfgidx);
- let on_entry = self.on_entry.slice(start, end);
+ let on_entry = &self.on_entry[start.. end];
let temp_bits;
let slice = match e {
Entry => on_entry,
let cfgidx = to_cfgidx_or_die(id, &self.nodeid_to_index);
let (start, end) = self.compute_id_range(cfgidx);
- let gens = self.gens.slice(start, end);
+ let gens = &self.gens[start.. end];
debug!("{} each_gen_bit(id={}, gens={})",
self.analysis_name, id, bits_to_string(gens));
self.each_bit(gens, f)
cfg.graph.each_edge(|_edge_index, edge| {
let flow_exit = edge.source();
let (start, end) = self.compute_id_range(flow_exit);
- let mut orig_kills = self.kills.slice(start, end).to_vec();
+ let mut orig_kills = self.kills[start.. end].to_vec();
let mut changed = false;
for &node_id in edge.data.exiting_scopes.iter() {
match opt_cfg_idx {
Some(cfg_idx) => {
let (start, end) = self.compute_id_range(cfg_idx);
- let kills = self.kills.slice(start, end);
+ let kills = &self.kills[start.. end];
if bitwise(orig_kills.as_mut_slice(), kills, &Union) {
changed = true;
}
}
if changed {
- let bits = self.kills.slice_mut(start, end);
+ let bits = &mut self.kills[start.. end];
debug!("{} add_kills_from_flow_exits flow_exit={:?} bits={} [before]",
self.analysis_name, flow_exit, mut_bits_to_string(bits));
bits.clone_from_slice(&orig_kills[]);
let (start, end) = self.dfcx.compute_id_range(node_index);
// Initialize local bitvector with state on-entry.
- in_out.clone_from_slice(self.dfcx.on_entry.slice(start, end));
+ in_out.clone_from_slice(&self.dfcx.on_entry[start.. end]);
// Compute state on-exit by applying transfer function to
// state on-entry.
let (start, end) = self.dfcx.compute_id_range(cfgidx);
let changed = {
// (scoping mutable borrow of self.dfcx.on_entry)
- let on_entry = self.dfcx.on_entry.slice_mut(start, end);
+ let on_entry = &mut self.dfcx.on_entry[start.. end];
bitwise(on_entry, pred_bits, &self.dfcx.oper)
};
if changed {
debug!("{} changed entry set for {:?} to {}",
self.dfcx.analysis_name, cfgidx,
- bits_to_string(self.dfcx.on_entry.slice(start, end)));
+ bits_to_string(&self.dfcx.on_entry[start.. end]));
self.changed = true;
}
}