@@ -52,6 +52,12 @@ placeholder_origin(o) :- placeholder(o, _).
52
52
.input known_placeholder_subset
53
53
54
54
55
+ .decl origin_live_on_entry_or_placeholder(origin: Origin, point: Node) inline
56
+
57
+ origin_live_on_entry_or_placeholder(origin, point) :- origin_live_on_entry(origin, point).
58
+ origin_live_on_entry_or_placeholder(origin, point) :- placeholder_origin(origin), cfg_node(point).
59
+
60
+
55
61
// The origins `origin1` and `origin2` are "live to dead"
56
62
// on the edge `point1 -> point2` if:
57
63
//
@@ -65,8 +71,8 @@ placeholder_origin(o) :- placeholder(o, _).
65
71
live_to_dying_regions(origin1, origin2, point1, point2) :-
66
72
subset(origin1, origin2, point1),
67
73
cfg_edge(point1, point2),
68
- origin_live_on_entry (origin1, point2),
69
- !origin_live_on_entry (origin2, point2).
74
+ origin_live_on_entry_or_placeholder (origin1, point2),
75
+ !origin_live_on_entry_or_placeholder (origin2, point2).
70
76
71
77
72
78
// The `origin` requires `loan`, but the `origin` goes dead
@@ -77,7 +83,7 @@ dying_region_requires(origin, point1, point2, loan) :-
77
83
requires(origin, loan, point1),
78
84
!loan_killed_at(loan, point1),
79
85
cfg_edge(point1, point2),
80
- !origin_live_on_entry (origin, point2).
86
+ !origin_live_on_entry_or_placeholder (origin, point2).
81
87
82
88
83
89
// Contains dead origins where we are interested
@@ -106,7 +112,7 @@ dying_can_reach(origin1, origin2, point1, point2) :-
106
112
// "intermediate" `origin2` is dead at `point2`.
107
113
dying_can_reach(origin1, origin3, point1, point2) :-
108
114
dying_can_reach(origin1, origin2, point1, point2),
109
- !origin_live_on_entry (origin2, point2),
115
+ !origin_live_on_entry_or_placeholder (origin2, point2),
110
116
subset(origin2, origin3, point1).
111
117
112
118
@@ -119,7 +125,7 @@ dying_can_reach(origin1, origin3, point1, point2) :-
119
125
120
126
dying_can_reach_live(origin1, origin2, point1, point2) :-
121
127
dying_can_reach(origin1, origin2, point1, point2),
122
- origin_live_on_entry (origin2, point2).
128
+ origin_live_on_entry_or_placeholder (origin2, point2).
123
129
124
130
125
131
// Indicates a "borrow region" `origin` at `point` which is not live on
@@ -128,7 +134,7 @@ dying_can_reach_live(origin1, origin2, point1, point2) :-
128
134
129
135
dead_borrow_region_can_reach_root(origin, point, loan) :-
130
136
loan_issued_at(origin, loan, point),
131
- !origin_live_on_entry (origin, point).
137
+ !origin_live_on_entry_or_placeholder (origin, point).
132
138
133
139
134
140
.decl dead_borrow_region_can_reach_dead(origin: Origin, point: Node, loan: Loan)
@@ -139,7 +145,7 @@ dead_borrow_region_can_reach_dead(origin, point, loan) :-
139
145
dead_borrow_region_can_reach_dead(origin2, point, loan) :-
140
146
dead_borrow_region_can_reach_dead(origin1, point, loan),
141
147
subset(origin1, origin2, point),
142
- !origin_live_on_entry (origin2, point).
148
+ !origin_live_on_entry_or_placeholder (origin2, point).
143
149
144
150
145
151
.decl subset(origin1: Origin, origin2: Origin, point: Node)
@@ -152,12 +158,13 @@ subset(origin1, origin2, point) :- subset_base(origin1, origin2, point).
152
158
subset(origin1, origin2, point2) :-
153
159
subset(origin1, origin2, point1),
154
160
cfg_edge(point1, point2),
155
- origin_live_on_entry (origin1, point2),
156
- origin_live_on_entry (origin2, point2).
161
+ origin_live_on_entry_or_placeholder (origin1, point2),
162
+ origin_live_on_entry_or_placeholder (origin2, point2).
157
163
158
164
subset(origin1, origin3, point2) :-
159
165
live_to_dying_regions(origin1, origin2, point1, point2),
160
- dying_can_reach_live(origin2, origin3, point1, point2).
166
+ dying_can_reach_live(origin2, origin3, point1, point2),
167
+ origin1 != origin3.
161
168
162
169
163
170
.decl requires(origin: Origin, loan: Loan, point: Node)
@@ -175,19 +182,19 @@ requires(origin, loan, point2) :-
175
182
requires(origin, loan, point1),
176
183
!loan_killed_at(loan, point1),
177
184
cfg_edge(point1, point2),
178
- origin_live_on_entry (origin, point2).
185
+ origin_live_on_entry_or_placeholder (origin, point2).
179
186
180
187
181
188
.decl borrow_live_at(loan: Loan, point: Node)
182
189
183
190
borrow_live_at(loan, point) :-
184
191
requires(origin, loan, point),
185
- origin_live_on_entry (origin, point).
192
+ origin_live_on_entry_or_placeholder (origin, point).
186
193
187
194
borrow_live_at(loan, point) :-
188
195
dead_borrow_region_can_reach_dead(origin1, point, loan),
189
196
subset(origin1, origin2, point),
190
- origin_live_on_entry (origin2, point).
197
+ origin_live_on_entry_or_placeholder (origin2, point).
191
198
192
199
193
200
.decl errors(loan: Loan, point: Node)
0 commit comments