/
LVA.dl
125 lines (95 loc) · 2.23 KB
/
LVA.dl
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// reachibility
.decl InitialReachable(n:CodeName) brie
.input InitialReachable
// hardcoded edb
//InitialReachable("::Main.main").
//InitialReachable(":Main.main").
//InitialReachable("Main.main").
// Call tree
.decl CalledCode(caller:CodeName, callee:CodeName)
.output CalledCode
USED("LVA-01")
CalledCode(caller, callee) :-
Called(r, callee),
HasInst(caller, r). // NOTE: alts can be callers ; needs fix to include the function or closure?
// SECTION: reachability
.decl ReachableCode(n:CodeName) brie
.output ReachableCode
USED("LVA-02")
ReachableCode(n) :-
InitialReachable(n).
// call
USED("LVA-03")
ReachableCode(callee) :-
ReachableCode(caller),
CalledCode(caller, callee).
.decl Reachable(inst:Variable) brie
.output Reachable
USED("LVA-06")
Reachable(inst) :-
ReachableCode(f),
HasInst(f, inst).
Reachable(p) :-
ReachableCode(f),
( FunctionParameter(f, _, p)
; ClosureParameter(f, _, p)
; AltParameter(f, _, p)
).
.decl TagValue(v:Variable, t:Tag)
.output TagValue
USED("LVA-07")
TagValue(v, tag) :-
Node(node, tag),
NodeOrigin(v, node).
USED("LVA-08")
TagValue(v, tag) :-
TypeNode(ty_var, tag),
ExternalOrigin(v, _, ty_var).
// SECTION: dead code
.decl DeadCode(n:CodeName) brie
.output DeadCode
USED("LVA-09")
DeadCode(n) :-
ReturnValue(n, _),
!ReachableCode(n).
.decl DeadExternal(n:External) brie
.output DeadExternal
.decl ReachableExternal(n:External) brie
.output ReachableExternal
USED("LVA-10")
ReachableExternal(callee) :-
ReachableCode(caller),
ExternalFunction(callee, _, _),
CalledCode(caller, callee).
// TODO: ReachableCode + Call + ExternalFunction
USED("LVA-11")
DeadExternal(n) :-
ExternalFunction(n, _, _),
!ReachableExternal(n).
//////
.decl HasCallOp(code:CodeName) brie
.output HasCallOp
USED("LVA-12")
HasCallOp(code) :-
ReturnValue(code, _),
HasInst(code, r),
Call(r, _, _).
USED("LVA-13")
HasCallOp(code) :- // flatten alts
HasInst(code, r),
Alt(r, alt, _),
HasCallOp(alt).
.decl LeafCode(code:CodeName) brie
.output LeafCode
USED("LVA-14")
LeafCode(caller) :-
HasCallOp(caller),
!Alt(_, caller, _),
!CalledCode(caller, _).
/////////////////////////////////
/*
check:
- reachable case
- no matching alternative
- without default pattern
*/