Skip to content

Commit 280f999

Browse files
committed
Enable seperatable subtyping for equality check.
1 parent bd1a664 commit 280f999

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

src/subtype.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1569,6 +1569,10 @@ static int local_forall_exists_subtype(jl_value_t *x, jl_value_t *y, jl_stenv_t
15691569
{
15701570
int16_t oldRmore = e->Runions.more;
15711571
int sub;
1572+
int kindx = !jl_has_free_typevars(x);
1573+
int kindy = !jl_has_free_typevars(y);
1574+
if (kindx && kindy)
1575+
return jl_subtype(x, y);
15721576
if (may_contain_union_decision(y, e, NULL) && pick_union_decision(e, 1) == 0) {
15731577
jl_saved_unionstate_t oldRunions; push_unionstate(&oldRunions, &e->Runions);
15741578
e->Lunions.used = e->Runions.used = 0;
@@ -1581,6 +1585,8 @@ static int local_forall_exists_subtype(jl_value_t *x, jl_value_t *y, jl_stenv_t
15811585
// Once limit_slow == 1, also skip it if
15821586
// 1) `forall_exists_subtype` return false
15831587
// 2) the left `Union` looks big
1588+
if (limit_slow == -1)
1589+
limit_slow = kindx || kindy;
15841590
if (noRmore || (limit_slow && (count > 3 || !sub)))
15851591
e->Runions.more = oldRmore;
15861592
}
@@ -1630,8 +1636,7 @@ static int forall_exists_equal(jl_value_t *x, jl_value_t *y, jl_stenv_t *e)
16301636

16311637
jl_saved_unionstate_t oldLunions; push_unionstate(&oldLunions, &e->Lunions);
16321638

1633-
int limit_slow = !jl_has_free_typevars(x) || !jl_has_free_typevars(y);
1634-
int sub = local_forall_exists_subtype(x, y, e, 2, limit_slow);
1639+
int sub = local_forall_exists_subtype(x, y, e, 2, -1);
16351640
if (sub) {
16361641
flip_offset(e);
16371642
sub = local_forall_exists_subtype(y, x, e, 0, 0);

0 commit comments

Comments
 (0)