diff options
| author | CohenArthur <arthur.cohen@epita.fr> | 2020-08-23 21:44:00 +0200 |
|---|---|---|
| committer | CohenArthur <arthur.cohen@epita.fr> | 2020-08-23 21:44:00 +0200 |
| commit | cb386896ee4df8f76758737044abe9300d6f8802 (patch) | |
| tree | 7f93aa98b07e52697dbd180c97dfe96075ad1cb3 /src/optimize | |
| parent | 5c8c75b1d2a1fd8146daf71a3ef05acdca406d0b (diff) | |
stack2reg: Switch to hashbrown::HashSet
Diffstat (limited to 'src/optimize')
| -rw-r--r-- | src/optimize/stack2reg.rs | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/optimize/stack2reg.rs b/src/optimize/stack2reg.rs index d1826a9af72..aceced41f27 100644 --- a/src/optimize/stack2reg.rs +++ b/src/optimize/stack2reg.rs @@ -13,12 +13,15 @@ use std::collections::BTreeMap; use std::fmt; use std::ops::Not; -use rustc_data_structures::fx::FxHashSet; +use rustc_data_structures::fx::{FxHashSet, FxHasher}; use cranelift_codegen::cursor::{Cursor, FuncCursor}; use cranelift_codegen::ir::{InstructionData, Opcode, ValueDef}; use cranelift_codegen::ir::immediates::Offset32; +use hashbrown::HashSet; +use std::hash::BuildHasherDefault; + use crate::prelude::*; /// Workaround for `StackSlot` not implementing `Ord`. @@ -45,9 +48,9 @@ impl Ord for OrdStackSlot { #[derive(Debug, Default)] struct StackSlotUsage { - stack_addr: FxHashSet<Inst>, - stack_load: FxHashSet<Inst>, - stack_store: FxHashSet<Inst>, + stack_addr: HashSet<Inst, BuildHasherDefault<FxHasher>>, + stack_load: HashSet<Inst, BuildHasherDefault<FxHasher>>, + stack_store: HashSet<Inst, BuildHasherDefault<FxHasher>>, } impl StackSlotUsage { @@ -313,17 +316,19 @@ fn remove_unused_stack_addr_and_stack_load(opt_ctx: &mut OptimizeContext<'_>) { // Replace all unused stack_addr and stack_load instructions with nop. let mut func = &mut opt_ctx.ctx.func; + + // drain_filter() on hashbrown::HashSet drains the items that do *not* match the + // predicate. Once hashbrown gets updated to match the behaviour of std::drain_filter + // (0.8.2), the predicate will have to be reversed for stack_slot_users in opt_ctx.stack_slot_usage_map.values_mut() { stack_slot_users .stack_addr - .drain() - .filter(|inst| stack_addr_load_insts_users.get(inst).map(|users| users.is_empty()).unwrap_or(true)) + .drain_filter(|inst| !(stack_addr_load_insts_users.get(inst).map(|users| users.is_empty()).unwrap_or(true))) .for_each(|inst| StackSlotUsage::remove_unused_stack_addr(&mut func, inst)); stack_slot_users .stack_load - .drain() - .filter(|inst| stack_addr_load_insts_users.get(inst).map(|users| users.is_empty()).unwrap_or(true)) + .drain_filter(|inst| !(stack_addr_load_insts_users.get(inst).map(|users| users.is_empty()).unwrap_or(true))) .for_each(|inst| StackSlotUsage::remove_unused_load(&mut func, inst)); } } |
