@@ -94,7 +94,6 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
9494 self . strip_nops ( ) ;
9595
9696 let mut start = START_BLOCK ;
97- let mut new_stmts = vec ! [ ] ;
9897
9998 loop {
10099 let mut changed = false ;
@@ -119,13 +118,11 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
119118 while inner_changed {
120119 inner_changed = false ;
121120 inner_changed |= self . simplify_branch ( & mut terminator) ;
122- inner_changed |= self . merge_successor ( & mut new_stmts , & mut terminator) ;
121+ inner_changed |= self . merge_successor ( bb , & mut terminator) ;
123122 changed |= inner_changed;
124123 }
125124
126- let data = & mut self . basic_blocks [ bb] ;
127- data. statements . append ( & mut new_stmts) ;
128- data. terminator = Some ( terminator) ;
125+ self . basic_blocks [ bb] . terminator = Some ( terminator) ;
129126
130127 changed |= inner_changed;
131128 }
@@ -199,7 +196,7 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
199196 // merge a block with 1 `goto` predecessor to its parent
200197 fn merge_successor (
201198 & mut self ,
202- new_stmts : & mut Vec < Statement < ' tcx > > ,
199+ merge_into : BasicBlock ,
203200 terminator : & mut Terminator < ' tcx > ,
204201 ) -> bool {
205202 let target = match terminator. kind {
@@ -216,7 +213,9 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
216213 return false ;
217214 }
218215 } ;
219- new_stmts. extend ( self . basic_blocks [ target] . statements . drain ( ..) ) ;
216+
217+ let ( from, to) = self . basic_blocks . pick2_mut ( target, merge_into) ;
218+ to. statements . append ( & mut from. statements ) ;
220219 self . pred_count [ target] = 0 ;
221220
222221 true
0 commit comments