- #[inline]
- pub fn basic_blocks_mut(&mut self) -> &mut IndexVec<BasicBlock, BasicBlockData<'tcx>> {
- debug!("Clearing predecessors cache at: {:?}", self.span.data());
- self.predecessors_cache = None;
- &mut self.basic_blocks
- }
-
- #[inline]
- pub fn basic_blocks_and_local_decls_mut(
- &mut self,
- ) -> (&mut IndexVec<BasicBlock, BasicBlockData<'tcx>>, &mut LocalDecls<'tcx>) {
- (&mut self.basic_blocks, &mut self.local_decls)
- }
-
- #[inline]
- pub fn unwrap_predecessors(&self) -> &IndexVec<BasicBlock, Vec<BasicBlock>> {
- assert!(
- self.predecessors_cache.is_some(),
- "Expected predecessors_cache to be `Some(...)` for block at: {:?}",
- self.span.data()
- );
- self.predecessors_cache.as_ref().unwrap()
- }
-
- #[inline]
- pub fn ensure_predecessors(&mut self) {
- if self.predecessors_cache.is_none() {
- let mut result = IndexVec::from_elem(vec![], self.basic_blocks());
- for (bb, data) in self.basic_blocks().iter_enumerated() {
- if let Some(ref term) = data.terminator {
- for &tgt in term.successors() {
- result[tgt].push(bb);
- }
- }
- }
-
- self.predecessors_cache = Some(result)
- }
- }
-
- #[inline]
- /// This will recompute the predecessors cache if it is not available
- pub fn predecessors(&mut self) -> &IndexVec<BasicBlock, Vec<BasicBlock>> {
- self.ensure_predecessors();
- self.predecessors_cache.as_ref().unwrap()
- }
-
- #[inline]
- pub fn predecessors_for(&self, bb: BasicBlock) -> &[BasicBlock] {
- &self.unwrap_predecessors()[bb]
- }
-
- #[inline]
- pub fn predecessor_locations(&self, loc: Location) -> impl Iterator<Item = Location> + '_ {
- let if_zero_locations = if loc.statement_index == 0 {
- let predecessor_blocks = self.predecessors_for(loc.block);
- let num_predecessor_blocks = predecessor_blocks.len();
- Some(
- (0..num_predecessor_blocks)
- .map(move |i| predecessor_blocks[i])
- .map(move |bb| self.terminator_loc(bb)),
- )
- } else {
- None
- };
-
- let if_not_zero_locations = if loc.statement_index == 0 {
- None
- } else {
- Some(Location { block: loc.block, statement_index: loc.statement_index - 1 })
- };
-
- if_zero_locations.into_iter().flatten().chain(if_not_zero_locations)
- }
-
- #[inline]
- pub fn dominators(&self) -> Dominators<BasicBlock> {
- dominators(self)
- }
-