From 76664fc73e355b70f575bbe3a2ca9ad6cc66af98 Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Thu, 27 May 2021 17:09:15 +0100 Subject: [PATCH] Optimize codegen for SecondaryMap indexing (#2940) Moves the slow path which resizes the vector out-of-line. The actual indexing is also done in the out-of-line path which avoids the need for a second bounds check in the fast path after a potential resize. --- cranelift/entity/src/map.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cranelift/entity/src/map.rs b/cranelift/entity/src/map.rs index 6e04b96841..67cdc11004 100644 --- a/cranelift/entity/src/map.rs +++ b/cranelift/entity/src/map.rs @@ -129,6 +129,13 @@ where pub fn resize(&mut self, n: usize) { self.elems.resize(n, self.default.clone()); } + + /// Slow path for `index_mut` which resizes the vector. + #[cold] + fn resize_for_index_mut(&mut self, i: usize) -> &mut V { + self.elems.resize(i + 1, self.default.clone()); + &mut self.elems[i] + } } impl Default for SecondaryMap @@ -169,7 +176,7 @@ where fn index_mut(&mut self, k: K) -> &mut V { let i = k.index(); if i >= self.elems.len() { - self.elems.resize(i + 1, self.default.clone()); + return self.resize_for_index_mut(i); } &mut self.elems[i] }