@@ -5887,13 +5887,19 @@ defmodule Module.Types.Descr do
58875887 end
58885888 end
58895889
5890- defp bdd_difference ( bdd1 , bdd2 , leaf_compare ) when is_tuple ( bdd1 ) and is_tuple ( bdd2 ) do
5891- bdd_difference ( bdd_expand ( bdd1 ) , bdd_expand ( bdd2 ) , bdd1 , bdd2 , leaf_compare )
5892- end
5890+ # We could use bdd_expand but there was a bug in earlier versions
5891+ # of the Erlang compiler which would emit bad ,code, so we match one by one.
5892+ defp bdd_difference ( { _ , _ , _ , _ } = bdd1 , bdd_leaf ( _ , _ ) = a2 , leaf_compare ) ,
5893+ do: bdd_difference ( bdd1 , { a2 , :bdd_top , :bdd_bot , :bdd_bot } , bdd1 , a2 , leaf_compare )
58935894
5894- defp bdd_difference ( bdd1 , bdd2 , _leaf_compare ) do
5895- bdd_difference ( bdd1 , bdd2 )
5896- end
5895+ defp bdd_difference ( bdd_leaf ( _ , _ ) = a1 , { _ , _ , _ , _ } = bdd2 , leaf_compare ) ,
5896+ do: bdd_difference ( { a1 , :bdd_top , :bdd_bot , :bdd_bot } , bdd2 , a1 , bdd2 , leaf_compare )
5897+
5898+ defp bdd_difference ( { _ , _ , _ , _ } = bdd1 , { _ , _ , _ , _ } = bdd2 , leaf_compare ) ,
5899+ do: bdd_difference ( bdd1 , bdd2 , bdd1 , bdd2 , leaf_compare )
5900+
5901+ defp bdd_difference ( bdd1 , bdd2 , _leaf_compare ) ,
5902+ do: bdd_difference ( bdd1 , bdd2 )
58975903
58985904 # We have two formulas for differences.
58995905 #
0 commit comments