@@ -173,25 +173,6 @@ pub(super) fn compute<T: FactTypes>(
173173
174174 // .. and then start iterating rules!
175175 while iteration. changed ( ) {
176- // Cleanup step: remove symmetries
177- // - remove origins which are `subset`s of themselves
178- //
179- // FIXME: investigate whether is there a better way to do that without complicating
180- // the rules too much, because it would also require temporary variables and
181- // impact performance. Until then, the big reduction in tuples improves performance
182- // a lot, even if we're potentially adding a small number of tuples
183- // per round just to remove them in the next round.
184- subset_o1p
185- . recent
186- . borrow_mut ( )
187- . elements
188- . retain ( |& ( ( origin1, _) , origin2) | origin1 != origin2) ;
189-
190- subset_placeholder
191- . recent
192- . borrow_mut ( )
193- . elements
194- . retain ( |& ( origin1, origin2, _) | origin1 != origin2) ;
195176 subset_placeholder_o2p. from_map ( & subset_placeholder, |& ( origin1, origin2, point) | {
196177 ( ( origin2, point) , origin1)
197178 } ) ;
@@ -299,11 +280,14 @@ pub(super) fn compute<T: FactTypes>(
299280
300281 // subset(origin1, origin3, point2) :-
301282 // live_to_dying_regions(origin1, origin2, point1, point2),
302- // dying_can_reach_live(origin2, origin3, point1, point2).
303- subset_o1p. from_join (
283+ // dying_can_reach_live(origin2, origin3, point1, point2),
284+ // origin1 != origin3.
285+ subset_o1p. from_join_filtered (
304286 & live_to_dying_regions_o2pq,
305287 & dying_can_reach_live,
306- |& ( _origin2, _point1, point2) , & origin1, & origin3| ( ( origin1, point2) , origin3) ,
288+ |& ( _origin2, _point1, point2) , & origin1, & origin3| {
289+ ( origin1 != origin3) . then ( || ( ( origin1, point2) , origin3) )
290+ }
307291 ) ;
308292
309293 // origin_contains_loan_on_entry(origin2, loan, point2) :-
@@ -403,13 +387,7 @@ pub(super) fn compute<T: FactTypes>(
403387 // placeholder_origin(Origin1).
404388 subset_placeholder. from_leapjoin (
405389 & subset_o1p,
406- (
407- placeholder_origin. extend_with ( |& ( ( origin1, _point) , _origin2) | origin1) ,
408- // remove symmetries:
409- datafrog:: ValueFilter :: from ( |& ( ( origin1, _point) , origin2) , _| {
410- origin1 != origin2
411- } ) ,
412- ) ,
390+ placeholder_origin. extend_with ( |& ( ( origin1, _point) , _origin2) | origin1) ,
413391 |& ( ( origin1, point) , origin2) , _| ( origin1, origin2, point) ,
414392 ) ;
415393
@@ -418,11 +396,14 @@ pub(super) fn compute<T: FactTypes>(
418396 //
419397 // subset_placeholder(Origin1, Origin3, Point) :-
420398 // subset_placeholder(Origin1, Origin2, Point),
421- // subset(Origin2, Origin3, Point).
422- subset_placeholder. from_join (
399+ // subset(Origin2, Origin3, Point),
400+ // Origin1 != Origin3.
401+ subset_placeholder. from_join_filtered (
423402 & subset_placeholder_o2p,
424403 & subset_o1p,
425- |& ( _origin2, point) , & origin1, & origin3| ( origin1, origin3, point) ,
404+ |& ( _origin2, point) , & origin1, & origin3| {
405+ ( origin1 != origin3) . then ( || ( origin1, origin3, point) )
406+ }
426407 ) ;
427408
428409 // subset_error(Origin1, Origin2, Point) :-
@@ -435,10 +416,6 @@ pub(super) fn compute<T: FactTypes>(
435416 placeholder_origin. extend_with ( |& ( _origin1, origin2, _point) | origin2) ,
436417 known_placeholder_subset
437418 . filter_anti ( |& ( origin1, origin2, _point) | ( origin1, origin2) ) ,
438- // remove symmetries:
439- datafrog:: ValueFilter :: from ( |& ( origin1, origin2, _point) , _| {
440- origin1 != origin2
441- } ) ,
442419 ) ,
443420 |& ( origin1, origin2, point) , _| ( origin1, origin2, point) ,
444421 ) ;
0 commit comments