Skip to content

Commit bf725f1

Browse files
committed
gf.c: make edge de-duplication a caller responsibility
On my system, this saves ~500 ms when loading CairoMakie (and all dependent packages)
1 parent 5c66152 commit bf725f1

File tree

1 file changed

+1
-28
lines changed

1 file changed

+1
-28
lines changed

src/gf.c

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1997,7 +1997,6 @@ JL_DLLEXPORT void jl_method_instance_add_backedge(jl_method_instance_t *callee,
19971997
assert(invokesig == NULL || jl_is_type(invokesig));
19981998
JL_LOCK(&callee->def.method->writelock);
19991999
if (jl_atomic_load_relaxed(&allow_new_worlds)) {
2000-
int found = 0;
20012000
jl_array_t *backedges = jl_mi_get_backedges(callee);
20022001
// TODO: use jl_cache_type_(invokesig) like cache_method does to save memory
20032002
if (!backedges) {
@@ -2006,25 +2005,7 @@ JL_DLLEXPORT void jl_method_instance_add_backedge(jl_method_instance_t *callee,
20062005
callee->backedges = backedges;
20072006
jl_gc_wb(callee, backedges);
20082007
}
2009-
else {
2010-
size_t i = 0, l = jl_array_nrows(backedges);
2011-
for (i = 0; i < l; i++) {
2012-
// optimized version of while (i < l) i = get_next_edge(callee->backedges, i, &invokeTypes, &mi);
2013-
jl_value_t *ciedge = jl_array_ptr_ref(backedges, i);
2014-
if (ciedge != (jl_value_t*)caller)
2015-
continue;
2016-
jl_value_t *invokeTypes = i > 0 ? jl_array_ptr_ref(backedges, i - 1) : NULL;
2017-
if (invokeTypes && jl_is_code_instance(invokeTypes))
2018-
invokeTypes = NULL;
2019-
if ((invokesig == NULL && invokeTypes == NULL) ||
2020-
(invokesig && invokeTypes && jl_types_equal(invokesig, invokeTypes))) {
2021-
found = 1;
2022-
break;
2023-
}
2024-
}
2025-
}
2026-
if (!found)
2027-
push_edge(backedges, invokesig, caller);
2008+
push_edge(backedges, invokesig, caller);
20282009
}
20292010
JL_UNLOCK(&callee->def.method->writelock);
20302011
}
@@ -2047,14 +2028,6 @@ JL_DLLEXPORT void jl_method_table_add_backedge(jl_methtable_t *mt, jl_value_t *t
20472028
else {
20482029
// check if the edge is already present and avoid adding a duplicate
20492030
size_t i, l = jl_array_nrows(mt->backedges);
2050-
for (i = 1; i < l; i += 2) {
2051-
if (jl_array_ptr_ref(mt->backedges, i) == (jl_value_t*)caller) {
2052-
if (jl_types_equal(jl_array_ptr_ref(mt->backedges, i - 1), typ)) {
2053-
JL_UNLOCK(&mt->writelock);
2054-
return;
2055-
}
2056-
}
2057-
}
20582031
// reuse an already cached instance of this type, if possible
20592032
// TODO: use jl_cache_type_(tt) like cache_method does, instead of this linear scan?
20602033
for (i = 1; i < l; i += 2) {

0 commit comments

Comments
 (0)