@@ -298,12 +298,7 @@ function tograph(ag::AliasGraph, var_to_diff::DiffGraph)
298
298
add_edge! (g, a, v)
299
299
end
300
300
transitiveclosure! (g)
301
- zero_vars_set = BitSet (zero_vars)
302
- for v in zero_vars
303
- for a in outneighbors (g, v)
304
- push! (zero_vars_set, a)
305
- end
306
- end
301
+ #=
307
302
# Compute the largest transitive closure that doesn't include any diff
308
303
# edges.
309
304
og = g
@@ -320,6 +315,8 @@ function tograph(ag::AliasGraph, var_to_diff::DiffGraph)
320
315
end
321
316
end
322
317
g = newg
318
+ =#
319
+ eqg = copy (g)
323
320
324
321
c = " green"
325
322
edge_styles = Dict {Tuple{Int, Int}, String} ()
@@ -329,7 +326,7 @@ function tograph(ag::AliasGraph, var_to_diff::DiffGraph)
329
326
add_edge! (g, v, dv)
330
327
add_edge! (g, dv, v)
331
328
end
332
- g, zero_vars_set , edge_styles
329
+ g, eqg, zero_vars , edge_styles
333
330
end
334
331
335
332
using Graphs. Experimental. Traversals
@@ -794,7 +791,7 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
794
791
updated_diff_vars = Int[]
795
792
diff_to_var = invview (var_to_diff)
796
793
processed = falses (nvars)
797
- g, zero_vars_set = tograph (ag, var_to_diff)
794
+ g, eqg, zero_vars = tograph (ag, var_to_diff)
798
795
dls = DiffLevelState (g, var_to_diff)
799
796
is_diff_edge = let var_to_diff = var_to_diff
800
797
(v, w) -> var_to_diff[v] == w || var_to_diff[w] == v
@@ -810,6 +807,7 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
810
807
callback = Base. Fix1 (push!, level_to_var))
811
808
nlevels = length (level_to_var)
812
809
prev_r = - 1
810
+ stem = Int[]
813
811
for _ in 1 : 10_000 # just to make sure that we don't stuck in an infinite loop
814
812
reach₌ = Pair{Int, Int}[]
815
813
r === nothing || for n in neighbors (g, r)
@@ -841,17 +839,27 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
841
839
end
842
840
for (c, v) in reach₌
843
841
v == prev_r && continue
842
+ add_edge! (eqg, v, prev_r)
843
+ push! (stem, prev_r)
844
844
dag[v] = c => prev_r
845
845
end
846
846
push! (diff_aliases, reach₌)
847
847
end
848
- for v in zero_vars_set
849
- dag[v] = 0
848
+ @info " " fullvars[stem]
849
+ transitiveclosure! (eqg)
850
+ for i in 1 : length (stem) - 1
851
+ r, dr = stem[i], stem[i+ 1 ]
852
+ if has_edge (eqg, r, dr)
853
+ c = 1
854
+ dag[dr] = c => r
855
+ end
856
+ end
857
+ for v in zero_vars, a in outneighbors (g, v)
858
+ dag[a] = 0
850
859
end
851
860
@show nlevels
852
861
display (diff_aliases)
853
862
@assert length (diff_aliases) == nlevels
854
- @show zero_vars_set
855
863
856
864
# clean up
857
865
for v in dls. visited
@@ -861,6 +869,9 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
861
869
empty! (dls. visited)
862
870
empty! (diff_aliases)
863
871
end
872
+ for k in keys (dag)
873
+ dag[k]
874
+ end
864
875
@show dag
865
876
866
877
#=
@@ -1010,7 +1021,7 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
1010
1021
push! (removed_aliases, a)
1011
1022
end
1012
1023
for (v, (c, a)) in ag
1013
- (processed[v] || processed[a]) && continue
1024
+ (processed[v] || ( ! iszero (a) && processed[a]) ) && continue
1014
1025
v in removed_aliases && continue
1015
1026
freshag[v] = c => a
1016
1027
end
0 commit comments