Skip to content

Commit b2cb6a3

Browse files
committed
typeintersect: reduce unneeded allocations from merge_env
`merge_env` and `final_merge_env` could be skipped for emptiness test or if we know there's only 1 valid Union state.
1 parent b9d9b69 commit b2cb6a3

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

src/subtype.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4138,19 +4138,30 @@ static jl_value_t *intersect_all(jl_value_t *x, jl_value_t *y, jl_stenv_t *e)
41384138
save_env(e, &se, 1);
41394139
int niter = 0, total_iter = 0;
41404140
is[0] = intersect(x, y, e, 0); // root
4141-
if (is[0] != jl_bottom_type)
4141+
if (is[0] == jl_bottom_type) {
4142+
restore_env(e, &se, 1);
4143+
}
4144+
else if (!e->emptiness_only && has_next_union_state(e, 1)) {
41424145
niter = merge_env(e, &me, &se, niter);
4143-
restore_env(e, &se, 1);
4146+
restore_env(e, &se, 1);
4147+
}
41444148
while (next_union_state(e, 1)) {
41454149
if (e->emptiness_only && is[0] != jl_bottom_type)
41464150
break;
41474151
e->Runions.depth = 0;
41484152
e->Runions.more = 0;
41494153

41504154
is[1] = intersect(x, y, e, 0);
4151-
if (is[1] != jl_bottom_type)
4155+
if (is[1] == jl_bottom_type) {
4156+
restore_env(e, &se, 1);
4157+
}
4158+
else if (niter > 0 || (!e->emptiness_only && has_next_union_state(e, 1))) {
41524159
niter = merge_env(e, &me, &se, niter);
4153-
restore_env(e, &se, 1);
4160+
restore_env(e, &se, 1);
4161+
}
4162+
else {
4163+
assert(is[0] == jl_bottom_type);
4164+
}
41544165
if (is[0] == jl_bottom_type)
41554166
is[0] = is[1];
41564167
else if (is[1] != jl_bottom_type) {

0 commit comments

Comments
 (0)