diff --git a/src/abi/mod.rs b/src/abi/mod.rs index 329bdea79e8..44a1d25a312 100644 --- a/src/abi/mod.rs +++ b/src/abi/mod.rs @@ -347,7 +347,7 @@ pub fn codegen_fn_prelude(fx: &mut FunctionCx<'_, '_, impl Backend>, start_ebb: for (local, arg_kind, ty) in func_params { let layout = fx.layout_of(ty); - let is_ssa = *ssa_analyzed.get(&local).unwrap() == crate::analyze::SsaKind::Ssa; + let is_ssa = ssa_analyzed[local] == crate::analyze::SsaKind::Ssa; match arg_kind { ArgKind::Normal(Some(val)) => { @@ -401,7 +401,7 @@ pub fn codegen_fn_prelude(fx: &mut FunctionCx<'_, '_, impl Backend>, start_ebb: let ty = fx.monomorphize(&fx.mir.local_decls[local].ty); let layout = fx.layout_of(ty); - let is_ssa = *ssa_analyzed.get(&local).unwrap() == crate::analyze::SsaKind::Ssa; + let is_ssa = ssa_analyzed[local] == crate::analyze::SsaKind::Ssa; local_place(fx, local, layout, is_ssa); } diff --git a/src/abi/returning.rs b/src/abi/returning.rs index 76232793406..b2f39bef13c 100644 --- a/src/abi/returning.rs +++ b/src/abi/returning.rs @@ -3,7 +3,7 @@ use crate::prelude::*; pub fn codegen_return_param( fx: &mut FunctionCx, - ssa_analyzed: &HashMap, + ssa_analyzed: &rustc_index::vec::IndexVec, start_ebb: Ebb, ) { let ret_layout = fx.return_layout(); @@ -16,8 +16,7 @@ pub fn codegen_return_param( Empty } PassMode::ByVal(_) | PassMode::ByValPair(_, _) => { - let is_ssa = - *ssa_analyzed.get(&RETURN_PLACE).unwrap() == crate::analyze::SsaKind::Ssa; + let is_ssa = ssa_analyzed[RETURN_PLACE] == crate::analyze::SsaKind::Ssa; super::local_place(fx, RETURN_PLACE, ret_layout, is_ssa); diff --git a/src/analyze.rs b/src/analyze.rs index fe58eaa18bb..4d7d637eaa8 100644 --- a/src/analyze.rs +++ b/src/analyze.rs @@ -1,6 +1,7 @@ use crate::prelude::*; use rustc::mir::StatementKind::*; +use rustc_index::vec::IndexVec; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] pub enum SsaKind { @@ -8,16 +9,14 @@ pub enum SsaKind { Ssa, } -pub fn analyze(fx: &FunctionCx<'_, '_, impl Backend>) -> HashMap { - let mut flag_map = HashMap::new(); - - for (local, local_decl) in fx.mir.local_decls.iter_enumerated() { +pub fn analyze(fx: &FunctionCx<'_, '_, impl Backend>) -> IndexVec { + let mut flag_map = fx.mir.local_decls.iter().map(|local_decl| { if fx.clif_type(local_decl.ty).is_some() { - flag_map.insert(local, SsaKind::Ssa); + SsaKind::Ssa } else { - flag_map.insert(local, SsaKind::NotSsa); + SsaKind::NotSsa } - } + }).collect::>(); for bb in fx.mir.basic_blocks().iter() { for stmt in bb.statements.iter() { @@ -44,13 +43,13 @@ pub fn analyze(fx: &FunctionCx<'_, '_, impl Backend>) -> HashMap flag_map } -fn analyze_non_ssa_place(flag_map: &mut HashMap, place: &Place) { +fn analyze_non_ssa_place(flag_map: &mut IndexVec, place: &Place) { match place.base { PlaceBase::Local(local) => not_ssa(flag_map, local), _ => {} } } -fn not_ssa>(flag_map: &mut HashMap, local: L) { - *flag_map.get_mut(local.borrow()).unwrap() = SsaKind::NotSsa; +fn not_ssa(flag_map: &mut IndexVec, local: Local) { + flag_map[local] = SsaKind::NotSsa; }