3 use rustc::mir::StatementKind::*;
7 const NOT_SSA = 0b00000001;
11 pub fn analyze<'a, 'tcx: 'a>(fx: &FunctionCx<'a, 'tcx, impl Backend>) -> HashMap<Local, Flags> {
12 let mut flag_map = HashMap::new();
14 for local in fx.mir.local_decls.indices() {
15 flag_map.insert(local, Flags::empty());
18 not_ssa(&mut flag_map, RETURN_PLACE);
20 for (local, local_decl) in fx.mir.local_decls.iter_enumerated() {
21 if fx.clif_type(local_decl.ty).is_none() {
22 not_ssa(&mut flag_map, local);
26 for bb in fx.mir.basic_blocks().iter() {
27 for stmt in bb.statements.iter() {
29 Assign(_, rval) => match &**rval {
30 Rvalue::Ref(_, _, place) => analyze_non_ssa_place(&mut flag_map, place),
37 match &bb.terminator().kind {
38 TerminatorKind::Call {
39 destination: Some((place, _)),
41 } => analyze_non_ssa_place(&mut flag_map, place),
49 fn analyze_non_ssa_place(flag_map: &mut HashMap<Local, Flags>, place: &Place) {
51 Place::Local(local) => not_ssa(flag_map, local),
56 fn not_ssa<L: ::std::borrow::Borrow<Local>>(flag_map: &mut HashMap<Local, Flags>, local: L) {
57 *flag_map.get_mut(local.borrow()).unwrap() |= Flags::NOT_SSA;