Skip to content

Commit fd6c6af

Browse files
committed
Simplify bdd_difference code to discard differences of negations
1 parent a9a0969 commit fd6c6af

1 file changed

Lines changed: 14 additions & 21 deletions

File tree

lib/elixir/lib/module/types/descr.ex

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)