@@ -94,7 +94,6 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
94
94
self . strip_nops ( ) ;
95
95
96
96
let mut start = START_BLOCK ;
97
- let mut new_stmts = vec ! [ ] ;
98
97
99
98
loop {
100
99
let mut changed = false ;
@@ -119,13 +118,11 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
119
118
while inner_changed {
120
119
inner_changed = false ;
121
120
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) ;
123
122
changed |= inner_changed;
124
123
}
125
124
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) ;
129
126
130
127
changed |= inner_changed;
131
128
}
@@ -199,7 +196,7 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
199
196
// merge a block with 1 `goto` predecessor to its parent
200
197
fn merge_successor (
201
198
& mut self ,
202
- new_stmts : & mut Vec < Statement < ' tcx > > ,
199
+ merge_into : BasicBlock ,
203
200
terminator : & mut Terminator < ' tcx > ,
204
201
) -> bool {
205
202
let target = match terminator. kind {
@@ -216,7 +213,9 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
216
213
return false ;
217
214
}
218
215
} ;
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 ) ;
220
219
self . pred_count [ target] = 0 ;
221
220
222
221
true
0 commit comments