[OPT] Use IndexVec instead of HashMap in ssa analysis
This commit is contained in:
parent
172522c2e7
commit
86cdd1909b
@ -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);
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ use crate::prelude::*;
|
||||
|
||||
pub fn codegen_return_param(
|
||||
fx: &mut FunctionCx<impl Backend>,
|
||||
ssa_analyzed: &HashMap<Local, crate::analyze::SsaKind>,
|
||||
ssa_analyzed: &rustc_index::vec::IndexVec<Local, crate::analyze::SsaKind>,
|
||||
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);
|
||||
|
||||
|
@ -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<Local, SsaKind> {
|
||||
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<Local, SsaKind> {
|
||||
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::<IndexVec<Local, SsaKind>>();
|
||||
|
||||
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<Local, SsaKind>
|
||||
flag_map
|
||||
}
|
||||
|
||||
fn analyze_non_ssa_place(flag_map: &mut HashMap<Local, SsaKind>, place: &Place) {
|
||||
fn analyze_non_ssa_place(flag_map: &mut IndexVec<Local, SsaKind>, place: &Place) {
|
||||
match place.base {
|
||||
PlaceBase::Local(local) => not_ssa(flag_map, local),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
fn not_ssa<L: ::std::borrow::Borrow<Local>>(flag_map: &mut HashMap<Local, SsaKind>, local: L) {
|
||||
*flag_map.get_mut(local.borrow()).unwrap() = SsaKind::NotSsa;
|
||||
fn not_ssa(flag_map: &mut IndexVec<Local, SsaKind>, local: Local) {
|
||||
flag_map[local] = SsaKind::NotSsa;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user