11extern crate datafrog;
2- use datafrog:: Iteration ;
2+ use datafrog:: { Iteration , Relation } ;
33
44type Region = u32 ;
55type Borrow = u32 ;
@@ -14,15 +14,15 @@ fn main() {
1414 let subset = iteration1. variable :: < ( Region , Region , Point ) > ( "subset" ) ;
1515
1616 // different indices for `subset`.
17- let subset_r1p = iteration1. variable :: < ( ( Region , Point ) , Region ) > ( "subset_r1p" ) ;
18- let subset_r2p = iteration1. variable :: < ( ( Region , Point ) , Region ) > ( "subset_r2p" ) ;
19- let subset_p = iteration1. variable :: < ( Point , ( Region , Region ) ) > ( "subset_p" ) ;
17+ let subset_r1p = iteration1. variable :: < ( Region , Point , Region ) > ( "subset_r1p" ) ;
18+ let subset_r2p = iteration1. variable :: < ( Region , Point , Region ) > ( "subset_r2p" ) ;
19+ let subset_p = iteration1. variable :: < ( Point , Region , Region ) > ( "subset_p" ) ;
2020
2121 // temporaries as we perform a multi-way join.
22- let subset_1 = iteration1. variable :: < ( ( Region , Point ) , Region ) > ( "subset_1" ) ;
23- let subset_2 = iteration1. variable :: < ( ( Region , Point ) , Region ) > ( "subset_2" ) ;
22+ let subset_1 = iteration1. variable :: < ( Region , Point , Region ) > ( "subset_1" ) ;
23+ let subset_2 = iteration1. variable :: < ( Region , Point , Region ) > ( "subset_2" ) ;
2424
25- let region_live_at = iteration1. variable :: < ( ( Region , Point ) , ( ) ) > ( "region_live_at" ) ;
25+ let region_live_at = iteration1. variable :: < ( Region , Point ) > ( "region_live_at" ) ;
2626 let cfg_edge_p = iteration1. variable :: < ( Point , Point ) > ( "cfg_edge_p" ) ;
2727
2828 // load initial facts.
@@ -33,29 +33,29 @@ fn main() {
3333 // .. and then start iterating rules!
3434 while iteration1. changed ( ) {
3535 // remap fields to re-index by keys.
36- subset_r1p. from_map ( & subset, |& ( r1, r2, p) | ( ( r1, p) , r2) ) ;
37- subset_r2p. from_map ( & subset, |& ( r1, r2, p) | ( ( r2, p) , r1) ) ;
38- subset_p. from_map ( & subset, |& ( r1, r2, p) | ( p, ( r1, r2) ) ) ;
36+ subset_r1p. from_map ( & subset, |& ( r1, r2, p) | ( r1, p, r2) ) ;
37+ subset_r2p. from_map ( & subset, |& ( r1, r2, p) | ( r2, p, r1) ) ;
38+ subset_p. from_map ( & subset, |& ( r1, r2, p) | ( p, r1, r2) ) ;
3939
4040 // R0: subset(R1, R2, P) :- outlives(R1, R2, P).
4141 // Already loaded; outlives is static.
4242
4343 // R1: subset(R1, R3, P) :-
4444 // subset(R1, R2, P),
4545 // subset(R2, R3, P).
46- subset. from_join ( & subset_r2p, & subset_r1p, |& ( _r2, p) , & r1, & r3 | ( r1, r3, p) ) ;
46+ subset. from_join ( & subset_r2p, & subset_r1p, |( _r2, p) , ( r1, ) , ( r3 , ) | ( r1, r3, p) ) ;
4747
4848 // R2: subset(R1, R2, Q) :-
4949 // subset(R1, R2, P),
5050 // cfg_edge(P, Q),
5151 // region_live_at(R1, Q),
5252 // region_live_at(R2, Q).
5353
54- subset_1. from_join ( & subset_p, & cfg_edge_p, |& _p , & ( r1, r2) , & q | ( ( r1, q) , r2) ) ;
55- subset_2. from_join ( & subset_1, & region_live_at, |& ( r1, q) , & r2, & ( ) | {
56- ( ( r2, q) , r1)
54+ subset_1. from_join ( & subset_p, & cfg_edge_p, |_p : ( Point , ) , ( r1, r2) , ( q , ) | ( r1, q, r2) ) ;
55+ subset_2. from_join ( & subset_1, & region_live_at, |( r1, q) , ( r2, ) , ( ) | {
56+ ( r2, q, r1)
5757 } ) ;
58- subset. from_join ( & subset_2, & region_live_at, |& ( r2, q) , & r1, & ( ) | ( r1, r2, q) ) ;
58+ subset. from_join ( & subset_2, & region_live_at, |( r2, q) , ( r1, ) , ( ) | ( r1, r2, q) ) ;
5959 }
6060
6161 subset_r1p. complete ( )
@@ -69,41 +69,41 @@ fn main() {
6969 let requires = iteration2. variable :: < ( Region , Borrow , Point ) > ( "requires" ) ;
7070 requires. insert ( Vec :: new ( ) . into ( ) ) ;
7171
72- let requires_rp = iteration2. variable :: < ( ( Region , Point ) , Borrow ) > ( "requires_rp" ) ;
73- let requires_bp = iteration2. variable :: < ( ( Borrow , Point ) , Region ) > ( "requires_bp" ) ;
72+ let requires_rp = iteration2. variable :: < ( Region , Point , Borrow ) > ( "requires_rp" ) ;
73+ let requires_bp = iteration2. variable :: < ( Borrow , Point , Region ) > ( "requires_bp" ) ;
7474
75- let requires_1 = iteration2. variable :: < ( Point , ( Borrow , Region ) ) > ( "requires_1" ) ;
76- let requires_2 = iteration2. variable :: < ( ( Region , Point ) , Borrow ) > ( "requires_2" ) ;
75+ let requires_1 = iteration2. variable :: < ( Point , Borrow , Region ) > ( "requires_1" ) ;
76+ let requires_2 = iteration2. variable :: < ( Region , Point , Borrow ) > ( "requires_2" ) ;
7777
78- let subset_r1p = iteration2. variable :: < ( ( Region , Point ) , Region ) > ( "subset_r1p" ) ;
78+ let subset_r1p = iteration2. variable :: < ( Region , Point , Region ) > ( "subset_r1p" ) ;
7979 subset_r1p. insert ( subset) ;
8080
81- let killed = Vec :: new ( ) . into ( ) ;
82- let region_live_at = iteration2. variable :: < ( ( Region , Point ) , ( ) ) > ( "region_live_at" ) ;
81+ let killed: Relation < ( Borrow , Point ) > = Vec :: new ( ) . into ( ) ;
82+ let region_live_at = iteration2. variable :: < ( Region , Point ) > ( "region_live_at" ) ;
8383 let cfg_edge_p = iteration2. variable :: < ( Point , Point ) > ( "cfg_edge_p" ) ;
8484
8585 // .. and then start iterating rules!
8686 while iteration2. changed ( ) {
87- requires_rp. from_map ( & requires, |& ( r, b, p) | ( ( r, p) , b) ) ;
88- requires_bp. from_map ( & requires, |& ( r, b, p) | ( ( b, p) , r) ) ;
87+ requires_rp. from_map ( & requires, |& ( r, b, p) | ( r, p, b) ) ;
88+ requires_bp. from_map ( & requires, |& ( r, b, p) | ( b, p, r) ) ;
8989
9090 // requires(R, B, P) :- borrow_region(R, B, P).
9191 // Already loaded; borrow_region is static.
9292
9393 // requires(R2, B, P) :-
9494 // requires(R1, B, P),
9595 // subset(R1, R2, P).
96- requires. from_join ( & requires_rp, & subset_r1p, |& ( _r1, p) , & b , & r2 | ( r2, b, p) ) ;
96+ requires. from_join ( & requires_rp, & subset_r1p, |( _r1, p) , ( b , ) , ( r2 , ) | ( r2, b, p) ) ;
9797
9898 // requires(R, B, Q) :-
9999 // requires(R, B, P),
100100 // !killed(B, P),
101101 // cfg_edge(P, Q),
102102 // (region_live_at(R, Q); universal_region(R)).
103103
104- requires_1. from_antijoin ( & requires_bp, & killed, |& ( b, p) , & r | ( p, ( b, r) ) ) ;
105- requires_2. from_join ( & requires_1, & cfg_edge_p, |& _p , & ( b, r) , & q | ( ( r, q) , b) ) ;
106- requires. from_join ( & requires_2, & region_live_at, |& ( r, q) , & b , & ( ) | ( r, b, q) ) ;
104+ requires_1. from_antijoin ( & requires_bp, & killed, |( b, p, r ) | ( p, b, r) ) ;
105+ requires_2. from_join ( & requires_1, & cfg_edge_p, |_p : ( Point , ) , ( b, r) , ( q , ) | ( r, q, b) ) ;
106+ requires. from_join ( & requires_2, & region_live_at, |( r, q) , ( b , ) , ( ) | ( r, b, q) ) ;
107107 }
108108
109109 requires. complete ( )
0 commit comments