Skip to content

Commit

Permalink
Do not collapse goto chains beginning with the start block
Browse files Browse the repository at this point in the history
If any block on a goto chain has more than one predecessor, then the new
start block would have basic block predecessors.

Skip the transformation for the start block altogether, to avoid
violating the new invariant that the start block does not have any basic
block predecessors.
  • Loading branch information
tmiasko committed Sep 18, 2021
1 parent 5118dd5 commit 4d614e1
Showing 1 changed file with 0 additions and 25 deletions.
25 changes: 0 additions & 25 deletions compiler/rustc_mir_transform/src/simplify.rs
Expand Up @@ -95,8 +95,6 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
pub fn simplify(mut self) {
self.strip_nops();

let mut start = START_BLOCK;

// Vec of the blocks that should be merged. We store the indices here, instead of the
// statements itself to avoid moving the (relatively) large statements twice.
// We do not push the statements directly into the target block (`bb`) as that is slower
Expand All @@ -105,8 +103,6 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
loop {
let mut changed = false;

self.collapse_goto_chain(&mut start, &mut changed);

for bb in self.basic_blocks.indices() {
if self.pred_count[bb] == 0 {
continue;
Expand Down Expand Up @@ -149,27 +145,6 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
break;
}
}

if start != START_BLOCK {
debug_assert!(self.pred_count[START_BLOCK] == 0);
self.basic_blocks.swap(START_BLOCK, start);
self.pred_count.swap(START_BLOCK, start);

// pred_count == 1 if the start block has no predecessor _blocks_.
if self.pred_count[START_BLOCK] > 1 {
for (bb, data) in self.basic_blocks.iter_enumerated_mut() {
if self.pred_count[bb] == 0 {
continue;
}

for target in data.terminator_mut().successors_mut() {
if *target == start {
*target = START_BLOCK;
}
}
}
}
}
}

/// This function will return `None` if
Expand Down

0 comments on commit 4d614e1

Please sign in to comment.