@@ -29,11 +29,9 @@ pub(super) fn compute<T: FactTypes>(
2929 // Static inputs
3030 let origin_live_on_entry_rel = & ctx. origin_live_on_entry ;
3131 let cfg_edge_rel = & ctx. cfg_edge ;
32- let cfg_node = ctx. cfg_node ;
3332 let loan_killed_at = & ctx. loan_killed_at ;
34- let known_contains = & ctx. known_contains ;
33+ let known_subset = & ctx. known_subset ;
3534 let placeholder_origin = & ctx. placeholder_origin ;
36- let placeholder_loan = & ctx. placeholder_loan ;
3735
3836 // Create a new iteration context, ...
3937 let mut iteration = Iteration :: new ( ) ;
@@ -65,6 +63,10 @@ pub(super) fn compute<T: FactTypes>(
6563 let errors = iteration. variable ( "errors" ) ;
6664 let subset_errors = iteration. variable :: < ( T :: Origin , T :: Origin , T :: Point ) > ( "subset_errors" ) ;
6765
66+ let subset_placeholder =
67+ iteration. variable :: < ( T :: Origin , T :: Origin , T :: Point ) > ( "subset_placeholder" ) ;
68+ let subset_placeholder_o2p = iteration. variable_indistinct ( "subset_placeholder_o2p" ) ;
69+
6870 // load initial facts.
6971 subset. extend ( ctx. subset_base . iter ( ) ) ;
7072 origin_contains_loan_on_entry. extend ( ctx. loan_issued_at . iter ( ) ) ;
@@ -79,20 +81,6 @@ pub(super) fn compute<T: FactTypes>(
7981 . map ( |& ( origin, point) | ( ( origin, point) , ( ) ) ) ,
8082 ) ;
8183
82- // Placeholder loans are contained by their placeholder origin at all points of the CFG.
83- //
84- // contains(Origin, Loan, Node) :-
85- // cfg_node(Node),
86- // placeholder(Origin, Loan).
87- let mut placeholder_loans = Vec :: with_capacity ( placeholder_loan. len ( ) * cfg_node. len ( ) ) ;
88- for & ( loan, origin) in placeholder_loan. iter ( ) {
89- for & node in cfg_node. iter ( ) {
90- placeholder_loans. push ( ( origin, loan, node) ) ;
91- }
92- }
93-
94- origin_contains_loan_on_entry. extend ( placeholder_loans) ;
95-
9684 // .. and then start iterating rules!
9785 while iteration. changed ( ) {
9886 // Cleanup step: remove symmetries
@@ -109,6 +97,15 @@ pub(super) fn compute<T: FactTypes>(
10997 . elements
11098 . retain ( |& ( origin1, origin2, _) | origin1 != origin2) ;
11199
100+ subset_placeholder
101+ . recent
102+ . borrow_mut ( )
103+ . elements
104+ . retain ( |& ( origin1, origin2, _) | origin1 != origin2) ;
105+ subset_placeholder_o2p. from_map ( & subset_placeholder, |& ( origin1, origin2, point) | {
106+ ( ( origin2, point) , origin1)
107+ } ) ;
108+
112109 // remap fields to re-index by keys.
113110 subset_o1p. from_map ( & subset, |& ( origin1, origin2, point) | {
114111 ( ( origin1, point) , origin2)
@@ -196,23 +193,45 @@ pub(super) fn compute<T: FactTypes>(
196193 |& ( loan, point) , _, _| ( loan, point) ,
197194 ) ;
198195
196+ // subset_placeholder(Origin1, Origin2, Point) :-
197+ // subset(Origin1, Origin2, Point),
198+ // placeholder_origin(Origin1).
199+ subset_placeholder. from_leapjoin (
200+ & subset_o1p,
201+ (
202+ placeholder_origin. extend_with ( |& ( ( origin1, _point) , _origin2) | origin1) ,
203+ // remove symmetries:
204+ datafrog:: ValueFilter :: from ( |& ( ( origin1, _point) , origin2) , _| {
205+ origin1 != origin2
206+ } ) ,
207+ ) ,
208+ |& ( ( origin1, point) , origin2) , _| ( origin1, origin2, point) ,
209+ ) ;
210+
211+ // subset_placeholder(Origin1, Origin3, Point) :-
212+ // subset_placeholder(Origin1, Origin2, Point),
213+ // subset(Origin2, Origin3, Point).
214+ subset_placeholder. from_join (
215+ & subset_placeholder_o2p,
216+ & subset_o1p,
217+ |& ( _origin2, point) , & origin1, & origin3| ( origin1, origin3, point) ,
218+ ) ;
219+
199220 // subset_errors(Origin1, Origin2, Point) :-
200- // origin_contains_loan_on_entry(Origin2, Loan1, Point),
201- // placeholder(Origin2, _),
202- // placeholder(Origin1, Loan1),
203- // !known_contains(Origin2, Loan1).
221+ // subset_placeholder(Origin1, Origin2, Point),
222+ // placeholder_origin(Origin2),
223+ // !known_subset(Origin1, Origin2).
204224 subset_errors. from_leapjoin (
205- & origin_contains_loan_on_entry ,
225+ & subset_placeholder ,
206226 (
207- placeholder_origin. filter_with ( |& ( origin2, _loan1, _point) | ( origin2, ( ) ) ) ,
208- placeholder_loan. extend_with ( |& ( _origin2, loan1, _point) | loan1) ,
209- known_contains. filter_anti ( |& ( origin2, loan1, _point) | ( origin2, loan1) ) ,
227+ placeholder_origin. extend_with ( |& ( _origin1, origin2, _point) | origin2) ,
228+ known_subset. filter_anti ( |& ( origin1, origin2, _point) | ( origin1, origin2) ) ,
210229 // remove symmetries:
211- datafrog:: ValueFilter :: from ( |& ( origin2 , _loan1 , _point) , & origin1 | {
212- origin2 != origin1
230+ datafrog:: ValueFilter :: from ( |& ( origin1 , origin2 , _point) , _ | {
231+ origin1 != origin2
213232 } ) ,
214233 ) ,
215- |& ( origin2 , _loan1 , point) , & origin1 | ( origin1, origin2, point) ,
234+ |& ( origin1 , origin2 , point) , _ | ( origin1, origin2, point) ,
216235 ) ;
217236 }
218237
0 commit comments