Skip to content

Commit 86cdd19

Browse files
committed
[OPT] Use IndexVec instead of HashMap in ssa analysis
1 parent 172522c commit 86cdd19

File tree

3 files changed

+13
-15
lines changed

3 files changed

+13
-15
lines changed

src/abi/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ pub fn codegen_fn_prelude(fx: &mut FunctionCx<'_, '_, impl Backend>, start_ebb:
347347
for (local, arg_kind, ty) in func_params {
348348
let layout = fx.layout_of(ty);
349349

350-
let is_ssa = *ssa_analyzed.get(&local).unwrap() == crate::analyze::SsaKind::Ssa;
350+
let is_ssa = ssa_analyzed[local] == crate::analyze::SsaKind::Ssa;
351351

352352
match arg_kind {
353353
ArgKind::Normal(Some(val)) => {
@@ -401,7 +401,7 @@ pub fn codegen_fn_prelude(fx: &mut FunctionCx<'_, '_, impl Backend>, start_ebb:
401401
let ty = fx.monomorphize(&fx.mir.local_decls[local].ty);
402402
let layout = fx.layout_of(ty);
403403

404-
let is_ssa = *ssa_analyzed.get(&local).unwrap() == crate::analyze::SsaKind::Ssa;
404+
let is_ssa = ssa_analyzed[local] == crate::analyze::SsaKind::Ssa;
405405

406406
local_place(fx, local, layout, is_ssa);
407407
}

src/abi/returning.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::prelude::*;
33

44
pub fn codegen_return_param(
55
fx: &mut FunctionCx<impl Backend>,
6-
ssa_analyzed: &HashMap<Local, crate::analyze::SsaKind>,
6+
ssa_analyzed: &rustc_index::vec::IndexVec<Local, crate::analyze::SsaKind>,
77
start_ebb: Ebb,
88
) {
99
let ret_layout = fx.return_layout();
@@ -16,8 +16,7 @@ pub fn codegen_return_param(
1616
Empty
1717
}
1818
PassMode::ByVal(_) | PassMode::ByValPair(_, _) => {
19-
let is_ssa =
20-
*ssa_analyzed.get(&RETURN_PLACE).unwrap() == crate::analyze::SsaKind::Ssa;
19+
let is_ssa = ssa_analyzed[RETURN_PLACE] == crate::analyze::SsaKind::Ssa;
2120

2221
super::local_place(fx, RETURN_PLACE, ret_layout, is_ssa);
2322

src/analyze.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
use crate::prelude::*;
22

33
use rustc::mir::StatementKind::*;
4+
use rustc_index::vec::IndexVec;
45

56
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
67
pub enum SsaKind {
78
NotSsa,
89
Ssa,
910
}
1011

11-
pub fn analyze(fx: &FunctionCx<'_, '_, impl Backend>) -> HashMap<Local, SsaKind> {
12-
let mut flag_map = HashMap::new();
13-
14-
for (local, local_decl) in fx.mir.local_decls.iter_enumerated() {
12+
pub fn analyze(fx: &FunctionCx<'_, '_, impl Backend>) -> IndexVec<Local, SsaKind> {
13+
let mut flag_map = fx.mir.local_decls.iter().map(|local_decl| {
1514
if fx.clif_type(local_decl.ty).is_some() {
16-
flag_map.insert(local, SsaKind::Ssa);
15+
SsaKind::Ssa
1716
} else {
18-
flag_map.insert(local, SsaKind::NotSsa);
17+
SsaKind::NotSsa
1918
}
20-
}
19+
}).collect::<IndexVec<Local, SsaKind>>();
2120

2221
for bb in fx.mir.basic_blocks().iter() {
2322
for stmt in bb.statements.iter() {
@@ -44,13 +43,13 @@ pub fn analyze(fx: &FunctionCx<'_, '_, impl Backend>) -> HashMap<Local, SsaKind>
4443
flag_map
4544
}
4645

47-
fn analyze_non_ssa_place(flag_map: &mut HashMap<Local, SsaKind>, place: &Place) {
46+
fn analyze_non_ssa_place(flag_map: &mut IndexVec<Local, SsaKind>, place: &Place) {
4847
match place.base {
4948
PlaceBase::Local(local) => not_ssa(flag_map, local),
5049
_ => {}
5150
}
5251
}
5352

54-
fn not_ssa<L: ::std::borrow::Borrow<Local>>(flag_map: &mut HashMap<Local, SsaKind>, local: L) {
55-
*flag_map.get_mut(local.borrow()).unwrap() = SsaKind::NotSsa;
53+
fn not_ssa(flag_map: &mut IndexVec<Local, SsaKind>, local: Local) {
54+
flag_map[local] = SsaKind::NotSsa;
5655
}

0 commit comments

Comments
 (0)