Skip to content

Commit dfd244d

Browse files
committed
Eliminate ret_field and ret intermediates in array clone shim
1 parent f976291 commit dfd244d

File tree

1 file changed

+10
-24
lines changed

1 file changed

+10
-24
lines changed

src/librustc_mir/shim.rs

+10-24
Original file line numberDiff line numberDiff line change
@@ -505,11 +505,11 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
505505
fn array_shim(&mut self, ty: Ty<'tcx>, len: u64) {
506506
let tcx = self.tcx;
507507
let span = self.span;
508-
let rcvr = Place::Local(Local::new(1+0)).deref();
508+
let src = Place::Local(Local::new(1+0)).deref();
509+
let dest = Place::Local(RETURN_PLACE);
509510

510511
let beg = self.local_decls.push(temp_decl(Mutability::Mut, tcx.types.usize, span));
511512
let end = self.make_place(Mutability::Not, tcx.types.usize);
512-
let ret = self.make_place(Mutability::Mut, tcx.mk_array(ty, len));
513513

514514
// BB #0
515515
// `let mut beg = 0;`
@@ -539,25 +539,17 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
539539
self.loop_header(Place::Local(beg), end, BasicBlock::new(2), BasicBlock::new(4), false);
540540

541541
// BB #2
542-
// `let cloned = Clone::clone(rcvr[beg])`;
542+
// `dest[i] = Clone::clone(src[beg])`;
543543
// Goto #3 if ok, #5 if unwinding happens.
544-
let rcvr_field = rcvr.clone().index(beg);
545-
let cloned = self.make_place(Mutability::Not, ty);
546-
self.make_clone_call(cloned.clone(), rcvr_field, ty, BasicBlock::new(3),
544+
let dest_field = dest.clone().index(beg);
545+
let src_field = src.clone().index(beg);
546+
self.make_clone_call(dest_field, src_field, ty, BasicBlock::new(3),
547547
BasicBlock::new(5));
548548

549549
// BB #3
550-
// `ret[beg] = cloned;`
551550
// `beg = beg + 1;`
552551
// `goto #1`;
553-
let ret_field = ret.clone().index(beg);
554552
let statements = vec![
555-
self.make_statement(
556-
StatementKind::Assign(
557-
ret_field,
558-
Rvalue::Use(Operand::Move(cloned))
559-
)
560-
),
561553
self.make_statement(
562554
StatementKind::Assign(
563555
Place::Local(beg),
@@ -572,14 +564,8 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
572564
self.block(statements, TerminatorKind::Goto { target: BasicBlock::new(1) }, false);
573565

574566
// BB #4
575-
// `return ret;`
576-
let ret_statement = self.make_statement(
577-
StatementKind::Assign(
578-
Place::Local(RETURN_PLACE),
579-
Rvalue::Use(Operand::Move(ret.clone())),
580-
)
581-
);
582-
self.block(vec![ret_statement], TerminatorKind::Return, false);
567+
// `return dest;`
568+
self.block(vec![], TerminatorKind::Return, false);
583569

584570
// BB #5 (cleanup)
585571
// `let end = beg;`
@@ -604,9 +590,9 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
604590
BasicBlock::new(7), BasicBlock::new(9), true);
605591

606592
// BB #7 (cleanup)
607-
// `drop(ret[beg])`;
593+
// `drop(dest[beg])`;
608594
self.block(vec![], TerminatorKind::Drop {
609-
location: ret.index(beg),
595+
location: dest.index(beg),
610596
target: BasicBlock::new(8),
611597
unwind: None,
612598
}, true);

0 commit comments

Comments
 (0)