aboutsummaryrefslogtreecommitdiffstats
path: root/scheduling/BTLcommonaux.ml
blob: 4605d61366216c1a38a7bde15387f7b9c73c00ab (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
open Maps
open BTL
open BTLtypes
open RTLcommonaux

let undef_node = -1

let mk_iinfo _inumb _pcond = { inumb = _inumb; pcond = _pcond; visited = false }

let def_iinfo () = { inumb = undef_node; pcond = None; visited = false }

let mk_binfo _bnumb = { bnumb = _bnumb; visited = false }

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"