@@ -2140,12 +2140,12 @@ defmodule Module.Types.Descr do
21402140 else: bdd_leaf ( list1 , difference ( last1 , last2 ) )
21412141
21422142 true ->
2143- bdd_difference ( bdd1 , bdd2 , & list_leaf_intersection / 2 , nil )
2143+ bdd_difference ( bdd1 , bdd2 )
21442144 end
21452145 end
21462146
21472147 defp list_difference ( bdd1 , bdd2 ) ,
2148- do: bdd_difference ( bdd1 , bdd2 , & list_leaf_intersection / 2 , nil )
2148+ do: bdd_difference ( bdd1 , bdd2 )
21492149
21502150 defp list_empty? ( @ non_empty_list_top ) , do: false
21512151
@@ -2754,13 +2754,13 @@ defmodule Module.Types.Descr do
27542754 bdd_leaf ( tag , Map . replace! ( fields , diff_key , difference ( type1 , type2 ) ) )
27552755
27562756 _ ->
2757- bdd_difference ( map1 , map2 , & map_leaf_intersection / 2 , & map_leaf_disjoint? / 2 )
2757+ bdd_difference ( map1 , map2 , & map_leaf_disjoint? / 2 )
27582758 end
27592759 end
27602760 end
27612761
27622762 defp map_difference ( bdd1 , bdd2 ) ,
2763- do: bdd_difference ( bdd1 , bdd2 , & map_leaf_intersection / 2 , & map_leaf_disjoint? / 2 )
2763+ do: bdd_difference ( bdd1 , bdd2 , & map_leaf_disjoint? / 2 )
27642764
27652765 defp map_leaf_disjoint? ( bdd_leaf ( _tag1 , fields1 ) , bdd_leaf ( _tag2 , fields2 ) ) do
27662766 disjoint_structs? ( fields1 , fields2 )
@@ -4308,7 +4308,7 @@ defmodule Module.Types.Descr do
43084308 end
43094309
43104310 defp tuple_difference ( bdd1 , bdd2 ) ,
4311- do: bdd_difference ( bdd1 , bdd2 , & tuple_leaf_intersection / 2 , & tuple_leaf_disjoint? / 2 )
4311+ do: bdd_difference ( bdd1 , bdd2 , & tuple_leaf_disjoint? / 2 )
43124312
43134313 defp tuple_leaf_disjoint? ( bdd_leaf ( tag1 , elements1 ) , bdd_leaf ( tag2 , elements2 ) ) do
43144314 mismatched_tuple_sizes? ( tag1 , elements1 , tag2 , elements2 ) or
@@ -5125,27 +5125,21 @@ defmodule Module.Types.Descr do
51255125 #
51265126 # ## When D2 != :bottom
51275127 #
5128- # We rewrite it to use the same optimization as bdd_leaf_intersection:
5128+ # We could rewrite it to use the same optimization as bdd_leaf_intersection.
5129+ # However, given differences of negations are not common and because
5130+ # bdd_leaf_intersection can be expensive for open maps, we skip this step for now.
51295131 #
51305132 # (B1) and not (B2)
51315133 # (B1) and not (B2_no_D2 or (not a2 and D2))
51325134 # (B1) and (not B2_no_D2 and (a2 or not D2))
51335135 # (B1) and (a2 or not D2) and not B2_no_D2
51345136 # ((B1 and a2) or (B1 and not D2)) and not B2_no_D2
51355137
5136- defp bdd_difference ( bdd , { leaf , c , u , d } , leaf_intersection , leaf_disjoint )
5137- when d != :bdd_bot do
5138- bdd_leaf_intersection ( leaf , bdd , leaf_intersection )
5139- |> bdd_union ( bdd_difference ( bdd , d , leaf_intersection , leaf_disjoint ) )
5140- |> bdd_difference ( { leaf , c , u , :bdd_bot } , leaf_intersection , leaf_disjoint )
5141- end
5142-
5143- defp bdd_difference ( bdd1 , bdd2 , _leaf_intersection , leaf_disjoint )
5144- when leaf_disjoint == nil do
5138+ defp bdd_difference ( bdd1 , { _ , _ , _ , d } = bdd2 , _leaf_disjoint ) when d != :bdd_bot do
51455139 bdd_difference ( bdd1 , bdd2 )
51465140 end
51475141
5148- defp bdd_difference ( bdd_leaf ( _ , _ ) = bdd1 , bdd2 , _leaf_intersection , leaf_disjoint )
5142+ defp bdd_difference ( bdd_leaf ( _ , _ ) = bdd1 , bdd2 , leaf_disjoint )
51495143 when is_tuple ( bdd2 ) do
51505144 { leaf , _ , u , :bdd_bot } = bdd_expand ( bdd2 )
51515145
@@ -5156,22 +5150,21 @@ defmodule Module.Types.Descr do
51565150 end
51575151 end
51585152
5159- defp bdd_difference ( { a1 , c1 , u1 , d1 } = bdd1 , bdd2 , leaf_intersection , leaf_disjoint )
5153+ defp bdd_difference ( { a1 , c1 , u1 , d1 } = bdd1 , bdd2 , leaf_disjoint )
51605154 when is_tuple ( bdd2 ) do
51615155 { a2 , _c2 , u2 , :bdd_bot } = bdd_expand ( bdd2 )
51625156
51635157 case leaf_disjoint . ( a1 , a2 ) do
51645158 true ->
5165- { a1 , bdd_difference ( c1 , u2 , leaf_intersection , leaf_disjoint ) ,
5166- bdd_difference ( u1 , bdd2 , leaf_intersection , leaf_disjoint ) ,
5167- bdd_difference ( d1 , bdd2 , leaf_intersection , leaf_disjoint ) }
5159+ { a1 , bdd_difference ( c1 , u2 , leaf_disjoint ) , bdd_difference ( u1 , bdd2 , leaf_disjoint ) ,
5160+ bdd_difference ( d1 , bdd2 , leaf_disjoint ) }
51685161
51695162 false ->
51705163 bdd_difference ( bdd1 , bdd2 )
51715164 end
51725165 end
51735166
5174- defp bdd_difference ( bdd1 , bdd2 , _leaf_intersection , _leaf_disjoint ) do
5167+ defp bdd_difference ( bdd1 , bdd2 , _leaf_disjoint ) do
51755168 bdd_difference ( bdd1 , bdd2 )
51765169 end
51775170
0 commit comments