@@ -173,25 +173,6 @@ pub(super) fn compute<T: FactTypes>(
173
173
174
174
// .. and then start iterating rules!
175
175
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) ;
195
176
subset_placeholder_o2p. from_map ( & subset_placeholder, |& ( origin1, origin2, point) | {
196
177
( ( origin2, point) , origin1)
197
178
} ) ;
@@ -299,11 +280,14 @@ pub(super) fn compute<T: FactTypes>(
299
280
300
281
// subset(origin1, origin3, point2) :-
301
282
// 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 (
304
286
& live_to_dying_regions_o2pq,
305
287
& 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
+ } ,
307
291
) ;
308
292
309
293
// origin_contains_loan_on_entry(origin2, loan, point2) :-
@@ -403,13 +387,7 @@ pub(super) fn compute<T: FactTypes>(
403
387
// placeholder_origin(Origin1).
404
388
subset_placeholder. from_leapjoin (
405
389
& 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) ,
413
391
|& ( ( origin1, point) , origin2) , _| ( origin1, origin2, point) ,
414
392
) ;
415
393
@@ -418,11 +396,14 @@ pub(super) fn compute<T: FactTypes>(
418
396
//
419
397
// subset_placeholder(Origin1, Origin3, Point) :-
420
398
// 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 (
423
402
& subset_placeholder_o2p,
424
403
& subset_o1p,
425
- |& ( _origin2, point) , & origin1, & origin3| ( origin1, origin3, point) ,
404
+ |& ( _origin2, point) , & origin1, & origin3| {
405
+ ( origin1 != origin3) . then ( || ( origin1, origin3, point) )
406
+ } ,
426
407
) ;
427
408
428
409
// subset_error(Origin1, Origin2, Point) :-
@@ -435,10 +416,6 @@ pub(super) fn compute<T: FactTypes>(
435
416
placeholder_origin. extend_with ( |& ( _origin1, origin2, _point) | origin2) ,
436
417
known_placeholder_subset
437
418
. filter_anti ( |& ( origin1, origin2, _point) | ( origin1, origin2) ) ,
438
- // remove symmetries:
439
- datafrog:: ValueFilter :: from ( |& ( origin1, origin2, _point) , _| {
440
- origin1 != origin2
441
- } ) ,
442
419
) ,
443
420
|& ( origin1, origin2, point) , _| ( origin1, origin2, point) ,
444
421
) ;
0 commit comments