aboutsummaryrefslogtreecommitdiffstats
path: root/scheduling/BTLcommonaux.ml
blob: 11a7ee7fb47c8b25086c9ca044d9a44cb1cdbeae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
open Maps
open BTL
open Registers
open BTLtypes
open RTLcommonaux

let undef_node = -1

let mk_iinfo _inumb _opt_info = { inumb = _inumb; opt_info = _opt_info; visited = false; liveins = Regset.empty }

let def_iinfo () = { inumb = undef_node; opt_info = None; visited = false; liveins = Regset.empty }

let mk_binfo _bnumb _s_output_regs _typing =
  {
    bnumb = _bnumb;
    visited = false;
    s_output_regs = _s_output_regs;
    typing = _typing;
  }

let reset_visited_ibf btl =
  PTree.map
    (fun n ibf ->
      ibf.binfo.visited <- false;
      ibf)
    btl

let reset_visited_ib btl =
  List.iter
    (fun (n, ibf) ->
      let ib = ibf.entry in
      let rec reset_visited_ib_rec ib =
        match ib with
        | Bseq (ib1, ib2) ->
            reset_visited_ib_rec ib1;
            reset_visited_ib_rec ib2
        | Bcond (_, _, ib1, ib2, iinfo) ->
            reset_visited_ib_rec ib1;
            reset_visited_ib_rec ib2;
            iinfo.visited <- false
        | Bnop (Some iinfo)
        | Bop (_, _, _, iinfo)
        | Bload (_, _, _, _, _, iinfo)
        | Bstore (_, _, _, _, iinfo)
        | BF (_, iinfo) ->
            iinfo.visited <- false
        | _ -> ()
      in
      reset_visited_ib_rec ib)
    (PTree.elements btl);
  btl

let jump_visit = function
  | Bcond (_, _, _, _, iinfo)
  | Bnop (Some iinfo)
  | Bop (_, _, _, iinfo)
  | Bload (_, _, _, _, _, iinfo)
  | Bstore (_, _, _, _, iinfo)
  | BF (_, iinfo) ->
      if iinfo.visited then true
      else (
        iinfo.visited <- true;
        false)
  | Bseq (_, _) -> false
  | Bnop None -> true

let rec get_inumb_or_next = function
  | BF (Bgoto s, _) -> p2i s
  | BF (_, iinfo)
  | Bnop (Some iinfo)
  | Bop (_, _, _, iinfo)
  | Bload (_, _, _, _, _, iinfo)
  | Bstore (_, _, _, _, iinfo)
  | Bcond (_, _, _, _, iinfo) ->
      iinfo.inumb
  | Bseq (ib1, _) -> get_inumb_or_next ib1
  | _ -> failwith "get_inumb_or_next: Bnop None"

let get_liveins = function
  | BF (_, iinfo)
  | Bnop (Some iinfo)
  | Bop (_, _, _, iinfo)
  | Bload (_, _, _, _, _, iinfo)
  | Bstore (_, _, _, _, iinfo)
  | Bcond (_, _, _, _, iinfo) ->
      iinfo.liveins
  | _ -> failwith "get_liveins: invalid iblock"