From ba0bb02f6ff241297281784d2aed7dd8c2c78c4d Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Mon, 18 Jun 2018 16:32:28 +1000 Subject: [PATCH] Return a `SmallVec` from `place_elements`. These vectors are always small, so this avoids lots of allocations. --- src/librustc_mir/borrow_check/path_utils.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/librustc_mir/borrow_check/path_utils.rs b/src/librustc_mir/borrow_check/path_utils.rs index 4871d427d0767..b692ffbb250c7 100644 --- a/src/librustc_mir/borrow_check/path_utils.rs +++ b/src/librustc_mir/borrow_check/path_utils.rs @@ -21,6 +21,7 @@ use rustc::mir::{BasicBlock, Location, Mir, Place}; use rustc::mir::{Projection, ProjectionElem, BorrowKind}; use rustc::ty::{self, TyCtxt}; use rustc_data_structures::control_flow_graph::dominators::Dominators; +use rustc_data_structures::small_vec::SmallVec; use std::iter; pub(super) fn allow_two_phase_borrow<'a, 'tcx, 'gcx: 'tcx>( @@ -259,8 +260,8 @@ pub(super) fn places_conflict<'a, 'gcx: 'tcx, 'tcx>( /// Return all the prefixes of `place` in reverse order, including /// downcasts. -fn place_elements<'a, 'tcx>(place: &'a Place<'tcx>) -> Vec<&'a Place<'tcx>> { - let mut result = vec![]; +fn place_elements<'a, 'tcx>(place: &'a Place<'tcx>) -> SmallVec<[&'a Place<'tcx>; 8]> { + let mut result = SmallVec::new(); let mut place = place; loop { result.push(place);