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 _pcond = { inumb = _inumb; pcond = _pcond; visited = false; liveins = Regset.empty }
let def_iinfo () = { inumb = undef_node; pcond = 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"
|