about summary refs log tree commit diff
path: root/compiler/rustc_mir/src/transform/inline/cycle.rs
diff options
context:
space:
mode:
authorTomasz Miąsko <tomasz.miasko@gmail.com>2021-02-24 00:00:00 +0000
committerTomasz Miąsko <tomasz.miasko@gmail.com>2021-02-24 00:00:00 +0000
commitef731b31dbd5f1dccf4a863290c8286b9601e323 (patch)
tree394ed0c5a8c044990fa631d0da805bc485d0bbfa /compiler/rustc_mir/src/transform/inline/cycle.rs
parent6b56603e35b39c9f6cc76782330e5e415f9e43d5 (diff)
downloadrust-ef731b31dbd5f1dccf4a863290c8286b9601e323.tar.gz
rust-ef731b31dbd5f1dccf4a863290c8286b9601e323.zip
Use small hash set in `mir_inliner_callees`
Use small hash set in `mir_inliner_callees` to avoid temporary
allocation when possible and quadratic behaviour for large number of
callees.
Diffstat (limited to 'compiler/rustc_mir/src/transform/inline/cycle.rs')
-rw-r--r--compiler/rustc_mir/src/transform/inline/cycle.rs11
1 files changed, 4 insertions, 7 deletions
diff --git a/compiler/rustc_mir/src/transform/inline/cycle.rs b/compiler/rustc_mir/src/transform/inline/cycle.rs
index 4c24bec0ce3..295f3ec70dc 100644
--- a/compiler/rustc_mir/src/transform/inline/cycle.rs
+++ b/compiler/rustc_mir/src/transform/inline/cycle.rs
@@ -1,4 +1,5 @@
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
+use rustc_data_structures::sso::SsoHashSet;
 use rustc_data_structures::stack::ensure_sufficient_stack;
 use rustc_hir::def_id::{DefId, LocalDefId};
 use rustc_middle::mir::TerminatorKind;
@@ -140,7 +141,7 @@ crate fn mir_inliner_callees<'tcx>(
         // Functions from other crates and MIR shims
         _ => tcx.instance_mir(instance),
     };
-    let mut calls = Vec::new();
+    let mut calls = SsoHashSet::new();
     for bb_data in body.basic_blocks() {
         let terminator = bb_data.terminator();
         if let TerminatorKind::Call { func, .. } = &terminator.kind {
@@ -149,12 +150,8 @@ crate fn mir_inliner_callees<'tcx>(
                 ty::FnDef(def_id, substs) => (*def_id, *substs),
                 _ => continue,
             };
-            // We've seen this before
-            if calls.contains(&call) {
-                continue;
-            }
-            calls.push(call);
+            calls.insert(call);
         }
     }
-    tcx.arena.alloc_slice(&calls)
+    tcx.arena.alloc_from_iter(calls.iter().copied())
 }