]> git.lizzy.rs Git - rust.git/blob - src/analyze.rs
Merge pull request #839 from bjorn3/fold_offset_into_load_store
[rust.git] / src / analyze.rs
1 use crate::prelude::*;
2
3 use rustc::mir::StatementKind::*;
4 use rustc_index::vec::IndexVec;
5
6 #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
7 pub enum SsaKind {
8     NotSsa,
9     Ssa,
10 }
11
12 pub fn analyze(fx: &FunctionCx<'_, '_, impl Backend>) -> IndexVec<Local, SsaKind> {
13     let mut flag_map = fx.mir.local_decls.iter().map(|local_decl| {
14         if fx.clif_type(local_decl.ty).is_some() {
15             SsaKind::Ssa
16         } else {
17             SsaKind::NotSsa
18         }
19     }).collect::<IndexVec<Local, SsaKind>>();
20
21     for bb in fx.mir.basic_blocks().iter() {
22         for stmt in bb.statements.iter() {
23             match &stmt.kind {
24                 Assign(place_and_rval) => match &place_and_rval.1 {
25                     Rvalue::Ref(_, _, place) => {
26                         analyze_non_ssa_place(&mut flag_map, place);
27                     }
28                     _ => {}
29                 },
30                 _ => {}
31             }
32         }
33     }
34
35     flag_map
36 }
37
38 fn analyze_non_ssa_place(flag_map: &mut IndexVec<Local, SsaKind>, place: &Place) {
39     match place.base {
40         PlaceBase::Local(local) => not_ssa(flag_map, local),
41         _ => {}
42     }
43 }
44
45 fn not_ssa(flag_map: &mut IndexVec<Local, SsaKind>, local: Local) {
46     flag_map[local] = SsaKind::NotSsa;
47 }